操作系统(四)—— 进程同步与互斥

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alexshi5/article/details/88536706

一、进程间相互作用

1、相关进程和无关进程

        在一个多道程序系统中同时运行的并发进程通常有多个,在逻辑上具有某种联系的进程被称为相关进程,在逻辑上没有任何联系的进程被称为无关进程,并发进程相互之间可能是无关的,也可能是相关的。

        如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,即它们是各自独立的,则说这些并发进程的相互之间是无关的。

        如果一个进程的执行依赖其他进程的进展情况,或者说,一个进程的执行可能影响其他进程的执行结果,则说这些并发进程是相关的。

2、与时间有关的错误

         进程执行的速度是不能由进程自身来控制的,对于相关进程来说,可能有若干并发进程同时使用共享资源,即一个进程一次使用未结束,另一进程也开始使用,形成交替使用共享资源。在这种情况下,使得程序的计算结果与并发程序的执行速度有关,这种随执行速度的不同而可能出现的错误,被称为“与时间有关的错误”。

二、进程的同步与互斥

1、进程的同步

        进程的同步是指进程之间的一种直接的协同工作关系,一些进程相互合作,共同完成一项任务。进程之间的同步也是进程间的一种直接制约关系,一个进程的执行依赖另一个进程的消息,当一个进程执行到某一点时,必须得到另一个进程发来的消息,有没有得到另一个进程的消息时该进程应该等待,直到消息到达才被唤醒,继续进程的执行。

2、进程的互斥

        在系统中,许多进程常常需要共享资源,而这些资源往往要求排他性的使用,即一次只能为一个进程服务。因此,各进程只能互斥使用这些资源,进程之间的这种关系就是进程的互斥。

3、临界区

        若在系统中的某些资源一次只允许一个进程使用,则这类资源称为临界资源或共享变量,而在进程中访问临界资源的程序称为临界区。

        如果有若干进程共享某一临界区,则该临界区称为相关临界区。当一个进程在相关临界区执行时,如果不让另一个进程进入相关的临界区执行,就不会形成多个进程对相同的共享变量交叉访问,于是就可避免出现与时间有关的错误。只要涉及相同变量的若干进程的相关临界区互斥执行,就不会造成与时间有关的错误。

        系统对相关临界区的调度使用原则如下:

① 当临界区为空时,若有一个进程要求进入临界区,应允许它立即进入临界区——有空让进;

② 若有一个进程已在临界区时,其他要求进入临界区的进程必须等待——无空等待;

③ 当没有进程在临界区,而同时有多个进程要求进入临界区,只能让其中之一进入临界区,其他进程必须等待——多中择一;

④ 任一进程进入临界区的要求应在有限时间满足——有限等待;

⑤ 处于等待状态的进程应放弃占用处理器——让权等待。

三、信号量及PV操作以及经典的进程同步问题

可参考一:进程同步之信号量机制(pv操作)及三个经典同步问题

可参考二:使用Java来示例PV操作

四、管程

可参考:管程机制浅析

五、进程通信

        解决进程之间大量信息通信的问题有三种方案:共享内存、消息机制以及通过共享文件进行通信,即管道通信。

1、共享内存

        它是在相互通信的进程之间设一个公共内存区,一组进程向该公共内存中写,另一组进程从公共内存中读,通过这种方式实现两组进程间的信息交换。

2、消息机制

        它是进程通过某种手段发出自己的消息或接收其他进程发来的消息。

(1) 消息缓冲通信

        它是根据“生产者——消费者”的原理,利用内存中公共消息缓冲区实现进程之间的信息交换。

        内存中开辟了若干消息缓冲区,用以存储消息。每当一个进程向另一个进程发送消息时,便申请一个消息缓冲区,并把已准备好的消息送到缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程。接收进程收到发送进程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出所需要的信息,然后把消息缓冲区还给系统。

        消息缓冲区通信机制包含以下内容:

① 消息缓冲区,它是由消息长度、消息正文、发送者、消息队列指针组成的数据结构;

② 消息队列首指针m_q,一般保存在PCB中;

③ 互斥信号量m_mutex,初始值为1,在PCB中设置;

④ 同步信号量m_syn,初始值为0,用于消息计数,在PCB中设置;

⑤ 发送消息原语;

⑥ 接收消息原语。

(2) 信箱通信

        当一个进程希望与另一个进程通信时,就创建一个链接两个进程的信箱,发送进程把信件投入信箱,而接收进程可以在任何时刻取走信件。

        一个信箱可以由“信箱说明”和“信箱体”两部分组成。

        信箱说明一般有以下数据结构:

① 可存信件数,表明信箱的容量大小;

② 已有信件数,指出信箱中已有的信件数量;

③ 可存信件的指针,指示当前可存入一封信的位置,初始值指向第一封信的位置。

3、管道通信

        管道就是连接两个进程之间的一个打开的共享文件,专用于进程之间进行数据通信。发送进程可以源源不断地从管道一端写入数据流,每次写入的信息长度是可变的;接收进程在需要时可以从管道的另一端读出数据,读出单位长度也是可变的。管道通信的基础是文件系统。

猜你喜欢

转载自blog.csdn.net/Alexshi5/article/details/88536706