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

信号量的实现和应用

实验名称:信号量的实现和应用

实验日期:2022年5月28日

班级:软嵌201

姓名:胥千里

学号:2030110754

一.实验目的

1.加深对进程同步与互斥概念的认识;

2.掌握信号量的使用,并应用它解决生产者——消费者问题;

3.掌握信号量的实现原理

二.实验环境

cd ~/oslab tar -zxvf hit-oslab-linux-20110823.tar.gz -C /home/shiyanlou ls -al

三.实验内容

1.在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题;

2.在 0.11 中实现信号量,用生产者—消费者程序检验之。

四.实验过程及数据记录

首先准备实验环境

图片描述

1.在linux-0.11/kernel目录下,新建实现信号量函数的源代码文件sem.c。同时,在linux-0.11/includenux目录下新建sem.h,定义信号 量的数据结构

(1)设置sem.c

图片描述

(2)设置sem.h

图片描述

2.实现信号量的系统调用

(1)在unistd.h中添加系统调用编号:

图片描述

(2)将system_call.s中的系统调用数修改为76:

图片描述

(3)修改sys.h 要在linux-0.11/includenux/sys.h中,声明这4个新增的函数。 修改代码如下:

图片描述

(4)修改linux-0.11/kernel目录下的Makefile 修改代码如下:

图片描述

(5)挂载hdc,将unistd.h复制到usr/include下,将sem.h复制到usr/includenux下。

sudo ./mount-hdc

图片描述

4.编写生产者-消费者检验程序

(1)在usr/root下新建pc.c

图片描述

5.编译linux,运行bochs

make all

图片描述

./run

图片描述

./pc > sem_output

关闭linux-0.11,挂载虚拟磁盘,查看我们的文件(当然也可以在linux-0.11中直接查看,只是显示内容多时会错乱,需要反复按Ctrl+L刷 新):

sudo ./mount-hdc

sudo less hdc/usr/rootm_output

五.实验结果分析

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

六.实验心得

本次实验主要掌握信号量的实现和应用,需要完成两个任务:(1)在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题;(2)在 linux-0.11 中实现信号量,用生产者—消费者程序检验之。通过本次实验的完成,我加深了对进程同步与互斥概念的认识,同时掌握了信号量的使用,并应用它解决生产者——消费者问题;掌握了信号量的实现原理。

2.(1). 在linux0.11系统的应用程序中,注释不能写//,必须要写/* */

(2). 不能在程序中间对变量定义,比如使用循环时的i要在开始定义,所有变量都必须要在一开始统一定义。

3.满足互斥要求:当lock=false,进程1判断TestAndSet返回false,执行临界区,其他进程此时申请临界区,判断TestAndSet返回true 不能执行,进程1执行完 临界区,释放锁。

七.思考题

在 pc.c 中去掉所有与信号量有关的代码,再运行程序,执行效果有变化吗?为什么会这样? 实验的设计者在第一次编写生产者——消费者程序的时候,是这么做的:

这样可行吗?如果可行,那么它和标准解法在执行效果上会有什么不同?如果不可行,那么它有什么问题使它不可行?

1.假设Producer刚生产完一件商品,释放了Mutex,Mutex为1,此时缓存区满了,Empty为0;

2.然后OS执行调度,若又被Producer拿到CPU,它拿到Mutex,使Mutex为0,而Empty为0阻塞,Producer让出CPU,等待Consumer执行V(Empty);

3.而Consumer拿到CPU后,Mutex还为0,要阻塞等待Producer执行V(Mutex);

4.两者相互持有对方需要的资源,造成死锁。 关于实验的设计者在第一次编写生产者——消费者程序时的做法是否可行及一系列问题:

答:去掉所有与信号量有关的代码,再运行程序,执行效果有变化,输出的数字顺序完全混乱。 没有了信号量,进程之间无法同步或者协作,一种情况是缓冲区满了,生产者还在写入数据,会造覆盖掉部分数据。或者缓冲区为空,消费者尝试读取数据,读到的数据是已输出的数据。同时,由于多个进程对文件缓冲区同时访问,极容易造成程序奔溃。

最新评论
暂无评论~