1.1 进程间通讯
1、为什么要进程间通讯
1、第一个进程的输出结果作为第二进程的输入
2、第一个进程想第二个进程传送数据
3、两个进程同时操作临界活动不会对彼此产生影响
4、进程A生产数据,进程B消费数据
1.2 竞争条件
在某些操作系统中,协作进程可能会共享一些彼此都能读写的公用存储区
假设打印机最大可打印排队位置是5个,分别是1,2,3,4,5个位置
现在1,2,3,4,5,都是处于忙的状态
进程A 和 进程B 都想打印文件,但现在打印机都是繁忙状态,它们只能等待
突然,1 号位置空闲了(打印完了)
这时假设进程A检测到了1号位置空闲了,刚准备想把文件放进1号位置,哎,调度器认为进程A占用时间太长了,就挂起了进程A, 执行进程B,这时进程B也检测到了1号位置是空的,它就往里面放文件,然后调度器又调度回了进程A, 进程A也把文件放进去,把进程B的文件给覆盖了。这时要打印的 2 份文件,就只打印了一份!
具体打印的是进程A的文件还是进程B的文件取决于进程运行的精确时序,这就发生了竞争条件
有发生竞争条件的程序,如果发生问题,将会是一件非常难受的事儿
要相信一个哲理,如果你觉得这事很可能会发生,那么它一定会发生!!!
1.3 临界区
1、什么是临界区
对共享内存(公用存储区)进行访问的程序代码片段称为临界区
为避免产生竞争条件,就需要把进程A和进程B进行互斥
那如何设计?对于一个好的解决方案,一般具备满足以下
1、任何两个进程不能同时处理临界区
2、不要自我认为对 CPU 的速度和数量做出假设
3、临界区外的进程不能阻塞其他进程
4、不能让进程在临界区外无止休地等待
1.4 互斥机制的尝试方式
1、关闭中断:中断被关闭后,CPU将不会切换到其他进程,但,如果忘记打开中断将会发生灾难级别错误
2、锁变量:使用不好也会发生竞争条件
3、优先级反转:如进程A的优先级比进程B的高,当进程B进入临界区时,调度器就挂起线程B(没出临界区),这时进程A将永远忙等待下去