实验日期: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.两者相互持有对方需要的资源,造成死锁。 关于实验的设计者在第一次编写生产者——消费者程序时的做法是否可行及一系列问题:
答:去掉所有与信号量有关的代码,再运行程序,执行效果有变化,输出的数字顺序完全混乱。 没有了信号量,进程之间无法同步或者协作,一种情况是缓冲区满了,生产者还在写入数据,会造覆盖掉部分数据。或者缓冲区为空,消费者尝试读取数据,读到的数据是已输出的数据。同时,由于多个进程对文件缓冲区同时访问,极容易造成程序奔溃。
学习时间 544分钟
操作时间 41分钟
按键次数 3458次
实验次数 11次
报告字数 2936字
是否完成 完成