六大进程通信机制总结( 三 )


并且,在多道批处理系统中,多个进程是可以并发执行的,但由于系统的资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进(异步性) 。但有时候我们又希望多个进程能密切合作,按照某个特定的顺序依次执行,以实现一个共同的任务 。
举个例子,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的 。那么写数据应该发生在读数据之前 。而实际上,由于异步性的存在,可能会发生先读后写的情况,而此时由于缓冲区还没有被写入数据,读进程 A 没有数据可读,因此读进程 A 被阻塞 。

六大进程通信机制总结

文章插图
 
因此,为了解决上述这两个问题,保证共享内存在任何时刻只有一个进程在访问(互斥),并且使得进程们能够按照某个特定顺序访问共享内存(同步),我们就可以使用进程的同步与互斥机制,常见的比如信号量与 PV 操作 。
进程的同步与互斥其实是一种对进程通信的保护机制,并不是用来传输进程之间真正通信的内容的,但是由于它们会传输信号量,所以也被纳入进程通信的范畴,称为低级通信 。
下面的内容和上篇文章【看完了进程同步与互斥机制,我终于彻底理解了 PV 操作】中所讲的差不多,看过的小伙伴可直接跳到下一标题 。
信号量其实就是一个变量,我们可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为 1 的信号量 。
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现进程互斥或同步 。这一对原语就是 PV 操作:
1)P 操作:将信号量值减 1,表示申请占用一个资源 。如果结果小于 0,表示已经没有可用资源,则执行 P 操作的进程被阻塞 。如果结果大于等于 0,表示现有的资源足够你使用,则执行 P 操作的进程继续执行 。
可以这么理解,当信号量的值为 2 的时候,表示有 2 个资源可以使用,当信号量的值为 -2 的时候,表示有两个进程正在等待使用这个资源 。不看这句话真的无法理解 V 操作,看完顿时如梦初醒 。
2)V 操作:将信号量值加 1,表示释放一个资源,即使用完资源后归还资源 。若加完后信号量的值小于等于 0,表示有某些进程正在等待该资源,由于我们已经释放出一个资源了,因此需要唤醒一个等待使用该资源(就绪态)的进程,使之运行下去 。
我觉得已经讲的足够通俗了,不过对于 V 操作大家可能仍然有困惑,下面再来看两个关于 V 操作的问答:
问:信号量的值 大于 0 表示有共享资源可供使用,这个时候为什么不需要唤醒进程?
答:所谓唤醒进程是从就绪队列(阻塞队列)中唤醒进程,而信号量的值大于 0 表示有共享资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒,正常运行即可 。
问:信号量的值 等于 0 的时候表示没有共享资源可供使用,为什么还要唤醒进程?
答:V 操作是先执行信号量值加 1 的,也就是说,把信号量的值加 1 后才变成了 0,在此之前,信号量的值是 -1,即有一个进程正在等待这个共享资源,我们需要唤醒它 。
信号量和 PV 操作具体的定义如下:
六大进程通信机制总结

文章插图
 
互斥访问共享内存两步走即可实现不同进程对共享内存的互斥访问:
  • 定义一个互斥信号量,并初始化为 1
  • 把对共享内存的访问置于 P 操作和 V 操作之间

六大进程通信机制总结

文章插图
 
P 操作和 V 操作必须成对出现 。缺少 P 操作就不能保证对共享内存的互斥访问,缺少 V 操作就会导致共享内存永远得不到释放、处于等待态的进程永远得不到唤醒 。
六大进程通信机制总结

文章插图
 
实现进程同步回顾一下进程同步,就是要各并发进程按要求有序地运行 。
举个例子,以下两个进程 P1、P2 并发执行,由于存在异步性,因此二者交替推进的次序是不确定的 。假设 P2 的 “代码4” 要基于 P1 的 “代码1” 和 “代码2” 的运行结果才能执行,那么我们就必须保证 “代码4” 一定是在 “代码2” 之后才会执行 。


推荐阅读