实验:信号量机制(PV操作)-进程的互斥(打印机资源管理)
1、实验内容
编写一个 C 语言程序,使用信号灯的 PV 操作管理一台打印机资源。
2. 知识点
(1)P 操作(sem_wait)
(2)V 操作(sem_post)
(3)临界区的概念与保护
(4)通过信号量实现共享资源的互斥访问
(5)fork 函数创建子进程
(6)父进程与子进程的区分与协作
(7)信号量函数(sem_open、sem_close、sem_unlink)
(8)信号量的应用场景与局限性
3. 实验目标
(1)理解信号量的基本原理
掌握信号量的 PV 操作机制,理解其如何实现进程间的同步与互斥;
理解信号量的初始化、P 操作(sem_wait)和 V 操作(sem_post)的使用方法。
(2)实现进程间互斥访问打印机资源
编写程序,模拟多个进程竞争使用打印机资源;
使用信号量确保同一时间只有一个进程可以使用打印机,实现互斥访问。
(3)掌握共享资源的管理方法
学习如何使用信号量管理共享资源(如打印机),避免资源竞争和数据不一致;
理解临界区的概念,并通过信号量保护临界区。
(4)熟悉进程创建与同步
使用 fork 函数创建多个进程,模拟多个用户同时请求使用打印机。
通过信号量实现进程间的同步,确保进程按顺序访问打印机。
(5)调试与运行程序
编写完整的 C 语言程序,编译并运行。
观察程序输出,验证信号量的 PV 操作是否正确实现了对打印机资源的互斥访问。
(6)分析实验结果
分析程序运行结果,验证多个进程是否按预期顺序使用打印机。
讨论信号量在资源管理中的作用,总结 PV 操作的优缺点。
4. 实验环境
操作系统:CentOS 7
编译器:GCC
编程语言:C 语言
5. 基本原理
(1)PV操作原理
【1】临界资源
多道程序系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用,一次仅允许一个进程使用的资源称为临界资源。属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。
【2】临界区
每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
【3】互斥
当一个进程进入临界区使用临界资源时,另一个进程必须等待, 当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。
例如,在仅有一台打印机的系统中,有两个进程A和进程B,如果进程A需要打印时, 系统已将打印机分配给进程B,则进程A必须阻塞。一旦进程B将打印机释放,系统便将进程A唤醒,并将其由阻塞状态变为就绪状态。
【4】同步
同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。本意是指某人或某事同时进行;同时产生,比如音画同步、动作同步等。英语:Synchronization,指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象。在系统中进行同步,也被称为及时(in time)、同步化的(synchronous、in sync)。
【5】信号量
以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。
在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。
信号量的概念和PV操作是荷兰科学家E.W.Dijkstra提出来的。信号是铁路交通管理中的一种常用设备,交通管理人员利用信号颜色的变化来实现交通管理。在操作系统中,信号量S是一整数。S大于或等于零,代表可供并发进程使用的资源实体数;在S小于零时,表示正在等待使用资源实体的进程数。建立一个信号量必须说明此信号量所代表的意义并且赋初值。除赋初值外,信号量仅能通过PV操作来访问。
【6】PV操作
PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
用PV操作来管理共享资源时,首先要确保PV操作自身执行的正确性。由于P(S)和V(S)都是在同一个信号量S上操作,为了使得它们在执行时不发生因交叉访问信号量S而可能出现的错误,约定P(S)和V(S)必须是两个不可被中断的过程,即让它们在屏蔽中断下执行。把不可被中断的过程称为原语。于是,P操作和V操作实际上应该是P操作原语和V操作原语。
信号量S就是资源的数量
P操作:
①将信号量S的值减1,即S = S - 1;
②若S >= 0,则进程继续执行;