一、信号量机制

  1. 简介:
    信号量机制是一种功能较强的机制,可以用来实现互斥与同步的问题。它只能被两个标准的原语wait(S)和signal(S)访问,也称为P、V操作。
  • PS:原语是指完成某种功能且不被分割、不被中断执行的操作序列,通常可以由硬件来实现。原语功能的不被中断执行特性在单处理机上可由软件通过屏蔽中断方法实现。
  1. 整型信号量
    整型信号量被定义为是一个用于表示资源数目的整型量S,wait和signal操作可描述为:
wait(S){while(S <= 0);S = S - 1;
}
signal(S){S = S + 1;
}
  • 在wait操作中,只要信号量S≤0,就会不断卡在while中不断测试。因此,该机制未遵循“让权等待”的准则,而是让进程处于“忙等”的状态。
  1. 记录型信号量
    记录型信号量是不存在“忙等”现象的进程同步机制。除了需要一个用于代表资源数目的整型变量value外,再增加一个进程链表L,用于链接所有等待该资源的进程。记录型信号量源于采用了记录型的数据结构。记录型信号量可描述为
typedef struct{int value;struct process *L;
} semaphore;
  • 相应的wait(S)和signal(S)的操作如下:
void wait (semaphore s){ //申请资源S.value --;if(S.value < 0)}把这个进程添加到S.L;block(S.L);}
}
  • wait操作,S.value --表示进程请求一个该类资源,当S.value<0时,表示该类资源已分配完毕,因此进程应该调用block原语进行自我阻塞,放弃处理机,放弃处理机,并插入该类资源的等待队列S.L。该机制遵循了“让权等待”准则。
void signal(semaphore S){S.value++;if(S.value<=0){从S.L中移除一个进程P;唤醒P进程;}
}
  • signal操作,表示释放一个资源,使得系统中可供分配该类资源数增1.如果加一后仍value≤0,则表示在S.L中仍有等待该资源的进程呗阻塞,因此还应该调用唤醒原语,将S.L中的第一个等待进程唤醒。
  1. 利用信号量机制实现同步
    信号量机制能用于解决进程间的各种同步问题。设S为实现进程P1,P2同步的公共信号量,初值为0.进程P2中的语句y要使用P1中x的运行结果。所以说只有当P1的x语句执行完毕之后,P2才可以执行y语句。其实现同步的算法如下:
semaphore S = 0;  //初始化信号量
P1(){...运行语句x;V(S);//S = 1,使得P操作中的while循环跳出执行后续语句,告诉P2,x已完成...
}P2(){...P(S);运行语句y;...
}
  • 若P2先执行到P(S)时,S为0,执行P操作会把进程P2阻塞,并放入阻塞队列;当进程P1中的x执行完毕后,把P2从阻塞队列中放回就绪队列,当P2得到处理机时,就继续执行。
  1. 利用信号量机制实现进程互斥
    信号量机制也能很好地解决进程互斥问题。设S为实现进程P1,P2互斥的信号量,由于每次只允许一个进程进入临界区,所以S的初值应该是1,也就是表示可用的资源数为1.现只需把临界区设置于P(S)和V(S)之间,即可实现两个进程对临界资源的互斥访问。其算法如下:
semaphore S = 1; //初始化信号量
P1(){...P(S);        //等待准备访问资源进程P1的临界区;V(S);        //结束访问,解锁临界区...
}
P2(){...P(S);进程P2的临界区;V(S);...
}
  • 分析:当没有进程进入临界区时,任意一个进程要进入临界区,就要执行P操作,把S的值减为0,然后进入临界区;当有进程存在于临界区时,S的值为0,再有进程要想进入临界区时,先执行P操作时将会被阻塞,直至在临界区的进程退出。
  • 总结:在同步问题中,若某个行为要用到某种资源,则在这个行为前面P这种资源一下;若某个行为会提供某种资源,则在这个行为后面V这种资源一下。所以在互斥行为的时候,互斥资源要被PV操作前后包围,中间不能有其他冗余的东西。
  1. 利用信号量机制实现前驱关系
    信号量也可以用来描述程序之间或语句之间的前驱关系,也就是控制程序段执行的顺序。如下所示的一个程序段S1~S6及其前驱图。为了使其能够正确执行,应该设置若干初始值为0的信号量。
semaphore a1 = a2 = b1 = b2 = c = d = e = 0;
S1(){...;V(a1);V(a2); //S1已完成,释放信号给S2,S3
}
S2(){P(a1);       //当S1释放a1后就停止等待,开始执行下面代码...;V(b1);V(b2); //S2已完成,释放信号给S4,S5
}
S3(){P(a2);       //当S1释放a2后就停止等待,开始执行下面代码...;V(c);        //S3已完成,释放信号给S6
}
S4(){P(b1);       //当S2释放b1后就停止等待,开始执行下面代码...;V(d)         //S4已完成,释放信号给S6
}
S5(){P(b2);       //检查S2是否已经运行完成,当S2释放b2后就停止等待,开始执行下面代码...;V(e);        //S5已完成,释放信号给S6
}
S6(){P(c);P(d);P(e);//当c,d,e信号都被释放后,开始执行下面代码...;
}
  • 分析:拿S2来说,它是S1的后继,所以要用到S1的资源(信号),前面说在同步问题中,要用某资源就在行为前执行P操作,提供者要执行V操作,就酱。

二、总结
用信号量机制求解同步互斥类问题,可按以下大致思路进行:

  1. 分析关系
    看看问题有多少个进程数目,并分析它们之间的同步和互斥的关系。
  2. 根据进程流程关系确定PV操作的顺序。
  3. 合理设置信号量。设置需要的信号量,确定初始值。

进程同步问题(二)——信号量机制相关推荐

  1. 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系

    文章目录 1 信号量机制 1.1 整形信号量 1.2 记录形信号量 1.3 信号量机制小结 2 用信号量机制实现进程互斥.同 步.前驱关系 2.1 信号量机制实现进程互斥 2.2 信号量机制实现进程同 ...

  2. 操作系统之-----信号量机制

    信号量机制是一种卓越成效的进程同步工具,信号量机制已经被广泛的使用于单处理机,和多处理系统的计算机网络中. 信号量S是一个整数,S大于等于零代表可供并发进程使用的资源实体数,当S小于零时则表示正在等待 ...

  3. 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)

    一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...

  4. 进程同步之信号量机制(pv操作)及三个经典同步问题

    上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源,锁机制详细解读了下,留下了一个问题,就是锁机制只能判断临界资源是否被占用,所以他解决了互斥问题,但是他不能确定前面的 ...

  5. 卡住无法查看到所有进程_进程同步 进程互斥 软件和硬件实现方式 信号量机制 信号量机制实现进程同步,进程互斥,前驱关系...

    参考:https://www.bilibili.com/video/av31584226/?p=9 进程具有异步性的特征,异步性是指,各并发执行的进程以各自独立的,不可预知的速度向前推进. 回忆我们之 ...

  6. 操作系统(三)| 进程同步详解(主要任务、制约关系、临界资源、临界区、同步机制遵循规则、信号量机制、信号量的应用)

    文章目录 进程的同步基本概念 进程同步的主要任务 进程间的制约关系 临界资源 临界区 同步机制应遵循的规则 信号量机制 整型信号量 记录型信号量 ❤❤❤ AND型信号量 信号量的应用 实现进程互斥 实 ...

  7. 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系

    2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...

  8. 操作系统(二十一)信号量机制

    2.3.4 信号量机制 在前两节中我们分别学习了用软件方式以及硬件方式实现互斥访问,但是他们或多或少的存在一些问题,1965年荷兰的一名学者迪杰斯特拉(是的,就是那个男人)提出了信号量机制,有效的解决 ...

  9. 操作系统之进程管理:11、用信号量机制实现进程同步、互斥、前驱关系

    11.用信号量机制实现进程同步.互斥.前驱关系 思维导图 用信号量机制实现进程同步 用信号量机制实现进程互斥 用信号量机制实现进程的前驱关系 思维导图 用信号量机制实现进程同步 先来看一下什么是进程同 ...

  10. GCD之信号量机制二

    在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明. 1.下面是不采用信号量修改公有变量的值 dispatch_grou ...

最新文章

  1. 树莓派工程设计常见问题与处理
  2. redis replicaof命令的使用
  3. 嵌入式linux开发业内各个常用开源项目git仓库地址大全
  4. linux怎么进去vi编辑器,red hat enterprise linux开机怎么进入vi编辑器界面?
  5. 2048游戏代码python_200 行代码实现简易版 2048 游戏 (python)
  6. [转] FFmpeg常用基本命令
  7. 禁止root远程登录及修改ssh默认端口号
  8. 删除数据表中的重复行
  9. c++11新特性_c++11(7)新特性之继承构造函数
  10. UniWebView使用总结
  11. 微信公众号发送客服消息-中文乱码
  12. win7与internet时间同步出错_如何解决Win7时间同步出错的问题
  13. [UE4]获得特定类型的所有Actor:Get All Actors Of Class、Get All Actors with Interface、Get All Actors with Tag...
  14. csv文件的格式---Comma Separate Values
  15. (八)高德地图之添加marker标记点
  16. 计算机无纸化考试合卷答题笔记卡,高级会计师无纸化考试攻略都在这 第一次考也不用慌...
  17. centos系统mysql数据库搭建教程
  18. JavaC++题解与拓展——leetcode310.最小高度树【复习链式前向星】
  19. Python Random随机数
  20. 关于一粒云盘使用心得

热门文章

  1. 17届智能车竞赛技术报告 | 常熟理工学院-昆承湖二队
  2. 自定义CardView
  3. docker上安装多个mysql_docker:安装mysql多个
  4. 机器学习 | 决策树ID3算法
  5. IstioCon 2022 报名中|使用 eBPF 代替 iptable 加速 Istio 数据平面
  6. 雄迈录像机开放哪些端口
  7. 卡诺模型案例分析_需求分析神器 | 卡诺模型
  8. python3_fake_User-Agent_创建UA伪装
  9. java毕业设计都市书城系统Mybatis+系统+数据库+调试部署
  10. 大文件上传解决方案-支持断点续传的文件上传插件(转)