如何在进程间传递信息?
如何防止两个进程冲突?
如何实现进程执行的先后顺序?
多个进程访问一个共享数据,而数据最后的值由进程访问的先后顺序决定。
竞争条件的例子
输出: 指向下一个待打印的文件
输入: 指向下一个空位,in =7.
(1): 进程 A 读 in 且将值 7 保存在一个局部变量. 进程A 切换到进程B.
(2): 进程B读in, 将文件名保存在空位 7 且更新in 的值为 8.
(3): 进程 A 将文件名保存到空位 7且更新 in 的值为 8.
空位 7 所保存的文件名不确定,取决于谁最后完成,这导致竞争条件发生。
- 临界资源:互斥共享变量所代表的资源,即一次只能被一个进程使用的资源;
- 临界区指并发程序中与互斥共享变量相关的程序段;
- 防止竞争条件的思想:禁止多个进程同时读和写共享数据,即同时进入临界区。
好的解决方案满足的四个条件:
- 没有进程同时在临界区;
- 不假设CPU的速度和数量;
- 临界区外运行的进程不得阻塞其他进程;
- 不会导致有进程永远在临界区外面等待。
只有发生中断的时候,CPU 才会切换进程。因此,如果屏蔽中断,就不会发生切换了。
这个不太好,一个进程关了中断之后不开怎么办?
Problem?
如果一个进程执行完while条件判断后突然发生了切换,lock = 1尚未执行, 则两个进程都会进入临界区。
问题:效率不高,有限制。
几乎完美,但是有忙等待现象!
该硬件支持一种特殊指令 TSL, 其能够不可分割地完成两个任务:
(a)将一个内存值保存到CPU寄存器;
(b)将该内存值设置为1。
忙等待
- 一个进程一直占用CPU测试循环的条件,直到测试条件为真。
- 浪费CPU;
- 导致优先级反转问题
- 从忙等待到阻塞...
- 睡眠是一个系统调用,使得调用者阻塞自己直到另外的进程唤醒该进程。
- 唤醒调用唤醒指定的进程。
习题:
设与某资源相关联的信号量初值为3,当前值为2,若M表示该资源的可用个数,N表示等待该资源的进程数,则M、N分别为(D )
下一个笔记的内容是信号量相关的,可以移步看一下~
到此这篇进程控制原语6种方法(进程控制原语6种方法)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/19022.html