“操作系统实验”实验报告

信号量的实现和应用

实验名称:信号量的实现和应用 实验日期:2021/7/6 班级:软嵌192 姓名:单志鹏 学号:1930110819 一、实验目的 加深对进程同步与互斥概念的认识; 掌握信号量的使用,并应用它解决生产者——消费者问题; 掌握信号量的实现原理。 二、实验环境 liunx-11 三、实验内容 在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题; 在 0.11 中实现信号量,用生产者—消费者程序检验之。 3.1 用信号量解决生产者—消费者问题 在 Ubuntu 上编写应用程序“pc.c”,解决经典的生产者—消费者问题,完成下面的功能:

建立一个生产者进程,N 个消费者进程(N>1); 用文件建立一个共享缓冲区; 生产者进程依次向缓冲区写入整数 0,1,2,...,M,M>=500; 消费者进程从缓冲区读数,每次读一个,并将读出的数字从缓冲区删除,然后将本进程 ID 和 + 数字输出到标准输出; 缓冲区同时最多只能保存 10 个数。 一种可能的输出效果是:

10: 0 10: 1 10: 2 10: 3 10: 4 11: 5 11: 6 12: 7 10: 8 12: 9 12: 10 12: 11 12: 12 …… 11: 498 11: 499 copy 其中 ID 的顺序会有较大变化,但冒号后的数字一定是从 0 开始递增加一的。

pc.c 中将会用到 sem_open()、sem_close()、sem_wait() 和 sem_post() 等信号量相关的系统调用,请查阅相关文档。

《UNIX 环境高级编程》是一本关于 Unix/Linux 系统级编程的相当经典的教程。如果你对 POSIX 编程感兴趣,建议买一本常备手边。

哈尔滨工业大学校园网用户可以在 ftp://run.hit.edu.cn/study/Computer_Science/Linux_Unix/ 下载,后续实验也用得到。

3.2 实现信号量 Linux 在 0.11 版还没有实现信号量,Linus 把这件富有挑战的工作留给了你。如果能实现一套山寨版的完全符合 POSIX 规范的信号量,无疑是很有成就感的。但时间暂时不允许我们这么做,所以先弄一套缩水版的类 POSIX 信号量,它的函数原型和标准并不完全相同,而且只包含如下系统调用:

sem_t *sem_open(const char *name, unsigned int value); int sem_wait(sem_t *sem); int sem_post(sem_t *sem); int sem_unlink(const char *name); copy sem_open() 的功能是创建一个信号量,或打开一个已经存在的信号量。 sem_t 是信号量类型,根据实现的需要自定义。 name 是信号量的名字。不同的进程可以通过提供同样的 name 而共享同一个信号量。如果该信号量不存在,就创建新的名为 name 的信号量;如果存在,就打开已经存在的名为 name 的信号量。 value 是信号量的初值,仅当新建信号量时,此参数才有效,其余情况下它被忽略。当成功时,返回值是该信号量的唯一标识(比如,在内核的地址、ID 等),由另两个系统调用使用。如失败,返回值是 NULL。 sem_wait() 就是信号量的 P 原子操作。如果继续运行的条件不满足,则令调用进程等待在信号量 sem 上。返回 0 表示成功,返回 -1 表示失败。 sem_post() 就是信号量的 V 原子操作。如果有等待 sem 的进程,它会唤醒其中的一个。返回 0 表示成功,返回 -1 表示失败。 sem_unlink() 的功能是删除名为 name 的信号量。返回 0 表示成功,返回 -1 表示失败。 在 kernel 目录下新建 sem.c 文件实现如上功能。然后将 pc.c 从 Ubuntu 移植到 0.11 下,测试自己实现的信号量。 四、实验过程及数据记录 在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题; 在 0.11 中实现信号量,用生产者—消费者程序检验之。 四.实验过程及结果 1、信号量代码实现

(1)新建实现信号量函数的源代码文件sem.c。

(2)同时,在linux-0.11/include/linux目录下新建sem.h,定义信号量的数据结构。

sem.h代码 图片描述 sem.c代码 图片描述 图片描述 图片描述 图片描述 2、实现信号量的系统调用 1)在unistd.h中添加系统调用编号: 图片描述 system_call.s中的系统调用数修改为76 图片描述 修改sys.h增加4个函数: 图片描述 (4)修改Makefile: 图片描述 图片描述 3.编写生产者-消费者检验程序 (1)新建pc.c文件 图片描述 图片描述 图片描述 图片描述 (2)编译并运行 图片描述 图片描述 图片描述 五、实验结果分析 实验结果基本与预期结果一致,因此,本次实验很成功 六、实验心得 通过本次实验我掌握了信号量的实现和应用的方法,我相信掌握这项技能可以为我以后的实验打下基础。在更进一步完善对操作系统知识的学习的同时,也加深了对Linux语言的熟悉。这次的实验有难度,但是在查阅资料后,可以解决。

最新评论
暂无评论~