美文网首页
操作系统 - 同步、通信与死锁

操作系统 - 同步、通信与死锁

作者: CandyTong_ | 来源:发表于2018-03-09 17:23 被阅读0次

并发进程

与时间有关的错误

  • 并发错
  • 永远等待

进程中基本关系

  • 竞争关系
    因共享资源而产生交互和制约关系,又称互斥关系
    资源竞争会引发两个控制问题:死锁和饥饿
  • 协作关系
    进程同步指为完成共同任务的并发进程基于某个条件来协调其活动,因为需要在某些位置上排定执行的先后次序而等待、传递信号或消息所产生的协作制约关系

进程互斥关系是一种特殊的进程同步关系

临界区

并发进程中与共享变量有关的程序段

信号量与PV操作

一般信号量

设s为一个记录型数据结构,一个分量为整型量value,另一个为信号量队列queue

P(s)

将信号量s减1,若结果 <0,则执行P操作的进程被阻塞

V(s)

将信号量s加1,若结果 ≤0,则唤醒该信号量等待list中的一个进程

  • 信号量 s>0,s代表实际可用的物理资源数
  • 信号量 s<0,s代表等待队列中的进程数
typedef struct semaphore {
    int value;             /*信号量值*/
    struct pcb *list;    /*信号量队列指针*/
 }; 
void P(semaphore &s) {
     s.value--;            
     if(s.value<0)      // s.value--前小于或等于0     
         sleep(s.list);      
}                     
void V(semaphore &s) {
    s.value++;            
    if(s.value<=0)      // s.value++ 前小于0
        wakeup(s.list);        
}                      

二值信号量

信号量的value只能取值0,1

信号量实现互斥

semaphore mutex;
mutex = 1;
cobegin
    process Pi(){
        P(mutex);
        /* 临界区 */
        V(mutex);
    }
coend

信号量例子

自己看书

进程通信(IPC)

内存进程中,大多数都是无关的(互不干扰),只有少数有关

通信方式(机制)

  • 信号
  • 管道
  • 消息传递
  • 信号量
  • 共享内存

死锁

死锁防止

产生条件

  • 互斥条件
    进程互斥排他使用独占型资源
  • 占有和等待条件
    进程在请求资源得不到满足而等待时,不释放占有资源
  • 不剥夺条件
    已获得资源不允许被其它进程剥夺
  • 循环等待条件
    每个进程都在等待链中等待下一个进程所持有的资源,造成这组进程永远处于等待状态

死锁防止策略

破坏产生条件中的一个或多个

死锁避免

动态地确定是否分配资源给提出请求的进程,如果一个资源分配会导致系统下一步死锁,便拒绝本次分配

死锁防止跟死锁避免的区别

  • 死锁防止会降低系统并发性,导致低效的资源利用率
  • 死锁避免允许系统同时存在前三个必要条件(互斥、占有和等待、不剥夺),通过合适的资源分配方法确保不会出现进程循环等待链,从而避免死锁

银行家算法

  • Request<=Need,否则申请量超过最大需求数,报错
  • Request<=Available,否则申请量超过当前拥有的可分配量,让进程等待
  • 试探性分配
    • Allocation = Allocation + Request
    • Available = Available - Request
    • Need = Need - Request
  • 安全性测试算法
    • Work = Available possible = true
    • 从进程集合中找出满足 Need <= Work
      • 如果不存在,停止,possible = false,返回不安全
      • 存在,回收已分配内存,Work = Work + Allocation,找下一个
    • 返回安全

进程-资源分配图

无环——无死锁
有环——可能死锁


image.png

资源指向已分配的进程(已经分配了)
进程箭头指向请求的资源(还没请求到)

死锁的检测算法

  • Work = Available
  • 如果 Allocation != 0 finish[k] = false 否则 finish[k] = true
  • 寻找一个未完成的进程, Request <= Work
    • 找不到,处于死锁状态,finish=false 的进程是处于死锁的进程
    • Work = Work + Allocationfinish = true ,找下一个

死锁的恢复方法

  • 结束所有进程的执行并重新启动操作系统
  • 撤消陷于死锁的所有进程,解除死锁,继续运行
  • 逐个撤消陷于死锁的进程,回收其资源并重新分配,直至死锁解除

相关文章

网友评论

      本文标题:操作系统 - 同步、通信与死锁

      本文链接:https://www.haomeiwen.com/subject/ezhmfftx.html