关于IPC我们要知道的一些内容
什么是IPC?
答:IPC 全称 Inter-Process Communication,我们可以按照其字面意思来理解,就是指进程间沟通的一种方法。其实我们以前就接触过一些IPC机制,只是当时我们还没有认识到,那就是:管道和信号,这两者都可以达到进程间通信的目的。其实IPC机制还有信号量,共享内存,消息队列,套接字。我们之后会一一介绍,本篇先介绍信号量。
什么是临界资源和临界区?
答:当一个进程对一块内存所保存的资源进行读或写时,也许会有其他的进程同时会对这些资源进行访问或者修改,这就引发一个问题,比如,这里存放了一个变量 a 的值是123,进程一刚要获取这个a的值,结果进程二却抢在进程一之前把a的值修改成了456,导致进程a获取到了不正确的值。所以,我们有了临界资源这一定义,临界资源是一次仅允许一个进程使用的共享资源。即我在访问这些资源的时候,不能有其它进程来对其进行访问或修改。而临界区是指每个进程中访问临界资源的那段代码。
什么是原子操作?
答:简单来讲就是原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断。举个例子:我们平时做菜有个行为的顺序是洗菜、切菜、炒菜,这三道工序我们顺序执行,而当我们切菜时,假如有人敲门,你会停止切菜去开门,这是很正常的操作。而假如这个行为是个原子操作,你必须把洗菜、切菜、炒菜,这三道工序彻底完成才能做其他的事情,这个行为只有成功和失败两个结果,不可能存在第三种情况,比如我切菜切到一半停下来,静止几分钟再继续,这是不允许的。我们常用的 i++ 就不是一个原子操作,这个语句经历了三个阶段:内存到寄存器、寄存器自增、写回内存。这三个阶段都有可能被中断分离,从而导致 i 不正确的自增结果。
什么是信号量?
答:信号量按照我自己的理解就是一个变量,它规定了在当前的值下你能做和不能做的事情。最简单的一个例子就是红绿灯,我们可以把这个灯看作是一个信号量,当其为红色,表示车辆禁止前进,绿灯,表示车辆可以前进。
什么是pv操作?
答:pv操作是针对信号量的一种原子操作,通过信号量和pv操作达到对临界资源的管理。在一般的编程中,我们会把信号量的值初始化为 1,而pv操作就是对这个信号量的值进行加减。
假设当前当信号量 s = 1 。
当 s = 1时, 表示该临界资源可以访问或修改。
当 s = 0 时,表示该临界区不可被访问或修改。
p 操作,会把信号量的值减一。
v 操作,会把信号量的值加一。
我们试想,信号量此时的值为 1 ,当进程一要访问某临界资源,首先判断信号量的值,发现其为 1,说明可以访问,于是进程一进行p操作,对信号量的值减一,这样,当其他进程想要访问该临界资源,发现信号量的值为0,不能访问,只好等待。当进程一对这块临界资源访问结束,进行v操作,把信号量的值恢复成 1,其它进程就可以访问了。
使用PV操作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
(2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
(3)互斥信号量的初值一般为1。
-------------------------