操作系统基础-信号量机制的理解
初步了解信号量
信号量机制的提出,是为了解决进程间关系通信的问题,因为进程间不可能用嘴来说“我在使用这个资源啊,你先等我用完再用”,或者说“我用完了,接下来轮到你了!”这是我们人之间通信的方式,那么现实中如何让某个进程知道,自己暂时不能用哪个资源或可以用哪个资源呢?
比如在火车上上厕所,假设有个空厕所,门上显示器写着"无人",当我进去把门锁上后,门上显示变为"有人",这样后来者看到门上显示"有人"就会在外等待而不会冒然闯进来。
这就是用到信号量的机制,其中门上的显示器就扮演了"信号量"的角色,在计算机中,我们称这是进程互斥。当然,进程间关系还不止互斥。
首先有几个概念我们要先了解
临界资源
一段时间内只允许一个进程访问的资源称为临界资源或独占资源。
比如打印机,上文我们提到的厕所,只能你一个人用,不能多人同时用。
临界区
进程中访问临界资源的那段代码称为临界区。
这个容易理解,我有一段代码,其中调用打印机的那段代码块,就是临界区。
进程互斥
为使多个进程互斥地访问某临界资源,须为该资源设置互斥信号S,并设其初始值为1,然后将各进程访问资源的临界区置于p操作和v操作之间即可。
P操作是申请使用资源的操作,假设我要使用打印机了,就进行P(S),这样之后,S的值就会减1变成0,S的值为0表示打印机也就是资源不可用。
如果另一个人要使用也是先进行P(S),由于S为0资源还不能用,这样S的值会变成-1,表示他暂时没能使用而在排队,信号量S为负数时其绝对值表示阻塞队列中等待该资源的进程数。
如果没人在排队,当我用完打印机后就执行V操作,V操作表示释放资源,V(S)就让信号量S由0加1变成了1,这样后来者就可以用打印机了。
若有1人在排队,那S就变0,这个后来者直接使用打印机,使用完后再V操作,S会变1。
进程同步
两进程协作完成一件事,我们叫同步。
设有a,b两进程共用一个变量x,a负责算数得到x的结果,然后把结果传给b,b负责把结果x打印出来。这里我们需要两个信号量S1,S2,初值为1,0。(S1给a用,S2给b用)
要完成这次任务
执行P(S1)→得到结果→V(S2)→P(S2)→打印结果→V(S1)
P(S1)表示a进程要工作了,把它对应的信号量S1置0,表示a进程不可用正在工作中。
得到结果后,V(S2)把S2置1,表示b可以开始工作。
P(S2)表示b进程要工作了,把它对应的信号量S2置0。
打印出结果后,V(S1)讲S1置1,表示任务完成,a进程可以开始下一轮的工作了。