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

信号量的实现和应用

实验目的

加深对进程同步与互斥概念的认识; 掌握信号量的使用,并应用它解决生产者——消费者问题; 掌握信号量的实现原理。

实验环境

本操作系统实验的硬件环境是 IA-32(x86) 架构的 PC 机(在实验楼的环境中就是右侧的窗口),主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码。

本次实验的基本内容是:

在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题; 在 0.11 中实现信号量,用生产者—消费者程序检验之。

实验过程及数据记录

实验环境准备 图片描述

添加信号量系统调用.进入linux-0.11/include目录下,修改文件 图片描述

图片描述

图片描述

新建sem.h 图片描述

在kernel目录中,修改system_call.s 图片描述

在include下的linux目录中,修改sys.h 图片描述

在linux目录下增加,新增sem.c 图片描述

修改makefile 图片描述

图片描述 运行 图片描述

实验结果分析

实验结果基本与预期结果一致。

问题:

在 pc.c 中去掉所有与信号量有关的代码,再运行程序,执行效果有变化吗?为什么会这样? 实验的设计者在第一次编写生产者——消费者程序的时候,是这么做的:这样可行吗?如果可行,那么它和标准解法在执行效果上会有什么不同?如果不可行,那么它有什么问题使它不可行?

答:这样做是可不行的,有造成死锁的可能。不能先对Mutex加锁再对Empty加锁。 假如mutex=1,当前缓冲区为空,full=0,Consumer执行P(Mutex)后又执行P(full),然后producer执行P(mutex),那么full和mutex 的值将永远得不到变化,生产者和消费者陷入死锁。

最新评论
暂无评论~