OS第6次实验报告:使用信号量解决进程互斥访问
时间:2020-05-29
本文章向大家介绍OS第6次实验报告:使用信号量解决进程互斥访问,主要包括OS第6次实验报告:使用信号量解决进程互斥访问使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 计算1812
- 江雄鹏
- 201821121043
目录
一、实验目的
通过编程进一步了解信号量。
二、实验内容
在服务器上用Vim编写一个程序:使用信号量解决任一个经典PV问题,测试给出结果,并对解释运行结果。
- 生产者-消费者问题
- 读者-写者问题
- 哲学家进餐问题
三、实验报告
1. 选择哪一个问题
选择读者-写者问题
(1)情况:对象在多个线程之间共享,一些线程只读数据,一些线程只写数据。为保证写入和读取的正确性,操作限制:
- 写-写互斥和读-写互斥,即不能有两个写者同时进行写操作和不能同时有一个线程在读,而另一个线程在写。
- 读-读允许,即可以有一个或多个读者在读。
(2)解决方案:读者优先或写者优先。
2. 给出伪代码
(1)读者优先
void* writer(void* arg) 17 { 18 int i = *(int*)arg; 19 printf("the process%dwant to write\n",i); 20 sem_wait(&mutex2); 21 writecount++; 22 if(writecount==1) //若第一个为写者,阻止后续的读者 23 sem_wait(&r); 24 sem_post(&mutex2); 25 sem_wait(&w);//写者互斥 26 printf("the process%dis writing\n",i); 27 sleep(4); 28 printf("the process%dhas written\n",i); 29 sem_post(&w); 30 sem_wait(&mutex2); 31 writecount--; 32 if(writecount==0) sem_post(&r);//所有的写者写完才能让P(r)的读者readcount增加 33 sem_post(&mutex2); 34 } 35
(2)写者优先
void* reader(void* arg){ 37 int i = *(int*)arg; 38 printf("the process%dwant to read\n",i); 39 sem_wait(&mutex3); 40 sem_wait(&r); 41 sem_wait(&mutex1); 42 readcount++; 43 if(readcount==1)//若第一个为读者,互斥写者 44 sem_wait(&w); 45 sem_post(&mutex1); 46 sem_post(&r); 47 sem_post(&mutex3); 48 printf("the process%dis reading\n",i); 49 sleep(2); 50 printf("the process%dhas read\n",i); 51 sem_wait(&mutex1); 52 readcount--; 53 if(readcount==0)//读者运行完释放写者,读写互斥 54 sem_post(&w); 55 sem_post(&mutex1); 56 57 }
3. 完整代码
4. 运行结果并解释
解释:0~7一共8个进程,进程1等待进程0完成写入后进行读取;当进程2想要读取时,此时进程1还在读取,所以进程2能够实现与进程1同时读取;进程3想要写入,得等进程1和2读取完毕才能开始写入;当进程4、5、6想要读取时,只有当进程3完成写入才能读取;当进程7想要写入时,因为写入与读写的操作不能同时进行,所以只有等待进程4,5,6读取完毕后,进程7才能写入。
原文地址:https://www.cnblogs.com/0606jxp/p/12988867.html
- 那些年Struts 1.X 而今我还是不会
- 关于MySQL DNS解析探究之一:DNS解析确实在起作用
- 每一个程序员需要了解的10个Linux命令
- 实战案例 | 使用机器学习和大数据预测心脏病
- 关于JVM直接内存触发Full GC
- 极客DIY:通过树莓派发送摩斯码
- Hadoop SequnceFile.Writer 压缩模式及压缩库浅析
- Thrift抛直接内存OOM一点解决思路
- 小顶堆Java实现
- Tomcat源码分析一:源码导入
- 如何使用Metasploit对安卓手机进行控制
- 关于MySQL DNS解析探究之二:unauthenticated user
- Thrift Direct Memory OOM问题解决方法
- Mapreduce程序中reduce的Iterable参数迭代出是同一个对象
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- poiAndEasyExcel学习(一)
- IP地址与子网划分
- HDFS异构存储简介
- Milvus 实战 | 基于 Kubernetes 的分布式集群部署方案
- Linux Bash基础(二)
- poiAndEasyExcel学习(二)
- poiAndEasyExcel学习(三)
- poiAndEasyExcel学习(四)
- 使用OpenCV为视频中美女加上眼线
- 论文精读|5th|YOLO v3的新特性|目标检测|附下载
- 算法集锦(9)|自动驾驶|道路图像增强算法
- 基于OpenCV实现海岸线变化检测
- 爬取bilibili再也不用头疼了,bilibili-api一步到位!
- 「React」很多人在滥用 state
- == 与equals和hashCode与equals