"这是一份关于信号量的习题,主要涉及操作系统中的进程同步问题,特别是如何使用信号量机制确保进程间的正确协调。题目源于北京大学研究生入学考试,具体场景是三个进程PA、PB和PC协作完成文件打印任务,每个进程分别负责从磁盘读取、在两个缓冲区之间传递以及打印记录。习题要求定义和初始化相应的信号量,并通过P、V操作实现进程间的同步。"
在操作系统中,信号量是一种重要的同步机制,由荷兰计算机科学家Dijkstra提出。它是一个整型变量,可以被P(wait)和V(signal)操作所修改。P操作表示请求资源,如果资源可用则减1,若资源不足(即信号量值小于0),则进程进入等待状态;V操作表示释放资源,会将信号量加1,如果等待队列中有进程,则唤醒一个。
在这个习题中,涉及了多个信号量,包括互斥锁mutex1和mutex2,以及用于记录缓冲区状态的avail1、full1、avail2和full2:
1. mutex1和mutex2:互斥锁用于保证对共享资源(如缓冲区)的独占访问。初始化为1表示没有进程持有锁。当一个进程访问缓冲区时,需要先进行P(mutex)操作获取锁,完成操作后再进行V(mutex)释放锁,确保同一时间只有一个进程能够访问缓冲区。
2. avail1和full1:这两个信号量用于管理缓冲区1的状态。avail1表示缓冲区1是否有空闲位置,初始值为1,表示有一个空位;full1表示缓冲区1是否已满,初始值为0,表示为空。PA进程在读取记录后将full1加1,表示有数据,而PB在取走数据前会先检查full1。
3. avail2和full2:类似地,这些信号量用于管理缓冲区2的状态。PB将数据从buffer1复制到buffer2后,将full2加1,PC在打印前会检查full2。
各进程的P、V操作逻辑如下:
- PA进程:
- 从磁盘读取记录后,首先P(avail1),确保有空位放入数据;接着P(mutex1)以获取对buffer1的独占访问权,将记录放入,然后V(full1)和V(mutex1)释放资源,继续读取下一个记录。
- PB进程:
- 首先P(full1),等待buffer1有数据;然后P(mutex1)获取锁,从buffer1取出数据,V(avail1)释放空位,V(mutex1)释放锁。接着P(avail2)和P(mutex2),将数据放入buffer2,V(full2)和V(mutex2)后继续循环。
- PC进程:
- 直接P(full2),等待buffer2有数据;然后P(mutex2)获取锁,取出数据,V(avail2)释放空位,V(mutex2)释放锁并打印记录。
通过这样的设计,可以确保进程间的正确同步,避免竞争条件和死锁的发生。PA、PB和PC按照预期顺序执行,确保文件记录从磁盘到打印的正确流程。这个习题旨在让学生理解并掌握信号量在解决进程同步问题中的应用。