首页 > 其他分享 >读者写者问题(读者优先、公平竞争、写者优先)

读者写者问题(读者优先、公平竞争、写者优先)

时间:2024-06-22 19:58:41浏览次数:10  
标签:count 优先 read 写者 互斥 mutex 读者

1.读者优先

        当有读者进程进行读时,允许多个读者同时读,但不允许写者写;当有写者进程进行写时,不允许其他写者写,也不允许读者读

读者算法:
p(r_mutex);  //申请修改read_count
if read_count==0:
    p(mutex);  //获得读文件的权限
read_count++;
V(r_mutex);



阅读;



//阅读结束
p(r_mutex);
read_count--;
if read_count==0:
    V(mutex);  //最后一个读者阅读完毕,释放文件权限
V(r_mutex);   
写者算法:
p(mutex); //请求写文件的权限


进行写操作;


v(mutex);  //释放权限

r_mutex:实现读者互斥修改read_count

mutex:实现读者和写者互斥操作文件

        如果还有读者在读的话,那就一直抓住mutex,实现读者的鱼贯而入,此时若写者想要进行写的话,也只能等最后一个读者释放mutex。

2.公平竞争

        读者进程运行时,允许多个读者同时读,但不允许写者写;写者进程运行时,不允许其他写者写,也不允许读者读。

        同时,读者与写者公平竞争,即读者与写者先来先得,谁先来,谁就排在前面

读者算法:
p(s);  //请求外围互斥量s
p(r_mutex); //请求修改read_count
if read_count == 0:
    p(mutex); //请求内围互斥量mutex,实现多个读者同时读
read_count++;
v(r_mutex);
v(s);  //释放外围互斥量

阅读;

//阅读结束

p(r_mutex);
read_count--;
if read_count==0: //表示最后一个读者阅读完毕
    v(mutex);
v(r_mutex);
写者算法:
p(s);  //请求外围互斥量
p(mutex);  //请求内围互斥量


进行写操作

v(mutex);
v(s);

相较于读者优先算法,引入了互斥信号量s,每一个读者想要进行读操作时,都要和写者一样先申请一下s。

一旦当写者申请s后,读者就无法成功申请到s,只能进入阻塞队列等待,避免了读者鱼贯而入导致写者无法进行写的现象。

s控制了读者进入的过程

3.写者优先

        写者的优先级高于读者,读者在等待的时候,此时若有写者想要进行写,那么读者只能进行让路,让写者插队进行写操作

读者算法:
p(x);
p(s);  //请求外围互斥量s
p(r_mutex); //请求修改read_count
if read_count == 0:
    p(mutex); //请求内围互斥量mutex,实现多个读者同时读
read_count++;
v(r_mutex);
v(s);  //释放外围互斥量
v(x);

阅读;

//阅读结束

p(r_mutex);
read_count--;
if read_count==0: //表示最后一个读者阅读完毕
    v(mutex);
v(r_mutex);
写者算法:
p(w_mutex); //申请修改write_count
if write_count==0:
    p(s);  //申请s,把s抓住
v(w_mutex);
p(mutex);  //申请文件操作权限

进行写操作

v(mutex);
p(w_mutex);
write_count--;
if write_count==0:
    v(s); 释放外围互斥量s
v(w_mutex);

        在写者算法里,增加的和读者优先里读者的算法类似,增加了一个write_count来抓住s。

        当读者在读的时候,若第一个写者想要进行写,那么就会p(s),申请s,抓住s,此时读者无法在接着加入队列进行读。

        当有其他写者在进行写的时候,若有写者想要进行写操作,那么他只需要等上一个写者释放mutex即可

        在读者算法里,新加了一个互斥量x

        为什么要多引入一个x?假设没有x,去掉p(x),v(x)。试想如下这种情形:一个读者申请到了s,但还没释放s,此时若先来一个读者,又来了一个写者,读者先p(s),申请s,写者由于是第一个,所以也要p(s),当上面第一个读者v(s)后,此时若系统将s分配给了先到达的读者,那么读者就会优先了

标签:count,优先,read,写者,互斥,mutex,读者
From: https://blog.csdn.net/m0_72904009/article/details/139883960

相关文章

  • 【广度优先搜索 深度优先搜索 图论】854. 相似度为 K 的字符串
    本文涉及知识点广度优先搜索深度优先搜索图论图论知识汇总深度优先搜索汇总C++BFS算法LeetCode854.相似度为K的字符串对于某些非负整数k,如果交换s1中两个字母的位置恰好k次,能够使结果字符串等于s2,则认为字符串s1和s2的相似度为k。给你两个字母......
  • C/C++ stack实现深度优先搜索DFS算法详解及源码
    深度优先搜索(DepthFirstSearch,DFS)是一种图遍历算法,它从一个节点开始,通过访问其相邻节点的方式,依次深入到图中的更深层次。Stack(栈)是一种先进后出(LastInFirstOut,LIFO)的数据结构,它非常适合实现DFS算法。首先,我们来解释一下Stack实现DFS算法的原理。DFS算法的核心思想是......
  • 优先级队列(堆)的知识点详解
    目录1.优先级队列1.1概念2.优先级队列的模拟实现2.1堆的概念2.2堆的存储方式2.3堆的创建2.3.1堆向下调整2.4堆的插入与删除2.4.1堆的插入2.4.2堆的删除3.常用接口介绍3.1PriorityQueue的特性3.2PriorityQueue常用接口介绍1.优先级队列1.1概念前......
  • CSS新手入门笔记【导入方法、选择器介绍、选择器优先级、属性详细介绍、盒子模型】
    目录一、目的与优势二、CSS导入方式三、语法结构四、选择器类型基本选择器组合选择器伪类与伪元素属性选择器六、选择器优先级总结六、CSS属性1.字体与文本属性2.背景属性3.尺寸与盒模型属性4.布局与定位5.列表样式6.边框与轮廓7.文本装饰与效果8.动画与过渡......
  • 微任务和宏任务之间的优先级
    微任务和宏任务的优先级关系微任务优先宏任务事件循环JavaScript是一种单线程语言,这意味着它一次只能执行一个任务。事件循环是管理这些任务的机制,它包含以下几个重要步骤:执行全局代码:当一个脚本加载和执行时,全局代码首先执行。执行栈(CallStack):这是一个LIFO(LastIn,Fi......
  • 多叉树的DFS深度优先遍历,回溯法的基础算法之一
    一、前言多叉树一般用于解决回溯问题。想必大家都学过二叉树,以及二叉树的深度优先遍历和广度优先遍历,我们思考:能不能将二叉树的DFS转化为多叉树的DFS?二、多叉树的结构多叉树的本质,就是一棵普通的树,比如下图:如果忽略将来的变化,那么,这棵树可以认为是一个未满的4叉树。......
  • FreeRTOS简单内核实现6 优先级
    0、思考与回答0.1、思考一如何实现RTOS内核支持多优先级?因为不支持优先级,所以所有的任务都插入了一个名为pxReadyTasksLists的就绪链表中,相当于所有任务的优先级都是一致的,那如果我们创建一个就绪链表数组,数组下标代表优先级,优先级为x的任务就插入到pxReadyTasksLists[x......
  • 阅读者如何验证收到的PDF文档的真实性和完整性,判断是否为原作者所发布或是否已被在改
    阅读者如何验证收到的PDF文档的真实性和完整性,判断是否为原作者所发布或是否已被在改动?只有用数字证书签名,这是一种确保文档完整性和验证作者身份的有效方式。如果原作者在发布PDF前对其进行了数字签名,任何后续的修改都会导致签名失效,阅读者在打开文件时会收到警告,提示文件已被......
  • 算法3.1—深度优先搜索
    P1219[USACO1.5]八皇后CheckerChallenge#includeusingnamespacestd;typedeflonglongll;intn,l[50],r[50],vis[50],a[50];intans;voiddfs(intx){if(x>n){if(ans<3)for(inti=1;i<=n;i++)cout<<a[i]<<''......
  • BFS(广度优先搜索)优化技巧 — 双向遍历
    BFS优化技巧—双向遍历在之前我发过动态规划框架与动态规划的优化技巧—空间压缩,类似的,BFS框架也有相应的优化技巧双向遍历。从技巧的名字就可以看出,双向遍历指的就是从起点开始找终点的同时,也从终点开始找起点,一旦两个寻找过程出现交集,那么起点到终点的路径也就找出......