现代操作系统采用多道程序设计机制,多个进程可以并发执行,CPU在进程之间来回切换,共享某些资源,提高了资源的利用率,但这也使得处理并发执行的多个进程之间的冲突和相互制约关系成为了一道难题。如果对并发进程的调度不当,则可能会出现运行结果与切换时间有关的情况,令结果不可再现,影响系统的效率和正确性,严重时还会使系统直接崩溃。
多进程的系统中避免不了进程间的相互关系。进程间的关系主要有两种:同步与互斥。
一、同步
同步关系,也成为直接制约关系。指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。这些线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。
一个很典型的例子就是公共汽车上司机和售票员直接的关系,如下所示:
再例如,输入进程A通过单缓冲向进程B提供数据。当该缓冲区空时,进程B不能获得所需数据而阻塞,一旦进程A将数据送入缓冲区,进程B被唤醒。反之,当缓冲区满时,进程A被阻塞,仅当进程B取走缓冲数据时,才唤醒进程A。
二、互斥
互斥关系,也称为间接制约关系。由于各进程要求共享资源,而有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。
一个很典型的例子就是系统的不同的进程同时要求使用打印机,如下图所示。
三、同步和互斥的特点比较
四、临界资源和临界区
1)临界资源
一次只能被一个进程所占用的资源就是所谓的临界资源。比如:打印机。
2)临界区
访问临界资源的那段代码称为临界区。多个进程的临界区成为相关临界区。
为了保证临界资源的正确使用,可以把临界资源的访问过程分成四个部分:
①进入区。为了进入临界区使用临界资源,在进入区要检查可否进入临界区,如果可以进入临界区,则应设置正在访问临界区的标志,以阻止其他进程同时进入临界区。
②临界区。进程中访问临界资源的那段代码,又称临界段。
③退出区。将正在访问临界区的标志清除。
④剩余区。代码中的其余部分。
使用临界区时必须遵守的规则:
①空闲让进:临界资源空闲时一定要让进程进入,不发生“互斥礼让”行为。
②忙则等待:临界资源正在使用时外面的进程等待。
③有限等待:进程等待进入临界区的时间是有限的,不会发生“饿死”的情况。
④让权等待:进程等待进入临界区是应该放弃CPU的使用。
参考资料:
http://www.eygle.com/digest/2004/12/osprocess_lock_latchs_emaphores.html
http://c.biancheng.net/cpp/html/2596.html
http://blog.jobbole.com/86709/
http://www.cnblogs.com/CareySon/archive/2012/04/14/Process-SynAndmutex.html