操作系统--进程的互斥与同步
操作系统--进程的互斥与同步
进程互斥
竞争资源(临界资源)
-
当并发进程竞争使用同一资源时,他们之间就会发生冲突。如果操作系统将资源分配给其中的某一个进程使用,另一个进程就必须等待,直到申请的资源可用时,由操作系统分配给他们。
-
如果竞争资源的进程太多,这些进程还必须等待在一个队列中,如就绪队列,阻塞队列等。
-
一种极端的情况是,被阻塞进程永远得不到申请的资源,而死锁。
采用互斥方式,使用临界资源
资源的互斥,进程使用上述这类资源的时候,只能有一个进程对资源进行处理。下面是临界区的使用图和注解。
进程同步
进程同步和互斥的解决方法
互斥与同步的解决方法--软件方法
控制p0,p1互斥的进入临界区。
while循环为进入区应该做的事情。当不符合条件的时候,进行do{nothing}操作。
使用软件解决方法,有一个公认的比较好的算法,为Dekker算法。下面是Dekker算法介绍。
Dekker算法介绍:
上面是Dekker算法的伪代码,还有p0进程的执行流程图。
互斥与同步的解决方法--硬件方法
硬件方法包括屏蔽中断和专用机器指令。
屏蔽中断:
由于进程切换需要依赖中断来实现,如果屏蔽中断,则不会出现进程切换。
因此,为了实现对临界资源的互斥使用,可以在进程进入临界区之前,屏蔽中断。当进程退出临界区时,打开系统中断。这样就实现了同步和互斥的问题的解决。
专用机器指令:
(指令系统是计算机硬件的语言系统,也叫机器语言)
利用一些专用机器指令也能实现互斥,机器指令在一个指令周期内执行,不会受到其他指令的干扰,也不会被中断。
下面就是一个使用机器指令的例子:
(左边为机器指令方法,右边为实现代码)
互斥与同步的解决方法--信号量
信号量方法,就是用一个信号量来控制进程之间的使用。(就像是交通中的红路灯(信号量)与汽车之间的关系和作用)
信号量的类型(count):
互斥信号量:用于申请或者释放资源的使用权,常初始化为1.
资源信号量:用于申请或者归还资源,可以初始化为大于1的正整数,表示系统中可用资源的个数。(比如说,我有多个显示屏,那么就可以使用count表示显示屏的个数。)
信号量的操作:wait和signal(操作系统中,用系统调用的形式来提供wait和signal原语)
s.conut为为信号量
wait为申请资源 (优先于signal)
signal为释放资源 (滞后于wait)
下面是wait,signal操作的伪代码:
信号量的使用例子:
根据上面的信号量,我们可以总结出信号量的物理意义:
互斥与同步的解决方法--管程
管程是一种在程序设计级控制进程互斥与同步的机制,具有信号量的功能,且更容易使用和控制。
管城只要用于面向对象程序设计。
消息传递同步操作原语:
两个进程之间的通讯,需要一些操作。我们使用操作系统提供的原语来完成这些操作。
send原语:发送消息
receive原语:接受消息,如果没有消息可以接受,那么则等待。
常用的进程通讯:
-
基于共享存储区的方法
-
邮箱的方式
分别介绍:
基于共享存储区的方式:
通讯的双方是基于共享存储区来通讯的。这个共享数据区属于每个相互通讯的进程的组成部分。然后通讯之间向里面存储数据,提取数据。
邮箱方式:
只要保证邮箱中,只有一个消息,那么就可以实现消息之间的互斥这样,就保证了进程之间的互斥。