读者写者问题分为三种:读者优先,读写公平(先来先服务),写者优先。

下面给出三种问题的解决方案,并分析。

读者优先

semaphore RCsignal=1;//读者数修改互斥
semaphore mutex=1;//临界资源互斥
int count=0;//读者数读者部分:
reader(){while(1){P(RCsignal);if(count==0)P(mutex);V(RCsignal);读;P(RCsignal);count--;if(count==0)V(mutex);V(RCsignal);}
}写者部分:
writer(){while(1){P(mutex);写;V(mutex);}
}

读写公平(先来先服务)

semaphore mutex=1;
semaphore RCsignal=1;
semaphore rw=1;
int count=0;读者部分:
reader(){while(1){P(rw);P(RCsignal);if(count==0)P(mutex);count++;V(RCsignal);V(rw);读;P(RCsignal);count--;if(count==0)V(mutex);V(RCsignal);}
}写者部分:
writer(){while(1){P(rw);P(mutex);写;V(mutex);V(rw);}
}

写者优先

semaphore write=1;//进程优先互斥
semaphore mutex=1;//临界资源互斥
semaphore RCsignal=1;//读者数Rcount修改互斥
semaphore WCsignal=1;//写者数Wcount修改互斥
int Rcount=0;//读者数
int Wcount=0;//写者数读者部分:
reader(){while(1){P(write);P(RCsignal);if(Rcount==0)P(mutex);Rcount++;V(RCsignal);V(write);读;P(RCsignal);Rcount--;if(Rcount==0)V(mutex);V(RCsignal);}
}写者部分:
writer(){while(1){P(WCsignal);if(WCount==0)P(write);Wcount++;V(WCsignal);P(mutex);写;V(mutex);P(WCsignal);Wcount--;if(Wcount==0)V(write);V(WCsignal);}
}

写者优先的规则:

1.读者与写者,写者与写者不能同时访问缓冲区;
2.无写进程时,各读者可同时访问缓冲区;
3.读者和写者都等待时,写者优先访问缓冲区;

“读者和写者都等待时,写者优先访问缓冲区”解读

读者写者都等待的情况,即有写者正在访问临界资源,而不可能是有读者正在访问临界资源,这是因为有读者在访问临界资源时,后到的写者 只能等待访问临界资源的读者撤出后 才能访问临界资源(读者写者问题的基本原则),而后到的读者可以与前面的读者共同访问临界资源。

写优先代码解读

在读者写者都等待的情况,即有写者正在访问临界资源时,write=0(代码中写了,当访问临界资源的写者撤出时,Wcount=0,才会V(write),使write=0),假如此时按时间顺序又来了读者A,写者B。此时在write=0的情况下,按时间顺序读者A先执行P(write),即读者A被阻塞;然后按时间顺序写者B执行,由于此时Wcount=1,即P(write)语句不会执行,即不会在此阻塞,继续执行直到P(mutex)被阻塞。目前读者A与写者B都处于阻塞状态。但一旦正在访问临界资源的写者退出并执行V(mutex)后,使得mutex=1,并且写者B得知mutex=1,并执行P(mutex),进而进行“写”
此时即实现了,在读者写者都等待时,即有写者正在访问临界资源的情况下,按时间顺序又来了读者A,一个写者B,而执行结果就是,读者A被阻塞,写者B也被阻塞。但一旦正在访问临界资源的写者退出并执行V(mutex)后,写者B进行“写”,即写者B先于读者A,实现了插队。即读者和写者都等待时,写者优先访问缓冲区。

读者写者问题(写者优先)相关推荐

  1. OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)

    一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...

  2. 【操作系统】读者写者问题——写者优先、寿司店问题 题目+答案

    噩梦来啦~ 一]讲解 同步:多进程按一定顺序执行 互斥:多进程操作同一个临界资源 信号量>0,说明它空闲.所测试的线程可以锁定而使用它. 信号量=0,说明它被占用,测试的线程要进入睡眠队列中,等 ...

  3. 操作系统-读者写者问题,写者优先,多个读者可以同时读书(C++实现)

    最近在学习操作系统,对读者写者问题进行了实现,还存在部分问题. 关系:读者与写者互斥.写者与写者互斥  写者优先     临界资源:书(一本)     分析:互斥可用互斥信号量mutex,写者优先可设 ...

  4. 程序员写代码要写注释吗?写你就输了

    前言:在职业发展道路上,需要不断提升自己,需要学习资源的,一起学习交流的欢迎加群[443128517],小编准备了学习视频,学习线路,自学书籍,职业发展视频.也可以加美女老师七七的微信.二维码放在下面 ...

  5. 我同事说我写代码像写诗

    欢迎关注方志朋的博客,回复"666"获面试宝典 把自己平时写代码的习惯跟大家分享一下 1.定义配置文件信息 有时候我们为了统一管理会把一些变量放到yml配置文件中 例如 用 @Co ...

  6. 【手写系列】写一个迷你版的Tomcat

    前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道.这是一只神奇的猫,今天让我来抽象你,实现你! Tomcat Write MyTomcat Tomcat是非常流行的 ...

  7. 【手写系列】写出我的第一个框架:迷你版Spring MVC

    你没有看错标题,今天,我将实现我人生中第一个框架,^_^ 前期准备 我这里要写的是一个迷你版的Spring MVC,我将在一个干净的web工程开始开发,不引入Spring,完全通过JDK来实现. 我们 ...

  8. php说明代码怎么写,代码怎么写 - 起步 - PHP基础 - KK的小故事

    起步 - 代码怎么写 ¶ 作者:KK 发表日期:2016.3.9 要写PHP代码就需要建立.php后缀的文件,并且在文件里要以<?php 具体代码 ?>这样的形式来书写PHP代码 我们在网 ...

  9. [html] 对于写一个页面布局,html/css/js这三者你是先写哪个后写哪个?

    [html] 对于写一个页面布局,html/css/js这三者你是先写哪个后写哪个? 快捷键创建模板html+css写出结构写js做交互 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, ...

  10. 【Elasticsearch】es 别名可写 索引可写 傻傻分不清

    1. 概述 看这个博客,首先明确一句话 索引可写是索引可写 别名可写是别名可写 两者不是一回事 配置不通索引可写 是 index.blocks.write=false,index.blocks.rea ...

最新文章

  1. iOS: 零误差或极小误差的定时执行或延迟执行?
  2. 三菱880彩铅和uni的区别_彩铅测评|150色荷尔拜因彩铅初体验
  3. python 批量更换图片格式脚本
  4. 数据分析基于朴素贝叶斯的书籍评价信息分类
  5. FPGA设计——CMOS摄像与HDMI显示(DVP版)
  6. c#仿QQ安全管家事例(附:源码下载)
  7. loop one image for 10 secs
  8. Java后端学习路线图,你真的只需要这一张
  9. 【Linux】linux清除ip地址命令
  10. 文明与征服新套路,北条点火队
  11. 【游戏客户端】制作节奏大师Like音游(全)
  12. flask+python 实时视频流输出到前台
  13. 模糊特征隶属度及图像增强相关
  14. 安卓App生成签名证书,uniapp生成自有证书打包
  15. 连续系统的时域分析(一)LTI连续系统微分方程解法3——零状态响应的求解方法
  16. 大类资产配置策略(一)恒定混合策略(Constant-mix Strategy)
  17. 有趣的路灯问题——按规律打印图形
  18. 灰狼算法优化LSTM超参数-神经元个数-dropout-batch_size
  19. PHP--根据手机号-淘宝平台获取归属地运营商信息
  20. noip普及组2004 火星人

热门文章

  1. 利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
  2. 2016国庆节装机经验
  3. 2020年UI设计4大趋势全方位分析!
  4. 谈古论津丨河北区白庙
  5. 我SB了,深感懊恼和自责,希望看到本文的朋友,不要再上当受骗了
  6. es6在原生代码的用法_原生JavaScript之es6中Class的用法分析
  7. 简单快速使用阿里云镜像仓库
  8. dism失败 ox800f0818_Win 10 DISM 一直失败,错误: 0x8000ffff - Microsoft Community
  9. 上传图片限制大小问题
  10. VM上搭建IPhone开发环境