> # ♻️ 资源
> **大小:** 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
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010847 本实验旨在让学生动手设计一个进程同步互斥的实验,更深刻的理解进程协作机制。 利用 openEuler 信号量机制,实现读者写者问题的模拟。 在 openEuler 环境下,创建一个包含 n 个线程的控制进程。用这 n 个线程来表示 n 个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制:写-写互斥;读-写互斥;读-读允许; 读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。
资源推荐
资源详情
资源评论
收起资源包目录
100010847-基于C语言实现操作系统进程管理.zip (25个子文件)
os-processmanagement
consumer.exe 232KB
程序说明.docx 11KB
readFirst-test-输出.png 19KB
服务器部署测试.pdf 200KB
虚拟机部署测试.pdf 335KB
test4 47B
LICENSE 1KB
readme.docx 70KB
实验1-读者_写者问题.docx 17KB
writeFirstAfter.exe 233KB
cons-输出.png 17KB
readFirst.exe 233KB
consumer.c 2KB
readFirstBefore.c 4KB
writeFirst.c 4KB
writeFirstAfter-test4-输出.png 24KB
运行环境及部署说明.docx 85KB
test 48B
操作系统实验报告-进程管理.docx 922KB
readFirst.c 4KB
cons 47B
test2 39B
test3 47B
README.md 17KB
writeFirstAfter.c 4KB
共 25 条
- 1
资源评论
神仙别闹
- 粉丝: 3579
- 资源: 7460
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功