现代操作系统的中心问题是多道程序,多进程和分布式式进程,并发是这些问题的基础,同时也是操作系统设计的基础,当多个进程并发执行时,无论是在多处理机系统还是在单处理机系统中都会出现进程间协同的问题。
并发进程可通过多种方式相互作用,互相透明的进程要为使用资源展开竞争。这些资源包括处理机时间,I/O设备的访问权等。当共享某一对象时,进程就间接地觉察到对方的存在,例如共享一块内存或一个文件,进程也可直接认识对方并通过交换信息进行协同,在这些相互作用中的主要问题是互斥和死锁。
对于并发进程,互斥一个必要的条件,在任一时期,只能有一个进程可以访问某一给定的资源或执行某一给定的函数,互斥可用来解决一些冲突,例如竞争资源。也可用于进程同步以使他们能协同工作。例如生产者/消费者模型,一个进程向缓冲区添加数据,另一些进程则从缓冲区取走数据。
现在已有了不少解决互斥问题的算法,其中最著名的是Dekker算法,软件方法开销较大,错误较多,第二种方法是使用特殊的机器指令支持互斥,这种方法虽然减小了开支,但仍有不足,因为它用到了忙等待。
另一种解决互斥的方法是在操作系统内部提供支持,两个最常用的技术是信号量好消息传递,信号量和消息传递能方便地实现互斥,而消息传递还可用于进程间通信。
死锁
死锁是由于进程间相互竞争系统资源或通信而引起的一种阻塞现象。如果操作系统不采取特别的措施这种阻塞将永远存在。例如可以杀死一个或多个进程或强迫他们撤回。死锁可能涉及到可重用资源和消耗性资源,消耗性资源在被进程占用时即消失,例如消息和I/O缓冲区的信息。可重用资源是不因使用而受到破坏的资源,例如I/O通道和存储器。
处理死锁的方法通常有3种:死锁预防,死锁 检测和死锁避免。死锁预防通过破坏产生死锁的是哪个必要条件而保证不会出现死锁。在操作系统随时满足资源请求时就要用到死锁检测。操邹系统检测到死锁并采取措施消除死锁。死锁避免是通过对资源请求是否有可能导致死锁的分析来消除死锁的可能性。