操作系统(四)

四、进程同步与通信

4.1 进程间的相互作用

4.1.1进程间的联系

  • 进程间的联系

    • 资源共享关系
    • 相互合作关系
  • 临界资源
    • 一种供多个进程互斥访问的资源 同一时刻只允许一个进程访问的资源叫临界资源
  • 临界区 每个进程中访问临界资源的那段代码称为临界区(critical section)
  • 同步机制应遵循的准则
    • 空闲让进
    • 忙则等待
    • 有限等待
    • 让权等待
  • 解决进程互斥问题:

    4.1.2 软件方法:

    完全使用软件的方法 解决此问题有一定难度并且有很大的局限性。

    4.1.3 硬件方法:

    4.1.4 信号量机制

    • 对信号量的操作:信号量机制是一种非常有效的进程同步工具

      • 1.记录型信号量机制

        • 记录型数据结构描述

        •    typedef struct {int value;  //代表资源数list of process *L;  //进程链表L,用于链接所有等待该信号量代表资源的进程}  semaphore;
          

        • 对信号量的操作:
          信号量除初始化外,仅能通过两个标准的原子操作wait(s)和signal(s)来访问。这两个操作很长时间以来被称为P、V操作。

        • 信号量的物理含义:

          • S.value>0时 S.value表示可使用的资源数或表示可使用资源的进程数;
          • S.value=0时 S.value表示无资源可供使用或表示不允许进程得到该资源;
          • S.value<0时 S.value表示等待使用资源的进程个数或表示等待该资源的进程个数。
        • wait原语:申请一个资源,得到就继续,得不到就阻塞

            void  wait (static  semaphore  s){s.value - -;if (s.value<0)   block(s.L);}
          
        • singal原语: 释放一个资源,有进程等待则唤醒一个

           void signal ( static  semaphore  s){s.value++;if (s.value <= 0)  wackup(s.L);}
          
        • 利用信号量实现进程互斥的过程描述
          为使多个进程互斥地访问某个临界资源,只需为该资源设置一个信号量,并设其初始值为1。此信号量可称为“互斥信号量”。

          进程1,进程2 同时执行,并不存在顺序关系。

    • 2.信号量集机制

      • AND型信号量集机制
        .引入:
        假定现有两个进程P和Q,它们都要求同时访问共享数据A和B。共享数据都应作为临界资源,为此,可为这两个数据分别设置用于互斥的信号量Amutex和Bmutex,并令它们的初值为1(表示可以被访问)。这时容易产生死锁的情况。
        对若干个临界资源的分配采取原子操作方式,要么全部分配到进程,要么一个也不分配,这称为AND同步,可以通过信号量集机制实现(Swait,Ssignal)。

        • Swait操作:

             Swait(S1, S2, … , Sn){  if (S1≥1&&…&&Sn≥1)for (i=1;  i<=n;  i++)     Si -- ;else  {阻塞该进程,并将其插入到 等待资源Si的阻塞队列中;将程序计数器PC重新指向Swait 操作的第一条语句。}}
          
        • Ssignal操作:

          Ssignal (S1, S2, … , Sn)
          {for (i=1; i<=n; i++){Si++;将所有等待Si资源的进程唤醒;}
          }
          
      • 一般“信号量集”机制
        一次分配多个某种资源,且当该资源数量少于一定值时,不予分配。因此,在每次分配之前都必须测试该资源的数量是否大于测试值t

        • Swait操作

           Swait(S1,t1,d1, S2,t2,d2, … , Sn,tn,dn){if (S1>=t1 && … && Sn>=tn)for (i=1;i<=n;i++)         Si=Si-di; else   {阻塞该进程,并将其插入到等待资源Si的阻塞队列中;将程序计数器PC重新指向Swait 操作的第一条语句。}
          }
          
        • Ssignal操作

             Ssignal(S1,t1,d1, S2,t2,d2, … , Sn,tn,dn){     for (i=1;i<=n;i++){      Si=Si+di;唤醒所有等待资源 Si的进程;}}
          

4.1.5 经典进程同步问题

  • 用信号量实现互斥:


黄色部分是循环使用互斥临界区的使用,标准写法:
1.进入区 申请资源
2. 临界区 使用临界区
3.退出区 释放资源
4.剩余区 退出临界区
注意:
- 实现互斥必须使 P操作-wait (mutex),V操作-signal(mutex) 成对出现
- mutex的变化:
- 初始状态:mutex:=1 表示没有并发进程使用临界区
- 一个进程申请成功 执行wait操作:mutex := 0
- 另一个进程也在申请 mutex:=-1; 则申请失败 而且此进程要进入阻塞队列
- 释放资源 mutex :=0 释放资源 并且从阻塞队列里找到想要使用资源的进程

  • 生产者-消费者问题–

    • 有一群生产者进程在生产产品,并将此产品提供给消费者进程去消费

    • 利用记录型信号量解决生产者-消费者问题 —整型数和链表

      初始的时候:full=0,empty=n

      semaphore mutex=1, empty=n, full=0;
      item buffer[n];
      int in=out=0;
      void producer(){while (1) {  …produce an item in nextp; //生产一个产品...wait(empty); //判断空缓冲区的个数 申请一个空缓冲区 empty-1wait(mutex); //护持信号量 判断缓冲池是否可用buffer[in]=nextp;//临界区 将下一个产品放入下标为in的数组in=(in+1) % n;//临界区 signal(mutex);//释放缓冲池signal(full);//将full+1}
      }
      void consumer() //消费者 保证安全取出数据
      {while (1)  {...wait(full);//申请一个full 缓冲区 wait(mutex); //申请缓冲池 判断有没有生产者在用nextc=buffer[out]; //取出 下标为OUT的 作为下一个消费品out=(out+1)%n;  //下标+1signal(mutex);  //退出区signal(empty); //释放一个空缓冲区...consume the item in nextc;  //消费…}}
      main(){ cobegin  {producer();consumer(); }}
      
    • 利用AND信号量解决生产者-消费者问题

         semaphore  mutex1=1,     mutex2=1, empty=n,full=0;item buffer[n];int in=out=0;void producer(){ while (1){    …produce an item in nextp;...Swait(empty, mutex1);buffer[in]=nextp;in=(in+1) mod n;Ssignal(mutex1, full);}}void consumer(){  while (1){   ...Swait(full, mutex2);nextc=buffer[out];out=(out+1) mod n;Ssignal(mutex2, empty);...consume the item in nextc;…}}main(){ cobegin  {producer();consumer(); }}
      
  • 哲学家进餐问题

    • 有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们共用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有五个碗和五支筷子。平时,哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐毕,放下筷子继续思考。

    • 利用记录型信号量解决哲学家进餐问题

            semaphore chopstick[5]={1,1,1,1,1};/筷子void process(int i){while (1)   {wait(chopstick[i]); //拿起左边的筷子 wait(chopstick[(i+1) mod 5]);//拿起右边的筷子 这里左右不分 临近的加一就可以了...eat;//吃饭...signal(chopstick[i]);signal(chopstick[(i+1) mod 5]); //释放筷子...think;}}
      

      • 几种解决办法:
        ①至多只允许四个哲学家同时请求进餐,以保证至少有一个哲学家能够真正进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。
        ②仅当哲学家的左、右两支筷子均可用时才允许他拿起筷子进餐。
        ③规定奇数号哲学家先拿他左边的筷子,然后再去拿他右边的筷子;而偶数号哲学家则相反。

      • 利用AND信号量机制解决哲学家进餐问题
        AND型信号量:宁可锦上添花,绝不雪中送炭**

          semaphore chopstick[5]={1,1,1,1,1};void process(int i){ while (1){ Swait(chopstick[(i+1) mod 5], chopstick[i]); //swit同时可以 奇数和偶数都满足才可以 采用原子操作...eat;Ssignal(chopstick[(i+1) mod 5], chopstick[i]);...think; }}main(){cobegin { process(0);process(1);process(2);process(3);process(4); }}
        
  • 读者写者问题

    • 所谓读者-写者问题(The Reader-Writer Problem)是只保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题

    • 利用记录型信号量解决第一类读者-写着问题

      • 这里变量作为临界资源

        semaphore rmutex=mutex=1;
        int readcount=0;
        void reader(int i)
        {
        while (1){  ...wait(rmutex);if (readcount==0)  wait(wmutex);//==0表示无reader进程在读 reader进程才需要执行PC操作等待信号量 若P操作成功 reader便去读readcount++;//readercount就是一个数signal(rmutex);//读完之后释放perform read operation;  ……wait(rmutex);readcount--;if(readcount==0)signal(wmutex);//当没有reader时可以执行writer操作signal(rmutex); ...  }
        }
        void writer(int j)
        {
        while (1){   ...wait(wmutex);perform write operation;signal(wmutex);...}} main(){cobegin {reader(1);…reader(n);writer(1);...writer(m);}}
        

4.1.6 管程机制

  • 管程的定义
    一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据.

  • 管程的组成

    • 局部于管程的共享变量说明
    • 对该数据结构进行操作的一组过程
    • 对局部于管程的数据设置初值的语句

4.2 进程通信

  • 基本概念

    • 进程通信是指进程之间的信息交换
    • 进程的互斥和同步可归结为低级通信
    • 高级通信是指用户可直接利用操作系统所提供的一组通信命令高效地传送大量数据的一种通信方式
      (通信量大,对用户透明)

4.2.1 进程通信的类型(高级通信机制)

  • 共享存储器系统

    • 基于共享数据结构的通信方式 (小,低级通信)
    • 基于共享存储区的通信方式 (大,高级通信)
  • 消息传递系统
    • 进程间的数据交换以消息为单位 (也叫报文
    • 4.2.2 直接通信方式

      • 直接通信方式是指发送进程利用操作系统所提供的发送命令直接把消息发送给目标进程。系统提供下述两条通信原语:

        send(receiver,message); //receiver 表示的是进程标识符
        receive(sender,message);

      • 利用直接进程通信原语来解决生产者-消费者问题

          void producer()
        {     while (1){    … produce an item in nextp;…send(consumer, nextp);  //发送}} void consumer(){  while (1){   …receive(producer, nextc); //接收…consume the item in nextc;}}main(){cobegin {producer();consumer();}}
        

      过程对用户透明了 由操作系统完成了

    • 间接通信方式 (信箱通信方式)
      • 所谓间接通信方式,是指进程之间的通信需要通过作为某种共享数据结构的实体,该实体用来暂存发送进程发送给目标进程的消息;接收进程则从该实体中取出对方发送给自己的消息。通常把这种中间实体称为信箱。
  • 管道通信
    • 所谓管道是指用于连接一个读进程和一个写进程以实现它们之间通信的共享文件(实质就是文件 文件系统放在外存上),又称为pipe文件
    • 为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力:互斥、同步、双方是否存在

4.2.3 消息缓冲队列通信机制

  • 在这种通信机制中,发送进程利用send原语将消息直接发送给接收进程;接收进程则利用receive原语接收消息.
  • 消息缓冲队列通信机制中的数据结构
    • 消息缓冲区

         struct  message_buffer{sender;     // 发送者进程标识符size;          // 消息长度text;          // 消息正文next;        // 指向下一个消息缓冲区的指针};
      
    • PCB中有关通信的数据项 在PCB中应增加的数据项可描述为

         struct  processcontrol_block{…mq;         // 消息队列队首指针mutex;             // 消息队列互斥信号量sm;         // 消息队列资源信号量…};
      

4.3 死锁

  • 所谓死锁是指在多道程序系统中,一组进程中的每一个进程均无限期地等待被该组中的另一个进程占有且永远不会释放的资源;这种现象称系统处于死锁状态,简称死锁。处于死锁状态的进程称为死锁进程.

  • 产生死锁的原因(有2个)

    • 由竞争资源引起死锁
      多个进程,共享资源,资源不足,竞争资源
      -竞争可剥夺性资源 :例如:CPU
      -竞争非剥夺性资源 :例如打印机,磁带机
      -竞争临时性资源
    • 进程推进顺序不当引起死锁
  • 产生死锁的四个必要条件:

    • 互斥调件
    • 请求和保持条件
    • 不剥夺条件
    • 环路等待条件
  • 解决死锁的基本方法

    • 预防死锁
      通过设置某些限制条件,以破坏产生死锁的四个必要条件中的一个或几个,来防止发生死锁。

      • 摒弃“请求和保持”条件 :系统要求所有进程一次性地申请其所需的全部资源
      • 摒弃“不剥夺”条件:一个已保持了某些资源的进程,若新的资源要求不能立即得到满足,它必须释放已保持的所有资源
      • 摒弃“环路等待”条件 将所有的资源按类型进行线性排队,并赋予不同的序号,所有进程对资源的请求,必须严格按资源序号递增的次序提出
    • 避免死锁
      在资源的动态分配过程中,使用某种方法去防止系统进入不安全状态,从而避免了死锁的发生。
      安全与不安全状态
      安全状态:系统能按某种进程顺序 来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。
      银行家算法!!!重要!!!

    • 基本思想

      • 银行的总资产是一定的,已经发放的贷款、客户还需要的贷款也是已知的;
      • 为保障银行不破产,每当一个客户申请贷款时,都进行检查,看看如果贷给他的话后面的业务能否顺利进行下去;
      • 如果能,就贷给他;否则,让他等着。
    • 银行家算法中的数据结构(假设有n个进程、m类资源)

      • 可利用资源向量Available
      • 最大需求矩阵Max
      • 分配矩阵Allocation
      • 需求矩阵Need
    • 银行家算法
      (1) 设Requesti是进程Pi的请求向量。如果Requesti[j]=k,表示进程Pi需要k个Rj类型的资源,要求:Requesti≤Needi &&Requesti≤Available
      (2)系统试探把要求的资源分配给进程Pi并修改下面数据结构中的数值:

                 Available=Available–Requesti;Allocationi=Allocationi+Requesti;Needi=Needi–Requesti;
      

      (3)系统执行安全性算法若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待,即:

         Available=Available+Requesti;Allocationi=Allocationi-Requesti;Needi=Needi+Requesti;
      
  • 安全性算法
    ① 设置并初始化两个向量:Work和Finish
    工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目;标志向量Finish,它表示系统是否有足够的资源分配给进程使之运行完成。

       初始化:Work = Available; Finish = 0;
    

② 从进程集合中找到一个能满足下述条件的进程

        Finish[i]==0 && Needi≤Work

如找到,则执行步骤③,否则执行步骤④。
③ 当进程Pi获得资源后,顺利执行,直至完成并释放出分配给它的资源,故应执行:

     Work=Work+Allocationi;Finish[i]=1;go to step 2;

④ 如果所有进程的Finish[i]==1,则表示系统处于安全状态,否则系统处于不安全状态。

检测死锁

检测死锁方法允许系统运行过程中发生死锁。但通过系统所设置的检测机构,可以及时检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中消除所发生的死锁

  • 解除死锁

    • 剥夺资源
    • 撤销进程

《操作系统第四版》(刘振鹏 王煜)(四)进程同步与通信相关推荐

  1. 《操作系统第四版》(刘振鹏 王煜)复习总结

    操作系统(一) 操作系统引论 用户接口与作业管理 进程和线程的概念 存储器管理 文件管理 设备管理 一.引论 1.1 操作系统的概念 1.1.1计算机系统 硬件系统+软件系统(程序和文件) 软件分为: ...

  2. 《操作系统第四版》(刘振鹏 王煜)(一)引论

    一.引论 1.1 操作系统的概念 1.1.1计算机系统 硬件系统+软件系统(程序和文件) 软件分为:系统软件(操作系统).支撑软件(数据库.编译程序).应用软件 1.1.2什么是操作系统 用户角度:是 ...

  3. 机器人导论(第四版)学习笔记——第四章

    机器人导论(第四版)学习笔记--第四章 4.1 引言 4.2 解的存在性 4.3 当n<6时操作臂子空间的描述 4.4 代数解法和几何解法 4.5 简化成多项式的代数解法 4.6 三轴相交的Pi ...

  4. 【《现代操作系统 第4版》】4、进程间的通信之互斥

    买面包问题 假设有两个人A.B要采购面包,首先查看冰箱中是否有面包,如果没有则离开家去超市购买面包,买来后把面包放到冰箱. 假设A.B的日程如下图所示.显然这会导致面包超买,如何保证最多只有一个人去买 ...

  5. 计算机英语第四版可可英语翻译,专四英语作文高分范文背诵(MP3+中英字幕)第28篇:计算机和人翻译...

    专四题目: With the amazing development of computer technology, computers can translate all kinds of lang ...

  6. JAVA大学实用教程(第四版)课后习题三、四章答案(自整理)

    第三章 1.下列System.out.printf输出的结果是什么? int a=100, x,y; x=++a; y=a-- System.out.printf("%d, %d,%d&qu ...

  7. 《Java编程思想》第四版读书笔记 第十四章 类型信息

    2019独角兽企业重金招聘Python工程师标准>>> 14.2 RTTI运行时类型识别. Class对象包含了与类有关的信息,Java使用Class对象来执行其RTTI.每个类都有 ...

  8. SeamCarver 普林斯顿 算法第四版

    算法第四版 文章目录 算法第四版 引言 一.SeamCarver.java 1.解析 2.代码 总结 引言 作业要求链接: https://coursera.cs.princeton.edu/algs ...

  9. “不要急”——《大道至简》典藏版(第四版)前言

    什么!你还在讲<大道至简>?! 是的,我说的是<大道至简>,它的上一个版本是"点评版",也是我这么多年来非常遗憾的一个版次.当然,这也是刊印这个" ...

最新文章

  1. 英特尔未来教育核心课程
  2. Linux给用户添加sudo权限
  3. C#访问SQLite完整增删改查代码
  4. android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
  5. 利用Android中的三大主件来实现一个码表
  6. 收集Java 性能优化的44个建议
  7. python调用arcgis_arcgis python 调用工具两种两种方法
  8. 南充一中计算机机房被盗,四川省CCF CSP-JS第一轮认证考试在南充一中成功举行...
  9. 算法训练 连续正整数的和
  10. 理解 CI 和 CD 之间的区别(翻译)
  11. 集宁哪有计算机培训班,集宁区有这么一个空间,叫共享自习室
  12. Jenkins_第五关_系统管理(1)
  13. 0 公式 0 基础学习电磁兼容 — 2.IEC及其EMC标准体系简介
  14. 计算机智能化的例子,工程机械智能化技术案例实例.ppt
  15. [英文话剧][搞笑话剧短剧][中英文对照]7人话剧 新三顾茅庐
  16. 打印机连接技术概述(LPRRAWAppleTalk)
  17. 计算机黑屏但是有鼠标,电脑黑屏但是鼠标能动解决方法
  18. 联想Y7000的屏幕亮度不能调节
  19. 风骚的操作:区块链监控个人账户即时在线充值
  20. 使用NPOI设置Excel表的单元格背景颜色

热门文章

  1. 外键约束(foreign key) [MySQL][数据库]
  2. 矩阵论笔记(三)——欧氏空间与正交变换
  3. oracle+xsl,ORA-39212:安装错误:未正确加载XSL样式表
  4. 服务器windows2003安装powershell2.0最新
  5. 关系数据库系统RDBMS与面向对象数据库管理系统ODBMS优缺点比较
  6. 商业智能最佳解决方案--微软数据仓库 翻译
  7. LLVM pass pwn 入门 (4)
  8. 自己做量化交易软件(11)通通量化AI框架的核心--框架结构
  9. 【WinForm】设置TextBox只能输入整数或数字
  10. 手把手教你锐速,超简单