大家都知道,计算机有了操作系统后性能大幅度提升,其根本原因就在于实现了进程的并发运行。多个并发的进程彼此之间围绕着紧俏的资源产生了两种关系,同步或互斥。而信号量正式解决资源竞争的最有效途径。
比如记录资源的数量,等待资源的进程数,等待资源的进程阻塞队列在哪,当然最重要的是信号量还代表这个资源是互斥的。比如信号量S=3代表资源目前还有3个,没有进程阻塞;S=-2代表资源已经都被占用,且阻塞队列中等待资源的进程有2个。
信号量是操作系统提供给用户使用的一种机制,帮助用户进程协调使用资源,用户编程的时候可以直接调用,不必自己设计。计算机对信号量只能执行 wait和signal这两种原子操作,即申请和释放信号量时无法被打断。下面看一个例题:
例:若有一售票厅只能容纳300人,当少于300人时,可以进入;否则,需在外等候。若将每一个购票者作为一个进程,请用P(wait)、V(signal)操作编程,并写出信号量的初值。(强调:只有一个购票窗口,每次只能为一位购票者服务)
分析:题中有两类资源,售票厅和售票窗口,售票厅可以容纳300人,窗口只能服务1个人。用户到达后要想买到票,首先要进入售票厅,然后申请到窗口才行。因此用户需要获得两类资源才能成功购票。好了,我们定义两个信号量一个是S1,代表售票厅还能容纳的人数,一个是S2,代表窗口,它们的初始值一个是300,一个是1。程序如下:
解:semophore S1=330,S2=1;
用户进程Pi {
Wait(S1)
进入大厅
Wait(S2)
窗口购票
退出购票窗口
Signal(S2)
退出大厅
Signal(S1)
}
注意,申请的时候能不能把S1,S2的顺序调换呢?答案是不能的,因为如果某进程申请到了窗口(被叫号了),却无法进入大厅,那么其他人就无法购票,也就无法退出大厅,他也就一直进不去了。另外在释放过程中,能不能把siganl(S2)放在程序的最后呢,答案是可以的,但是多进程并发时,资源释放的太晚是不是会影响计算机的效率呢。