信号量模型——PV操作

进程同步属于进程控制中的内容。那么为什么会出现进程同步?

原因至少有以下2个:

       1 程序设计的逻辑制约。例如:有一个实现很多功能必须顺序执行的程序。如果我们将它放在一个进程里,那么由于计算机的并发性,它将执行很慢;如果我们将其划分到几个进程里,则由于进程之间是并发执行的,则不满足要求。

       2 由于进程的并发性产生的异步性,也会给系统造成混乱,尤其在他们争用临界资源时。比如,两个都需要打印机的进程A、B,会一会儿打印A的结果,一会儿打印B的结果,最终A和B的结果打印到了一张纸上。

       上述原因1,只能重新设计程序或引入进程通信。为了解决原因2——资源共享矛盾,人们引入进程同步机制——进程同步是使满足一定条件的多个进程进行顺序执行的机制。

        首先,我们要明白:进程的顺序执行并不是说一定要先执行排在前面的进程的所有指令,而是只同步执行进程里的某些指令区域。例如下图,进程A、B进程的其余进程可以按一般进程的,但是在红圈的部分——共享I/O设备,只能一个一个地执行,即就是当A在用I/O设备时,若此时B也需要I/O设备,则B只能等待。

        综上所述,我们只需要对需求临界资源的指令做相应的处理就可以解决问题。想法是这样的:1在进程中需求临界资源的指令块(见下图中红圈中的指令集)前加上检查需求临界资源占用状态的代码。若所需的资源有处于空闲状态的,则正常进入临界区;反之,进程A进入阻塞状态等待其他进程释放所需资源。2在指令块后面加上释放被占用的临界资源的代码。

        因此,可以说一切关于进程同步的研究都是围绕“处理时添加的代码”展开的,主要针对进入区。一般进入区被称为P操作,而退出区被称为V操作。

其中,最著名的是Dijkstra 提出的信号量(Semaphores)机制。它实际上是对资源数量建模:用一个整型变量S代表资源数目。当S>0时,S表示有S个该类资源处于空闲状态;当S<=0时,绝对值|S|表示等待该类资源的进程数目。

       引入S条件变量后,我们来模拟执行流程:

 

        这个模型的推广:当一个进程的临界区需求多个相同类型临界资源时,只有当所有资源都配齐时才能进入临界区,这就是AND型的信号量模型。当一个进程的临界区需求多个不相同类型临界资源时,只有当所有资源都配齐时才能进入临界区,这就是信号量集模型。

       从面相对象编程的思想考虑,由于进程中分布了很多P、V操作对,太过程化很容易出错,于是可以将P、V操作进行封装,哪里要用就直接调用这个封装。最著名的优化信号量算法就是管程机制——封装了资源数据和对其能作的操作的类。


猜你喜欢

转载自blog.csdn.net/A_Pointer/article/details/79161256