> # ♻️ 资源
> **大小:** 1.76MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010847**](https://www.yuque.com/sxbn/ks/100010847)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87453183**](https://download.csdn.net/download/s1t16/87453183)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 操作系统实验实验一:进程管理
**摘要**:本次实验完成了读者-写者实验中的修改输入,在修改输入的过程中发现了原文件在读者优先和写者优先中的bug。因此在所给文件基础上进行修改,修复了目前发现的bug。接着完成了生产者-消费者实验,完成的实验任务为课堂讲解的一道例题,家长给小孩分水果,小孩从盘子中拿水果的过程。
# 读者-写者实验
## 实验目的
本实验旨在让学生动手设计一个进程同步互斥的实验,更深刻的理解进程协作机制。
openEuler 提供了互斥量(pthread_mutex_t)、信号量(sem_t)等同步对象和相应的系统调用,用于线程的互斥与同步。学生可通过对读者写者问题的调试或者生产者消费者问题的调试(选做其一即可),了解 openEuler 中的同步、互斥机制。
## 实验描述
利用 openEuler 信号量机制,实现读者写者问题的模拟。
在 openEuler 环境下,创建一个包含 n 个线程的控制进程。用这 n 个线程来表示 n 个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:
1. 写-写互斥;
2. 读-写互斥;
3. 读-读允许;
读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。
## 实验要求及内容
### 实验具体内容
复现代码,并修改输入数据,分析结果。
### 实验原理
**读者优先**
在 readFirst.c 中,首先读取目标文件 test,为每一行请求创建一个线程,其中读请求创建读者线程,写请求创建写者线程,调用 pthread_create()函数。引入计数器 reader_count 对读进程计数,writer_count 对写进程计数。 mutex 是互斥信号量。
读者优先需要引入一个状态变量 state,表明当前系统的状态。需要用到的几个状态量如下:
- mutex:保证 readercount, writercount, state 变量访问的互斥性
- Sig_read:允许读的信号量
- Sig_wrt:允许写的信号量
读者优先的设计思想是读进程只要看到有其它读进程正在读,就可以继续进行读;写进程必须等待所有读进程都不读时才能写,即使写进程可能比一些读进程更早提出申请。该算法只要还有一个读者在活动,就允许后续的读者进来,该策略的结果是,如果有一个稳定的读者流存在,那么这些读者将在到达后被允许进入。而写者就始终被挂起,直到没有读者为止。
**写者优先**
在 writeFirst.c 中,首先读取目标文件 test,为每一行请求创建一个线程,其中读请求创建读者线程,写请求创建写者线程,调用 pthread_create()函数。引入计数器 reader_count 对读进程计数,writer_count 对写进程计数。 mutex 是互斥信号量。
写者优先需要引入一个状态变量 state,表明当前系统的状态。需要用到的几个状态量如下:
- mutex:保证 readercount, writercount, state 变量访问的互斥性
- Sig_read:允许读的信号量
- Sig_wrt:允许写的信号量
写者优先的设计思想是在一个写者到达时如果有正在工作的读者,那么该写者只要等待正在工作的读者完成,而不必等候其后面到来的读者就可以进行写操作。该算法当一个写者在等待时,后到达的读者是在写者之后被挂起,而不是立即允许进入。
## 实验设备环境
openEuler 服务器和虚拟机。
## 实验步骤
1.修改输入test,修改如下:
```
1 R 2 2
2 W 3 4
3 W 4 2
4 R 5 3
5 R 6 5
6 W 7 4
```
2.利用winSCP连接到服务器,将文件和test文件上传
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716338705875-e114fe67-f645-4a52-b006-07d21b2bdb87.png#averageHue=%23f4f2f0&from=url&id=yTa09&originHeight=782&originWidth=1615&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
3.进行理论分析
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716338705945-a23ee222-b2c6-4408-a523-e4cbae0d2afa.png#averageHue=%23f3f2e4&from=url&id=DQiNh&originHeight=1000&originWidth=1226&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
4.首先编译读者优先,进行运行
- 编译:gcc readFirst.c -o readFirst.out -l pthread -std=c99
- 运行:./readFirst.out < test
5.调试程序bug
运行之后真是给我了一个大大的“惊喜”,我竟然发现程序bug了呀,在我这个输入时,程序会在11s时被卡住,如下:
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716338706015-16a95f5e-a0d4-4668-bf7b-9e4658a6fcc6.png#averageHue=%230b0b0b&from=url&id=D8WlU&originHeight=344&originWidth=771&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
后来与理论分析后得知,发现在第8秒的时候r5没有start to read,根据分析得知,此时因为写者进程执行完之后只会释放一个sig_read,因此r5就没有机会执行了。这也将导致read_count一直大于0,sig_write信号也没法释放,因此整个程序就会卡住了。因此,我们需要解决的问题在于:怎么在写者进程进来的读者进程可以给到正确的sig_read?
6.关于读者进程怎么修改,目前想到了两种修改的方式,
一是在等到sig_read之后,判断现在的read_count是否大于1,若大于1的话则增加sig_read信号,其中需要注意的是,如果读者进程执行完了,需要sig_read信号清0,防止影响到后面的进程。
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716338706073-79130dea-400b-4de8-8527-51d937948276.png#averageHue=%23fbf9f8&from=url&id=OvQT0&originHeight=105&originWidth=492&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716338706205-e98122f1-b7f7-4a97-84da-7963cdd03a35.png#averageHue=%23f9f4f2&from=url&id=kAs5l&originHeight=63&originWidth=517&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
二是在写者进程执行完之后,发现有几个read_count就释放几个read_count。
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716338706275-98d136f0-d518-40e6-9837-429fe3a4027d.png#averageHue=%23caa682&from=url&id=UqEEG&originHeight=117&originWidth=667&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
(后来发现这一点在写者优先的程序中其实有哦)
修改后的结果为:
![](https://cdn.n
神仙别闹
- 粉丝: 4189
- 资源: 7485
最新资源
- 用于检测网络物理系统重放攻击的动态加密解密方案
- 一套简单好用开源免费的Java CMS内容管理系统/一整套优质的开源生态内容体系/基于SpringBoot2/前端Vue3/element plus/提供上百套模板,同时提供实用的插件/
- 两级式单相光伏并网仿真(注意版本matlab 2021a) 前级采用DC-DC变电路,通过MPPT控制DC-DC电路的pwm波来实现最大功率跟踪,mppt采用扰动观察法,后级采用桥式逆变,用spwm波
- 基于springboot的教师工作量管理系统源码(java毕业设计完整源码+LW).zip
- 计算物理课程试题解析及其Matlab实现实例
- 适合小白入门的Fortran中文教程学习
- MATLAB代码:电力系统火电机组组合,遗传算法求解,考虑爬坡约束备用约束等,完美解决该类问题
- 基于springboot的小徐影城管理系统源码(java毕业设计完整源码+LW).zip
- 计算机网络命令与Wireshark数据分析实战
- 计算机网络实验:TCP和UDP协议的实现分析
- kotlin 语言基础学习《PDF文档》
- 基于springboot的学科竞赛管理源码(java毕业设计完整源码+LW).zip
- usb redirector,可以通过网络将windows的usb设备重定向到另一台主机,比如hyper-v这种不支持USB的虚拟机,或网络上的其它的主机
- 基于springboot的海滨体育馆管理系统的设计与实现源码(java毕业设计完整源码+LW).zip
- IoT DC3 是一个基于 Spring Cloud 的 100% 完全开源的、分布式的物联网(IoT)平台,用于快速开发物联网项目和管理物联设备,是一整套物联系统解决方案
- Object-C基础教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈