操作系统信号量
来源:互联网 发布:sql拒绝访问 编辑:程序博客网 时间:2024/05/29 01:55
它们应满足同步条件:
①任一时刻所有生产者存放产品的单元数不能超过缓冲区的总容量(N)。
②所有消费者取出产品的总量不能超过所有生产者当前生产产品的总量。设缓冲区的编号为0~N-1,in和out分别是生产者进程和消费者进程使用的指针,指向下面可用的缓冲区,初值都是0。
设置三个信号量
生产者进程Producer
while(TRUE) {
P(Empty);
P(Mutex);
产品送往buffer(in);
in=(in+1)mod N;
/*以N为模*/
V(Mutex);
V(Full);
}
消费者进程Producer
while(TRUE) {
P(Full);
P(Mutex);
产品被取走buffer(out);
out=(out+1)mod N;
/*以N为模*/
V(Mutex);
V(Empty);
}
应注意
①在每个程序中必须先做P(mutex),后做V(mutex),二者要成对出现。
②对同步信号量full和empty的P, V操作同样必须成对出现,但它们分别位于不同的程序中。
③无论在生产者进程中还是在消费者进程中,两个 P 操作的次序不能颠倒 。
较大的疑惑在于③。
当消费者进程中的P(Mutex)操作在先,P(Full)操作在后,若先执行消费者进程,则Mutex-1,为0,且Full为0(一个资源也没有),则无法进入缓冲区获得资源;同时,因为Mutex为0,生产者进程无法进入缓冲区投放资源(无论生产者进程的两个P操作顺序如何),无法投放资源,则消费者进程无法往下执行,故而形成死锁。
当生产者进程中的P(Mutex)操作在先,P(Full)操作在后,消费者进程中的P(Full)操作在先,P(Mutex)操作在后,若生产者进程往缓冲区投放资源,直至投满缓冲区,且之后消费者进程刚完成P(Full)操作,就被生产者抢了CPU,完成了P(Mutex)操作,但此时由于缓冲区已满,故无法再投放资源,而消费者进程则由于生产者进入了临界区,故无法到临界区取资源,也无法继续往下执行,故而形成死锁。
所以无论在生产者进程中还是在消费者进程中,两个 P 操作的次序不能颠倒 。
- 操作系统--信号量
- 操作系统信号量
- 操作系统 信号量 PV操作
- 操作系统 信号量 vs 互斥锁
- 【操作系统】【信号量】理发师问题
- 操作系统 [信号量] [并发控制]
- 操作系统之-----信号量机制
- 【操作系统原理】信号量机制
- 操作系统 *** 实现信号量
- 操作系统之信号量
- 操作系统信号量通俗理解
- Nuttx操作系统信号量Semaphore
- 操作系统_信号量
- 信号量-摘自《现代操作系统》
- 操作系统学习-6. 信号量
- 操作系统——信号量机制
- 操作系统 信号量与PV操作
- 操作系统-信号量C++代码WIN32
- Linux
- 新用户如何获得阿里云优惠怎么才能省钱-写给阿里云新手
- 2017年11月1日提高组T2 树论
- ubuntu16.04下u盘的自动挂载(脚本)
- javascript语法基础博客
- 操作系统信号量
- 用户分类
- Java内存溢出(OOM)异常完全指南3
- Linux基础学习
- java作业
- 继承
- 0语法
- 深度优先搜索 poj 2386
- Linux环境中连接Basler相机(Pylon软件的安装),ROS环境中连接Basler相机