1、 课 程 设 计 书 学学 院院 计算机学院 专专 业业 计算机科学与技术 班班 级级 课课 程程 题题 目目 和尚挑水问题和尚挑水问题 教教 师师 学学 生生 I 摘 要 Linux 是一类 Unix 计算机操作系统的统称,也是自由软件和 开放源代码发展中最著名的例子。 Linux作为一个免费、 自由软件, 内核版本不断升级。新的内核修订了旧内核的 bug,并增加了许多 新的特性。同时也使得 Linux系统更加稳定、更加安全,进一步满 足用户的功能需求。 Linux 中的信号量(semphore)是一种资源锁,如果有一个任 务试图获得一个已经被占用的信号量时,信号量会将其推到一个 等待队列中
2、,这时处理器会重获自由从而去执行其它代码,当持 有信号量的进程将信号量释放后,处于等待队列中的那个任务将 会被唤醒,并将获得该信号量。信号量是一种对多个进程访问共 享资源进行控制的机制,其实为了解决互斥共享资源的同步问题 而引入的机制。不能单独定义一个信号量,而只能定义一个信号 量集,其中包括一组信号量,同一信号量集中的信号量使用同一 引用 ID,这样设置是为了多个资源或同步操作的需要。 关键词:信号量,同步,互斥 II 目 录 1 课程设计的目的及要求1 1.1 课程设计的目的 . 1 1.2 课程设计的要求 . 1 2 准备工作2 2.1 硬件及软件需要 . 2 2.2 了解信号量及信号量
3、的系统调用函数: 2 2.2.1信号量定义 2 2.2.1信号量集得创建与打开 semget().3 2.2.2信号量的操作 semop().4 2.2.3信号量的控制 semctl().6 3 需求分析7 4 整体设计8 4.1 概要设计 8 4.2 程序流程图及运行结果 . 8 实验结果.14 总 结.15 参考文献.16 附 录.17 1 1 课程设计的目的及要求 1.1 课程设计的目的 某寺庙中有小和尚、老和尚若干人。庙内有一水缸,由小和 尚提水入缸,供老和尚饮用。水缸可容纳 30 桶水,每次入水、 取水仅为 1 桶,不可同时进行。水取自同一水井,水井路窄,每 次只能容纳一个水桶取水,
4、设水桶个数为 5 个。和尚挑水问题就 是使用某种机制,能够使得若干名老和尚可以顺利地喝到水,若 干名小和尚之间能够有条不紊地往水缸中入水。 本课程设计的目的是使用 Linux 的信号量机制编程解决和尚 挑水问题,通过本课程设计掌握 Linux 进程创建的方法,掌握信 号量的使用方法。 1.2 课程设计的要求 本课题所设计的系统要求实现以下功能。 编写 2 个程序,程序 1 创建 3 个子进程,分别编号 A、B、 C, 用于模拟 3 名老和尚; 程序 2 创建 3 个子进程, 分别编号 C、 D、E,用于模拟 3名小和尚。通过向屏幕输出语句模拟取水过程, 如输出“目前水缸水量为 10 桶”表示目
5、前水缸中有存水 10桶; 输出“小和尚取水成功”表示从水井中成功取到 1 桶水;输出 “小和尚倒 1 桶水到水缸中”表示小和尚将 1 桶水倒入水缸 中。通过观察输出语句,可以发现执行过程是否发成冲突。 使用 Linux 的信号量机制,编写解决和尚挑水问题的代码。 要求给出编译所用到的 makefile 文件。 2 2 准备工作 2.1 硬件及软件需要 CentOS6.4 gcc 编译器 vim 编辑器 2.2 了解信号量及信号量的系统调用函数: 2.2.1 信号量定义 最简单的信号量是一个只有 0 与 1 两个值的变量,二值信号 量。这是最为通常的形式。具有多个正数值的信号量被称之为通 用信号
6、量。在本章的其余部分,我们将会讨论二值信号量。 P 与 V 的定义出奇的简单。假定我们有一个信号量变量 sv, 两个操作定义如下: P(sv) 如果 sv 大于 0,减小 sv。如果 sv 为 0,挂起这个进程的 执行。 V(sv) 如果有进程被挂起等待 sv,使其恢复执行。如果没有进行 被挂起等待 sv,增加 sv。 信号量的另一个理解方式就是当临界区可用时信号量变量 sv 为 true, 当临界区忙时信号量变量被 P(sv)减小, 从而变为 false, 当临界区再次可用时被 V(sv)增加。注意,简单的具有一个我们可 以减小或是增加的通常变量并不足够,因为我们不能用 C,C+或 是其他的编程语言来表述生成信号,进行原子测试来确定变量是 否为 true,如果是则将其变为 false。这就是使得信号量操作特 殊的地方。 3 信号量函数定义如下: #include intsemctl(intsem_i