4.5 同步和P-V操作

4.5.1 同步和互斥的概念

进程的互斥关系

例子

进程的互斥关系

  • 多个进程由于共享了独占性资源,必须协调个进程对资源的存取顺序:确保没有两个或以上的进程同时进行存取操作

  • 互斥和资源共享相关

  • 资源:临界资源

  • 存取操作区域:临界区

进程的同步关系

若干合作进程为了完成一个共同的任务,需要相互协调运行步伐,一个进程开始某个操作之前必须要求另一个进程已经完成某个操作,否则前面的进程只能等待。

进程同步的例子:司机和售票员

司机和售票员之间的操作属于同步关系

  • 司机:起步、行驶、停车
  • 售票员:关门、售票、开门

同步关系

  • 司机起步前售票员先关门,否则等待
  • 售票员开门前司机先停车,否则等待

进程同步关系——另一种解释

合作进程中某个操作之间需要满足某种先后关系或某个操作能否进行需要满足某个前提条件,否则只能等待

互斥关系属于特殊的同步关系

4.5.2 P-V操作概念

信号灯的概念

信号灯时一种卓有成效的进程同步机制

1965年荷兰学者Dijkstra提出

信号灯用于进程同步的基本思想

进程在运行过程中受信号灯状态控制,并能改变信号灯状态

  • 进程受控制:信号灯的状态可以阻塞或唤醒进程
  • 改变信号灯:信号灯的状态可以被进程改变

信号灯机制

数据结构

  • 信号灯变量定义为一个二元矢量\((S,q)\)
  • S:整数,处置非负(S又称信号量)
  • q:PCB队列,初值为空集
  1. struct SEMAPHORE {
  2. int S; //整数,初值非负
  3. pointer_PCB q; //队列:进程PCB指针,初值空集
  4. }

信号灯的操作

两个操作

  • P操作(函数或过程,P(S,q))
  • V操作(函数或过程,V(S,q))

P,V是荷兰语

  • Passeren通过
  • Vrijgeveb释放

P操作的原理(P(S,q)、P(S))

提示:P操作可能使得进程在调用处阻塞

提示2:S初值很重要

  • S的值减1
  • 若差大于或等于零,则进程继续
  • 若差小于零,则该进程阻塞并加入到队列q中,并转调度函数
  1. P(S, q) {
  2. S = S - 1;
  3. if (S < 0) {
  4. Insert(Caller, q);
  5. Block(Caller);
  6. 转调度函数();
  7. }
  8. }

V操作的原理(V(S,q)、V(S))

提示:V操作可能会唤醒一个阻塞的进程

  • S值加1
  • 若和大于零,则该进程继续
  • 若和小于或等于零,则该进程继续同时从q中唤醒一个进程
  1. V(S, q) {
  2. S = S + 1;
  3. if (S < 0) {
  4. Remove(q, pid);
  5. Wakeup(pid);
  6. }
  7. }

4.5.3 P-V操作解决互斥问题

实质是实现对临界区的互斥访问

允许最多一个进程处于临界区

应用过程

  • 进入临界区之前先执行P操作;(可能阻塞当前线程)
  • 离开临界区之后再执行V操作;(可能唤醒某个进程)

S的初值要设置合理

例子:3个进程Pa、Pb、Pc。CSa、CSb、CSc是临界区
  1. Pa() {
  2. P(mutex);
  3. CSa
  4. V(mutex);
  5. }
  6. Pb() {
  7. P(mutex);
  8. Csb
  9. V(mutex);
  10. }
  11. Pc() {
  12. P(mutex);
  13. CSc
  14. V(mutex);
  15. }
  16. main() {
  17. // 信号量mutex
  18. int mutex = 1;
  19. cobegin // 并发
  20. Pa();
  21. Pb();
  22. Pc();
  23. coend // 并发结束
  24. }

4.5.4 P-V操作解决互斥问题

同步问题实质

  • 当运行条件不满足时,能让进程暂停

  • 运行条件满足时,能让进程立即继续

P-V操作应用于进程同步的基本思路

  • 暂停当前进程:在关键操作之前执行P操作

    • 必要时可暂停
  • 继续进程:在关键操作之后执行V操作
    • 必要时唤醒合作进程
  • 定义有意义的信号量S,并设置合适的初值
    • 信号量S能明确地表示“运行条件”

实现同步的例子:司机和售票员

司机:

  • 起步
  • 行驶
  • 停车

售票员

  • 关门
  • 售票
  • 开门

关键操作

  1. 一个操作的运行需要条件
  2. 一个操作的完成与否影响到另外一个操作能否运行

同步要求

  • 只有售票员关门后,司机才能起步
  • 只有在自己停车后,售票员才能关门
  1. // 门是否关好?0:没有,1:关好
  2. int S1 = 0;
  3. // 车是否停稳?0:没有,1:停稳
  4. int S2 = 0;
  5. // 司机进程
  6. while (true) {
  7. P(S1);
  8. qibu();
  9. xingshi();
  10. tingche();
  11. V(S2);
  12. }
  13. // 售票员进程
  14. while (true) {
  15. guanmen();
  16. V(S1);
  17. shoupiao();
  18. P(S2);
  19. kaimen();
  20. }

4.5.5 经典同步问题

经典同步问题1:生产者消费者问题

一群生产者(Producer)向一群消费者(Consumer)提供产品(数据),共享缓冲区

规则

  1. 不能向满缓冲区存产品
  2. 不能从空缓冲区取产品
  3. 每个时刻仅允许1个生产者或消费者存或取1个产品(互斥)
  1. int empty = 5; // 信号量:缓冲区中空位的个数,初值5
  2. int full = 0; // 信号量:缓冲区数据的个数,初值0
  3. int mutex = 1; // 信号量:缓冲区互斥使用,初值1,可用
  4. producer_i() {
  5. while (TRUE) {
  6. 生产一个数据;
  7. P(empty); // empty--
  8. P(mutex);
  9. 1个数据到缓冲区;
  10. V(mutex);
  11. V(full); // full++
  12. }
  13. }
  14. consumer_j() {
  15. while (TRUE) {
  16. P(full); // full--
  17. P(mutex);
  18. 从缓冲区取1个数据;
  19. 消费/处理数据;
  20. V(mutex);
  21. V(empty); // empty++
  22. }
  23. }

4.5.6 读者和编者同步问题

问题描述:

有一本书

  • 有读者读书;有多个读者
  • 有编者编书;有多个编者

要求

  • 允许多个读者同时读
  • 不允许读者、编者同时操作
  • 不允许多个编者同时操作
  1. /*
  2. 如何实现:
  3. 编者之间的互斥
  4. 编者和读者之间的互斥
  5. 读者之间不互斥
  6. */
  7. int editor = 1; // 互斥量:编者对编者和读者的互斥
  8. int ReadCount = 0; // 读者计数
  9. int mutex = 1; // 互斥量:ReadCount时临界资源
  10. Reader_i() {
  11. while (true) {
  12. P(mutex);
  13. ReadCount++;
  14. if (ReadCount == 1)
  15. P(editor);
  16. V(mutex);
  17. 读书;
  18. P(mutex);
  19. ReadCount--;
  20. if (ReaderCount == 0)
  21. V(editor);
  22. V(mutex);
  23. }
  24. }
  25. Editor_i() {
  26. while (true) {
  27. P(editor);
  28. 编书;
  29. V(editor);
  30. }
  31. }

小结

信号灯机制P-V操作解决同步问题

  • 区分关键操作或运行条件或影响
  • 关键操作之前P操作
  • 关键操作之后V操作

生产者—消费者问题

  • 同步和互斥混合

读者—写者问题

  • 互斥问题

【av68676164(p25-p30)】同步和P-V操作的更多相关文章

  1. P,V操作及同步互斥实例

    无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...

  2. 操作系统中的P,V操作(转)

    无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...

  3. P,V操作实例分析

    刚开始学习操作系统的时候,就听说PV操作,简单说说PV操作. ●  P(S): S=S-1 如果S≥0,则该进程继续执行:               S<0,进程暂停执行,放入信号量的等待队列 ...

  4. 关于P,V操作理解的分析

      P-V操作定义: 假设sem是个整型变量. P原语的主要操作是: (1)sem减1: (2)若sem减1后仍大于或等于零,则该进程继续执行: (3)若sem减1后小于零,则该进程被阻塞,在相应队列 ...

  5. P.V操作【转】

    阐述P,V原语的理论不得不提到的一个人便是赫赫有名的荷兰科学家 E.W.Dijkstra.如果你对这位科学家没有什么印象的话,提起解决图论中最短路径问题的Dijkstra算法应当是我们再熟悉不过的了. ...

  6. Linux-信号量与P,V操作

    Linux-信号量与P,V操作 内容 使用信号量实现进程互斥 使用信号量及PV实现子进程读写同步 机理 Linux信号量集 Linux信号量作为IPC机制的一种,与其他通信方式类似,Linux也是通过 ...

  7. 关于P,V操作理解的突破,关于并发设计与并行

    今天又找了一篇博客研究P,V操作.. 发现..它有一个变量没有声明.. 我就换了篇博客..http://c.biancheng.net/cpp/html/2600.html 然后就看懂了.. 关键突破 ...

  8. 另类P、V操作问题-详细图解

    问题模型 有一个系统,定义如下P.V操作: P(s): s.count--; then 将本进程插入相应队列末尾等待; V(s): s.count++; then 从相应等待队列队尾唤醒一个进程,将其 ...

  9. 进程理论 阻塞非阻塞 同步异步 I/O操作

    1.什么是进程 进程指的是一个正在运行的程序,进程是用来描述程序执行过程的虚拟概念 进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统其它所有的概念都是围绕进程来的 2.操作系统 操作系统 ...

  10. ftp客户端自动同步 Windows系统简单操作ftp客户端自动同步

    服务器管理工具它是一款功能强大的服务器集成管理器,包含win系统和linux系统的批量连接,vnc客户端,ftp客户端等等实用功能.我们可以使用这款软件的ftp客户端定时上传下载的功能来进实现ftp客 ...

随机推荐

  1. python数据处理(四)之数据获取与存储

    1.前烟 几个数据问题 1.1 是否能够联系上作者本人 1.2 数据是否定期检查错误并更新 1.3 数据是否包含数据获取方法的信息,是否包含数据获取过程中使用的样本类型 1.4 有没有其他数据源可以验 ...

  2. 数据可视化基础专题(十):Matplotlib 基础(二) 自定义配置文件和绘图风格(rcParams和style)

    https://matplotlib.org/api/rcsetup_api.html#module-matplotlib.rcsetup 一.什么是rcParams?我们在使用matplotlibl ...

  3. Django之实现登录随机验证码

    登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验 ...

  4. bzoj4397[Usaco2015 dec]Breed Counting*

    bzoj4397[Usaco2015 dec]Breed Counting 题意: 给定一个长度为N的序列,每个位置上的数只可能是1,2,3中的一种.有Q次询问,每次给定两个数a,b,请分别输出区间[ ...

  5. 设计模式:prototype模式

    使用场景:在不能根据类创建对象的时候,根据已有的对象创建对象 不能根据类创建对象的情况: 创建一个类的对象时,需要根据多种对象来创建,创建的过程非常复杂 难以根据类生成对象 例子: class Pro ...

  6. Docker 基础知识 - 使用绑定挂载(bind mounts)管理应用程序数据

    绑定挂载(bind mounts)在 Docker 的早期就已经出现了.与卷相比,绑定挂载的功能有限.当您使用绑定挂载时,主机上的文件或目录将挂载到容器中.文件或目录由其在主机上的完整或相对路径引用. ...

  7. vue history路由模式 Nginx 生产实践

    nginx(带二级目录的配置) location ~* /A {    alias  /opt/nginx-1.4.7/html/ued/A;     try_files $uri $uri /A/s ...

  8. Dart函数

    函数 Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function.这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征.同时意味着在Dart语言 ...

  9. C#串模板

    c# 6.0 的语言特性,功能类似string.formate,更方便的地方在于不要像format一样使用索引,可以直接使用变量. 使用方法如下: string name = "zhangs ...

  10. Apache常用配置详解

    Apache配置文件:conf/httpd.conf.(注意:表示路径时使用‘/’而不使用‘\’,注释使用‘#’) 1. ServerRoot:服务器根目录,也就是Apache的安装目录,其他的目录配 ...