计算机操作系统——经典进程的同步问题
计算机操作系统——信号量机制与经典进程的同步问题
信号量机制
随着发展,信号量从整型信号量经记录型信号量,进而发展为“信号量集”机制。
一般来说,信号量的值与相应的资源的使用情况有关。
信号量的值仅由P、V操作改变。
信号量的初值大于等于0
S > 0表示有S个可用资源
S = 0表示无资源可用
S < 0表示S等待队列中的进程个数
P,V操作的优缺点:
- 优点:简单,表达能力强(用P,V操作可解决任何同步,互斥问题)
- 缺点:不够安全,使用不当会出现死锁;遇到复杂同步互斥问题时实现复杂。
1.信号量机制——整型信号量
最初由Dijkstra把整型信号量定义为一个用于 表示资源数目的整型量S ,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(Atomic Operation)wait(S)和signal(S)来访问。很长时间以来,这两个操作一直被分别称为P、V操作。
wait(S){while(S <= 0) ; /*do no-op*/S--;}
signal(S){S++;}
- wait(S)和signal(S)是两个原子操作,因此,在执行时是不可中断的。
- 当一个进程在修改某信号量时,没有其他进程可同时对该信号量进行修改。
- 在wait操作中,对S值的测试和对S–操作时都不可断。
2.信号量机制——记录型信号量
整型信号量如果S一直小于等于0,那就使处理机一直处于忙等状态。记录型信号量机制则是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略之后,又会出现多个进程等待访问同一临界资源的情况。
- 记录型信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。
typedef struct{int value;struct process_control_block *list;
}semaphore;wait(semaphore *S){S->value--;if(S->value<0) block(S->list);
}signal(semaphore *S){S->value++;if(S->value <= 0) wakeup(S->list);
}
3.信号量机制——AND型信号量
- 之前的进程互斥问题,是针对各进程之间只共享一个临界资源而言的。在有些应用场合,是一个进程需要先获得两个或更多的共享资源后才能执行其任务。
- 假定现有两个进程A和B,它们都要访问共享数据D和E。当然,共享数据都应作为临界资源。为此,可为这两个数据分别设置用于互斥的信号量Dmutex和Emutex,并令它们的初值都是1。相应地,在两个进程中都要包含两个对Dmutex和Emutex的操作。
process A:wait(Dmutex);wait(Emutex);
process B:wait(Emutex);wait(Dmutex);
- 若进程A和进程B按下述次序交替执行wait操作:
process A : wait(Dmutex); 于是Dmutex=0
process B : wait(Emutex); 于是Emutex=0
process A : wait(Emutex); 于是Emutex=-1 ,A阻塞
process B : wait(Dmutex); 于是Dmutex=-1 ,B阻塞
A和B处于僵持,进入死锁状态
- AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。
- 对若干个临界资源地分配,采取原子操作方式:要么把它所请求的资源全部分配到进程,要么一个也不分配。
Swait(S1,S2, ... ,Sn){while(TRUE){if(Si>=1 && ... &&Sn>=1){for(i=1;i<=n;i++) Si--;break;}else{place the process in the waiting queue associated with the first Si found with Si<1,and set the program count of this process to the beginning of Swait operation.}}
}Ssignal(S1,S2, ... ,Sn){while(TRUE){for(i=1;i<=n;i++){Si++;Remove all the process waiting in the queue associated with Si into the ready queue.}}
}
经典进程的同步问题
一、生产者——消费者问题
解决互斥同步问题的主要步骤:
- 分析清楚题目涉及的进程间制约关系。(可能是一种也可能是两种)
- 设置信号量(包括信号量的个数和初值,写出信号量物理含义)
- 身临其境写算法(并把P,V操作加到程序适当之处)
- 生产者消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费(使用)或生产(释放)某类资源。这里的资源可以是硬件资源,也可以是软件资源。
- 当某一进程使用某一资源时,可以看作是消费,称该进程是消费者。而当某一进程释放某一资源时,它就相当于生产者。
生产者——消费者问题的分析:
- 只要缓冲区未满,生产者就可以把产品送入缓冲区。(同步)
- 只要缓冲区为空,消费者就可以从缓冲区中取走物品。(同步)
- 缓冲池一次只能有一个进程访问。(互斥)
生产者——消费者问题:信号量和变量的设置
- 由于有界缓冲池是一个临界资源,必须互斥使用。另外,还需要设置一个互斥信号量mutex,其初值为1.
- 应该设置两个同步信号量:一个说明空缓冲区的数目,用empty表示。初值为有界缓冲区的大小n;另一个说明已满缓冲区的数目,用full表示,初值为0。
- 变量:缓冲池:buffer[n-1],数组下标:in,out,初值为0。
/*生产者*/
producer(){while(1){生产产品;P(empty); /*请求一个空闲缓冲区*/P(mutex);把产品放入缓冲池;in = (m+1) mod n;V(mutex);V(full); /*增加一个产品*/}
}
/*消费者*/
consumer(){while(1){P(full); /*消耗一个产品*/ P(mutex);从缓冲区取出一个产品;V(mutex);V(empty); /*增加一个空闲缓冲区*/}
}
生产者——消费者问题:算法结论
- P,V操作必须成对出现。
- 互斥的P,V出现在同一进程。
- 同步的P,V出现在不同的进程。
- 同步的P操作和互斥的P操作同时出现时,先写同步P操作,再写互斥P操作。
例题1:桌子上有一个盘子,最多允许存放一个水果。父亲只放苹果,母亲只放橘子;女儿只吃苹果,儿子只吃橘子。用信号量P,V写出父亲、母亲、女儿、儿子的同步算法。
信号量设置:
empty(盘子空余空间)=1;apple(苹果)=0;orange(橘子)=0
父亲father
father(){while(1){P(empty);放入苹果;V(apple);}
}
母亲mother
mother(){while(1){P(empty);放入橘子;V(orange)}
}
女儿daughter
daughter(){while(){P(apple);吃苹果;V(empty);}
}
儿子son
son(){while(1){P(orange);吃橘子;V(empty);}
}
例题2:桌子上有一个盘子,最多允许存放两个水果。父亲只放苹果,母亲只放橘子;女儿只吃苹果,儿子只吃橘子。用信号量P,V写出父亲、母亲、女儿、儿子的同步算法。
增加互斥信号量mutex=1
父亲father
father(){while(1){P(empty);P(mutex);放入苹果;V(mutex);V(apple);}
}
母亲mother
mother(){while(1){P(empty);P(mutex);放入橘子;V(mutex);V(orange)}
}
女儿daughter
daughter(){while(){P(apple);吃苹果;V(empty);}
}
儿子son
son(){while(1){P(orange);吃橘子;V(empty);}
}
例题3:某小型超市,可容纳50人同时购物。入口处有篮子,每个购物者从入口处拿一只篮子进入购物。出口处结账(入口和出口是两个门),并归还篮子(出、入口禁止多人同时通过),用信号量P,V写出购物者的同步算法。
由题意可以看出该题中只有互斥操作。
信号量设置:(超市剩余空间)empty=50,(入口)mutex1=1,(出口)mutex2=1
购物者shopper
shopper(){while(1){P(empty); /*这里的P操作可以理解成请求,申请一个空闲区域*/P(mutex1);从入口进入,取一只篮子; /*入口只能一个人通过,该动作执行的过程中,不允许其他进程进入*/V(mutex1);购物;P(mutex2);从入口出去,放下篮子;V(mutex2);V(empty); /*这里的V操作可以理解成归还,释放一个空闲区域*/}
}
例题4:
信号量设置:
(停车的信号量)stop=0,(开门的信号量)door=0
/*司机*/
driver(){while(1){P(door);启动车辆;正常行驶;到站停车;V(stop);}
}
/*售票员*/
conductor(){while(1){关门; /*售票员先关门,司机才能启动车辆*/V(door);售票;P(stop);开门;}
}
二、哲学家进餐问题
- 有五个哲学家围坐在圆桌旁,桌子中央放着火锅,每人面前有一只空盘子,每两人之间放一只筷子。
- 每个哲学家的行为是思考,感到饥饿,然后吃火锅。
- 为了吃火锅,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。
设chopstick[5]为5 个信号量,初值均为1
philosopheri:while(1){思考;P(chopstick[i]);P(chopstick[(i+1)%5]);吃火锅;V(chopstick[i]);V(chopstick[(i+1)%5]);
}
为防止死锁发生可采取得措施:
- 最多允许4个哲学家同时去拿起左边得筷子。
- 仅当一个哲学家左右两边得筷子都可用时,才允许他拿筷子。
- 给所有哲学家编号,奇数号得哲学家必须首先拿起左边的筷子,偶数号得哲学家则相反。
三、读者——写者问题
- 有两组并发进程:读者和写者,共享一组数据区
- 要求:(1)允许多个读者同时执行读操作(2)不允许读者、写者同时操作(3)不允许多个写者同时操作
读者——写者问题的问题分析:
- 读者和写者、写者和写者之间即写者与其他进程之间互斥访问数据区。
- 读者与读者可以同时访问,设置一个整型信号量readcount表示正在读的进程数目,该变量是可被多个读进程访问的临界资源。
- 设wmutex用于读者和写者、写者和写者之间的互斥;
- 设rmutex用于对readcount这个临界资源的互斥访问。
- wmutex用于读者和写者、写者和写者之间的互斥
- readcount表示正在读的读者数目
- rmutex用于对readcount这个临界资源的互斥访问
- 设有两个信号量wmutex=1,rmutex=1
- 另设一个全局变量readcount=0
/*读者*/
while(1){P(rmutex);readcount++;if(readcount==1)P(wmutex);V(rmutex);读;P(rmutex);readcount--;if(readcount==0)V(wmutex);V()
}
计算机操作系统——经典进程的同步问题相关推荐
- 计算机操作系统之进程
目录 进程的定义 基本概念 进程实体与进程 PCB的组成 进程的组织 链接方式 索引方式 进程的特征 进程的状态 进程的三种基本状态 进程的另外两种状态 进程状态的转换 进程控制 何谓进程控制 如何实 ...
- 操作系统之进程的同步机制
文章目录 进程的同步机制 一.基本概念 1.进程同步机制的概念 2.为何要引入进程同步机制 3.临界资源 4.临界区 二.进程同步与互斥关系 1.同步 2.互斥 三.进程同步机制的四个基本原则 1.空 ...
- 操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)
文章目录 生产者--消费者问题 分析 实现 哲学家进餐问题 方法一:最多4人同时拿左筷子,最终保证一人能进餐 方法二:同时给左右筷子 解法1:AND信号量 解法2:信号量保护机制 方法三:让奇数先左后 ...
- 进程管理---经典进程的同步问题及练习
一.生产者–消费者问题 生产着消费者问题即多个生产者和消费者对n个缓冲区的使用. 若不考虑互斥.同步问题会导致counter计数错误. 无论生产者.消费者使用缓冲池时应保证互斥使用(互斥信号量mute ...
- 计算机操作系统经典进程同步问题
经典进程同步问题 1 )生产者-消费者问题(合作互斥) 1)利用记录型信号量解决 2)利用AND型信号量解决 2)哲学家进餐问题(资源耗尽,避免死锁) 1)利用记录型信号量解决 2)利用AND型信号量 ...
- 【计算机操作系统】-进程切换什么时候会发生呢?
进程切换一定发生在中断/异常/系统调用处理过程中,常见的有以下情况: 时间片中断.IO中断后 更改优先级进程:(导致被中断进程进入就绪态): 阻塞式系统调用.虚拟地址异常:(导致被中断进程进入等待态) ...
- 计算机操作系统之进程与线程
⭐️前面的话⭐️ 本篇文章将介绍计算机操作系统的相关内容,主要内容有进程,进程调度,并行与并发的概念,进程间通信,进程与线程的区别.
- 计算机操作系统和进程
✨个人主页:bit me
- 计算机操作系统(第四版)第二章(进程的描述与控制)知识点整理
进程的描述与控制 2.1 前驱图和程序执行 2.1.1 前驱图 2.1.2 程序顺序执行 2.1.3 程序并发执行 2.2 进程的描述 2.2.1 进程的定义与特征 2.2.2 进程的基本状态及转换 ...
最新文章
- web前端开发培训有哪些学习阶段
- 关于VS的解决方案sln无法设置某些工程的依赖项的问题的解决方法
- [OS复习]程序装入技术、简单存储管理技术
- 三年租男友回家竟花了10万......
- python kotlin_在Python,Java和Kotlin中标记参数和重载
- [vue] vue自定义事件中父组件怎么接收子组件的多个参数?
- linux 禁用smb服务,Samba 4.11 发布,更好的可扩展性与默认禁用SMB1
- ios时间相差多少天_上海自驾拉萨,走川进青出,应如何规划线路?需要多少天时间?...
- python memoryview_memoryview的用法
- 如何利用图像识别、语音识别、文本挖掘做好鉴黄?
- android tabhost用法详解,android Tabhost部件详解
- iOS应⽤签名原理浅析
- 前端【vue】实现文档在线预览功能,在线预览pdf、word、xls、ppt等office文件
- mulesoft MCIA 破釜沉舟备考 2023.04.29.27 (易错题)
- Photoshop 2021 M1原生版没有扩展面板怎么办,ps 2021 m1版无法使用旧版插件
- EPROM工作原理2
- 智能化软件开发沙龙优秀学者报告·第1期PPT分享(张天翼 普渡大学)
- uchome 数据字典
- 001、操作系统的学习
- 穆迪分析被Chartis Research资产负债管理报告评为门类领军企业
热门文章
- 剑指Offer - 面试题11. 旋转数组的最小数字(二分查找)
- LeetCode 563. 二叉树的坡度(DFS)
- postforobject 设置代理_Spring RestTemplate和代理身份验证
- Flask简介与简单项目操作流程
- httpd 分页_更改 Apache httpd.conf 配置文件
- java获取api接口新浪数据,新浪短网址API接口的获取以及API接口的调用文档分享...
- CVPR 2019轨迹预测竞赛冠军方法总结
- Android静态代码扫描效率优化与实践
- MySQL数据库主从同步的3种一致性方案实现,及优劣比较
- 程序员真的只能干到35岁?——我的35岁危机度过之道!