【操作系统复习】进程同步互斥 实现互斥的方法
创始人
2024-06-03 10:43:41
0

这里写目录标题

  • 进程同步互斥
    • 互斥
      • 进程互斥软件实现方法
        • 单标志法
        • 双标志先检查法
        • 双标志后检查法
        • peterson算法
      • 进程互斥硬件实现方式
        • TSL指令
        • swap指令

进程同步互斥

  • 为什么要进程同步互斥
    因为进程运行状态是不确定的,进程运行到哪一个位置是不可预知的。如果两个进程需要访问一个临界资源,就需要互斥访问,也就是只有一个进程可以访问,其他进程不允许访问。
    还有可能两个进程需要协同处理一个问题,那么可能A进程处理完毕某个过程,B才能再处理,就需要同步,等A做完B再做

互斥

一个进程访问临界资源,其他进程就需要等待。
对临界资源互斥访问大体上分为四个部分:

  • 进入区:检查是否可以进入临界区
  • 临界区:访问临界资源的代码
  • 退出区
  • 剩余区

保证互斥访问需要遵循以下原则:

  • 空闲让进:临界资源能用就用
  • 忙则等待:临界资源不能用就不用
  • 有限等待:在可以预知的时间内得到临界资源
  • 让权等待:在不能获得临界资源时候放弃CPU

进程互斥软件实现方法

单标志法

算法思想:利用一个标记,表示当前允许进入临界区的进程号

int turn = 0;
//p0
while (turn != 0);
critical section;
turn = 1;
remainder section;//p1
while (turn != 1);
critical section
turn = 0;
remainder section;

只能轮流使用,如果只有一个进程,那么此时就无法再进行下去,违反空闲让进原则。

双标志先检查法

算法思想:设置一个布尔型数组,用于标记各个进程想要进入临界区的意愿。

bool flag[2];
flag[0] = false;
flag[0] = false;//p0
while (flag[1]);
flag[0] = true;
critical section;
falg[0] = false;
remainder section;//p1
while (flag[0]);
flag[1] = true;
critical section;
falg[1] = false;
remainder section;

问题:在并发运行的环境下,可能两个都进入了while循环,违背了忙则等待原则。

双标志后检查法

与先检查类似,只是先表明意愿,再看别人用不用

bool flag[2];
flag[0] = false;
flag[0] = false;//p0
flag[0] = true;
while (flag[1]);
critical section;
falg[0] = false;
remainder section;//p1
flag[1] = true;
while (flag[0]);
critical section;
falg[1] = false;
remainder section;

问题:在并发条件下,可能两个进程都设置了true,不会产生忙则等待,但是违背空闲让进与有限等待。

peterson算法

算法:先表明自己想要用临界资源,但是也表示可以让对方先用。

bool flag[2];
int turn = 0;//p0
flag[0] = true;
turn = 1;
while (flag[1] && turn == 1);
critical section;
flag[0] = false;
remainder section;//p1
flag[1] = true;
turn = 0;
while (flag[0] && turn == 0);
critical section;
flag[1] = false;
remainder section;

原理解析,就算在并发条件下,A表明自己想用,B也想用,但是只要是最后一个人说出他想让对方先用,那么决定权就放弃给对方。同时放权这个动作只会进行一次,此时对方不会再进行放权这个动作,就会直接进行访问临界区。所以不会有同时访问临界区的问题。
满足空闲让进,忙则等待,有限等待,但是依旧不满足放权等待。

进程互斥硬件实现方式

本质思想:让表明自己想用与进入临界区那个while循环检查合二为一,就不会出现同时进入临界区这个问题。那么就需要让硬件直接实现让这两句话实现原子性。

TSL指令

由硬件直接实现,执行过程不被中断。

bool TestAndSet (bool *lock){		//硬件直接实现,函数只是说明硬件执行逻辑bool old;old = *lock;*lock = true;return old;
}while (TestAndSet(&lock));

swap指令

跟tsl差不多

Swap (bool *a, bool *b){		//硬件直接实现,保证原子性bool tmp;temp = *a;*a = *b;*b = tmp;
}bool old = true;
while (old == true)Swap(&lock, &old);
critical section;

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...