操作系统--进程的互斥与同步

进程互斥

进程互斥:在多个程序中,有两个进程不可以同时进行(例如读,写操作)。
 

竞争资源(临界资源)

  • 当并发进程竞争使用同一资源时,他们之间就会发生冲突。如果操作系统将资源分配给其中的某一个进程使用,另一个进程就必须等待,直到申请的资源可用时,由操作系统分配给他们。

  • 如果竞争资源的进程太多,这些进程还必须等待在一个队列中,如就绪队列,阻塞队列等。

  • 一种极端的情况是,被阻塞进程永远得不到申请的资源,而死锁。

采用互斥方式,使用临界资源

资源的互斥,进程使用上述这类资源的时候,只能有一个进程对资源进行处理。下面是临界区的使用图和注解。

                                           

进程同步

多个进程常常需要共同修改某些共享变量,表格,文件数据库等,协作完成一些功能。这个时候,就需要用到进程之间的同步。
我们把异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。
 
 

进程同步和互斥的解决方法

互斥与同步的解决方法--软件方法

控制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原语:接受消息,如果没有消息可以接受,那么则等待。

常用的进程通讯

  1. 基于共享存储区的方法

  2. 邮箱的方式

分别介绍:

基于共享存储区的方式:

通讯的双方是基于共享存储区来通讯的。这个共享数据区属于每个相互通讯的进程的组成部分。然后通讯之间向里面存储数据,提取数据。


邮箱方式: 

只要保证邮箱中,只有一个消息,那么就可以实现消息之间的互斥这样,就保证了进程之间的互斥。

原文地址:https://www.cnblogs.com/huangwentian/p/7487696.html