第四章:进程同步与计算机系统服务
一、进程同步的必要性
在多道程序设计的计算机系统中,多个进程并发执行,共享系统资源(如CPU、内存、I/O设备等)。当多个进程需要访问共享资源或进行通信时,若缺乏有效的协调机制,可能导致以下问题:
- 竞争条件:多个进程同时对共享数据进行读写操作,最终的执行结果取决于进程执行的相对顺序,导致结果不可预测。
- 数据不一致:由于进程执行顺序不当,导致共享数据状态出现矛盾或错误。
因此,进程同步的核心目标是为并发执行的进程提供一种协调机制,确保它们能够有序、正确地访问共享资源,从而维护系统数据的一致性和程序的正确性。
二、临界区问题与同步准则
- 临界区:进程中访问共享资源(临界资源)的那段代码。
- 同步机制需满足的准则:
- 互斥:在任意时刻,最多只允许一个进程进入其临界区。
- 空闲让进:当无进程处于临界区时,任何请求进入临界区的进程应能立即进入。
- 有限等待:任何请求进入临界区的进程,应在有限时间内获得许可,避免“饥饿”现象。
- 让权等待(可选但有益):当进程无法进入临界区时,应立即释放处理机,避免“忙等待”。
三、经典的进程同步机制
1. 软件方法:Peterson算法
通过设置共享变量(如turn和flag数组)来实现两个进程间的互斥。它巧妙地结合了“轮流进入”和“主动谦让”的思想,在软件层面满足了互斥、空闲让进和有限等待的要求。
2. 硬件方法:关中断与硬件指令
- 关中断:进程进入临界区前关闭中断,离开时打开。简单有效,但仅适用于单处理器,且将权力交给用户进程风险高。
- 硬件原子指令:如
Test-and-Set指令、Swap指令。这些指令在执行期间不可分割,可用于构建更高级的同步原语(如锁),但容易导致“忙等待”。
3. 高级抽象:信号量(Semaphore)
由Dijkstra提出,是操作系统提供的一种功能强大的同步工具。
- 数据结构:一个整型变量
value和一个进程等待队列。
- 两种基本操作(原语):
- P操作(wait):申请资源。
value--;若value<0,则进程阻塞并进入等待队列。
- V操作(signal):释放资源。
value++;若value<=0,则从等待队列中唤醒一个进程。
- 类型:
- 整型信号量:未遵循“让权等待”,可能忙等。
- 应用:
- 互斥信号量(mutex):初值为1,用于实现进程互斥。
- 同步信号量:初值为0,用于协调进程间的执行顺序(如“生产者-消费者”问题)。
4. 经典同步问题
- 生产者-消费者问题:一组生产者进程和一组消费者进程通过共享的固定大小缓冲区进行通信。需解决对缓冲区的互斥访问以及生产/消费的顺序协调(空则等、满则等)。
- 读者-写者问题:多个读者进程和写者进程共享一个数据对象。允许多个读者同时读,但写者必须独占访问。存在“读者优先”和“写者优先”等变体。
- 哲学家进餐问题:描述多个进程竞争有限资源时可能发生的死锁问题。解决方案包括设置资源上限、使用AND型信号量(一次性申请所有所需资源)或规定奇数/偶数哲学家不同的拿叉顺序等。
四、管程(Monitor)
为了简化并发程序设计的复杂性,引入了管程这一高级同步机制。它是一种编程语言构件,封装了共享数据结构和对其操作的所有过程,并提供了互斥和同步的机制。
- 管程内的共享变量只能被管程内的过程访问。
- 任何时刻,最多只有一个进程在管程内活动(由编译器负责实现互斥)。
- 提供了条件变量(Condition Variable)及
wait()和signal()操作,用于实现进程同步(当某条件不满足时,进程可在条件变量上等待;条件满足时,被其他进程唤醒)。
- 优点:将同步细节隐藏在管程内部,程序员只需调用管程过程,不易出错。
五、进程同步与计算机系统服务
进程同步机制是操作系统内核为上层应用程序提供的一项基础且关键的系统服务。它体现在:
- 内核实现:信号量、管程等机制由操作系统内核实现并提供系统调用接口(如
sem<em>init, sem</em>wait, sem_post)。
- 系统调用封装:应用程序通过调用这些系统服务,而非自行实现复杂的同步逻辑,保证了正确性和效率。
- 支撑高级服务:文件系统、网络通信、内存管理等所有涉及资源共享的内核子系统,其内部都严重依赖进程同步机制来保证一致性。
- 现代编程支持:现代编程语言(如Java的
synchronized关键字和wait/notify,Go的channel)和线程库(如POSIX pthread的互斥锁、条件变量)都是对操作系统底层同步服务的封装和抽象。
六、
进程同步是操作系统的核心概念之一,是理解并发编程和多线程技术的基石。从软件算法到硬件指令,再到信号量和管程,同步机制不断抽象和进化,目标是在保证正确性的前提下,提高并发效率和编程便利性。作为系统服务,它为整个计算机系统的稳定、高效运行提供了根本保障。学习本章,关键在于理解各种同步问题的本质、不同机制的优缺点,并能运用信号量等工具解决经典的同步问题。
如若转载,请注明出处:http://www.chengdufengli.com/product/42.html
更新时间:2026-01-13 06:41:47