读者-写者问题

文章目录

        • 1 问题描述
        • 2 问题分析
        • 3 代码实现

1 问题描述

有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。

因此要求:

①允许多个读者可以同时对文件执行读操作;
②只允许一个写者往文件中写信息;
③任一写者在完成写操作之前不允许其他读者或写者工作;
④写者执行写操作前,应让已有的读者和写者全部退出。
在这里插入图片描述

2 问题分析

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。

两类进程:写进程、读进程
互斥关系:写进程一写进程、写进程一读进程。读进程与读进程不存在互斥问题。

  1. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序
  1. 写者与任何进程互斥,用互斥信号量的PV操作即可解决,读者问题较为复杂,它必须在实现与写者互斥的同时实现与其他读者的同步,因此一对简单的PV操作是无法解决问题;
  2. 这里用到一个计数器,用它判断当前是否有读者读文件,当有读者时,写者无法写文件,此时读者一直占用文件,当没有读者时,写者才可以写文件;
  3. 同时不同读者对计数器的访问也是互斥的。
  1. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
semaphore rw=1; //用于保证读者和写者对共享文件的互斥访问 
int count = 0; //用于记录当前有几个读进程访问在共享文件 
semaphore mutex = 1;//用于保证对count数量的互斥访问

3 代码实现

semaphore rw=1;       //用于保证读者和写者对共享文件的互斥访问 
int count = 0;        //用于记录当前有几个读进程访问在共享文件 
semaphore mutex = 1;  //用于保证对count数量的互斥访问writer(){whlie(1){P(rw);      //互斥访问共享文件写入;V(rw);     //释放共享文件}
}reader(){whlie(1){P(mutex)             //互斥访问count变量if(count==0)P(rw);       //阻止写进程写入count++;V(mutex);    //释放互斥变量count读取;P(mutex);     //互斥访问count变量count--if(count==0)      //当最后一个读进程读完共享文件V(rw);     //允许写进程写V(mutex);    //释放互斥变量count       }
}

分析:上述代码中读进程优先,即当存在读进程时,写操作将会被延迟,且只要有一个读进程活跃,随后而至的读进程都将会被允许访问文件,这样的方式会导致写进程可能长时间等待,且存在写进程饿死情况

若希望写进程优先,即当有读进程正在访问共享文件时,有写进程请求访问,这是应禁止后续读进程的请求,等到已在共享文件中的读进程执行完毕,立即让写进程执行,只有在无写进程执行的情况下才允许读进程再次运行。
为此,增加一个信号量并在上面程序的writer()reader()函数中各增加一对PV操作,即可得到写进程优先的解决程序。

semaphore rw=1;       //用于保证读者和写者对共享文件的互斥访问 
int count = 0;        //用于记录当前有几个读进程访问在共享文件 
semaphore mutex = 1;  //用于保证对count数量的互斥访问
semaphore w=1;        //实现写进程优先writer(){whlie(1){P(w);       //在无写进程请求时进入P(rw);      //互斥访问共享文件写入;V(rw);     //释放共享文件V(w);       //恢复对共享文件的访问}
}reader(){whlie(1){P(w);       //在无写进程请求时进入P(mutex)          //互斥访问count变量if(count==0)P(rw);     //阻止写进程写入count++;V(mutex);    //释放互斥变量countV(w);       //恢复对共享文件的访问读取;P(mutex);     //互斥访问count变量count--if(count==0)      //当最后一个读进程读完共享文件V(rw);     //允许写进程写V(mutex);    //释放互斥变量count       }
}

读者-写者问题为我们解决复杂的互斥问题提供了一个参考思路
其核心思想在于设置一个计数器count用来记录当前正在访问共享文件的读进程数。我们可以用count值来判断当前进入的进程是否谁第一个/最后一个读进程,从而做出不同的处理

另外,对count变量的检查和赋值不能一气呵成会导致一些错误,若需要实现一气呵成,自然需要设置互斥信号量
最后还需认真体会如何解决“写进程饥饿”问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9 操作系统第二章 进程管理 管程

文章目录1 管程1.1 为什么引入管程1.2 管程的定义和基本特征1.3 管程小结1 管程 1.1 为什么引入管程 产生原因:信号量机制存在的问题:编写程序困难、易出错 能不能设计一种机制,让程序员写程序是不需要再关注复杂的PV操作,使得代…

2021年世界科技进展100项

来源:三思派 作者:李万,钱娅妮1生命、生物、医药健康01新冠疫情1. 首次看清新冠患者体内蛋白质变化中国科学家分析出新冠肺炎死亡患者体内多器官组织样本中蛋白质分子病理全景图,相当于将医生在显微镜下看到的人体感染新冠病毒后细…

图灵奖获得者、信息安全常青树Adi Shamir:从密码学到AI对抗性样本研究|智源大会嘉宾风采...

来源:智源大会导读:RSA 算法是通信、金融产业中被广泛使用的安全基本机制,是信息时代的支柱技术。而在这个跨时代算法背后的设计者之一,正是密码学先驱 Adi Shamir。除了RSA 公钥密码算法以外,零知识证明、差分密码分析…

11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式

文章目录1 内存概念1.1 内存作用1.2 逻辑地址VS物理地址1.3 装入的三种方式1.3.1 绝对装入1.3.2 可重定位装入1.3.3 动态重定位装入1.4 链接的三种方式1.4.1 静态链接1.4.2 装入时动态链接1.4.3 运行时动态链接1.5 内存的基础知识小结2 内存管理2.1 内存管理的任务2.2 内存保护…

Nature长文:打破AI黑盒的“持久战”

来源:大数据文摘2020年2月,随着 COVID-19在全球迅速传播且抗原检测难以获得,一些医生转向人工智能(AI)来尝试诊断病例。一些研究人员采用深度神经网络通过查看X射线和胸部计算机断层扫描(CT)扫描来快速区分患有COVID-19肺炎的人和未患肺炎的人…

12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理

文章目录1 基本分页存储管理1.1 什么是分页存储1.2 重要的数据结构——页表1.3 基本地址变换机构1.4 具有快表的地址变换机构1.4.1 什么是快表(TLB)1.4.2 引入快表后,地址的变换过程1.4.3 地址变换过程小结1.5 两级页表1.5.1 单级页表存在的问…

13 操作系统第三章 内存管理 虚拟内存 请求分页管理方式 页面置换算法 页面分配策略

文章目录1 虚拟内存1.1 传统存储管理方式的特征、缺点1.2 局部性原理1.3 虚拟内存主要特征1.4 如何实现虚拟内存技术1.5 虚拟内存的基本概念小结2 请求分页管理方式2.1 页表机制2.2 缺页中断机构2.3 地址变换机构2.4 请求分页管理方式小结3 页面置换算法3.1 最佳置换算法 OPT3.…

视觉意识的主动推理模型

来源:CreateAMind论文介绍:在这里,我们旨在通过推进全球神经元工作区的扩展(预测性全球神经元工作区(PGNW))来克服这些限制,该工作区将 GNW 的基本方面与更近期的(贝叶斯)主动推理方法相结合,以理解大脑功能。具体来说,我们提出了一个基于主动推理的视觉…

14 操作系统第四章 文件管理 文件逻辑结构 文件目录结构

文章目录1 初识文件管理1.1文件属性1.2 文件内部的数据应该怎样组织起来?1.3 文件之间应该怎样组织起来?1.4 操作系统应该向上提供哪些功能?1.5 文件应如何存放在外存?1.6 文件系统总览2 文件逻辑结构2.1 文件分类2.2 顺序文件2.3…

AlphaFold 和 AI 蛋白质折叠革命的下一步是什么

来源:ScienceAI编辑:萝卜皮十多年来,分子生物学家 Martin Beck 团队一直在努力拼凑世界上最难的拼图游戏之一:人类细胞中最大分子机器的详细模型。这种被称为核孔复合体的庞然大物控制着分子进出细胞核的流动,也就是基…

15 操作系统第四章 文件管理 文件的物理结构 文件存储空间管理

文章目录1 文件的物理结构 (文件分配方式)1.1 文件块、磁盘块1.2 文件分配方式——连续分配1.3 文件分配方式——链接分配1.3.1 链接分配——隐式链接1.3.2 链接分配——显式链接1.3.3 链接分配(总结)1.4 文件分配方式——索引分配…

专访微软Greg Yang,构建神经网络的底层语言,探索AI的“万物理论”

来源:智源社区为了进一步解读这一工作背后的意义,智源社区采访了论文一作、微软研究院高级研究员Greg Yang(杨格)。采访中,我们不仅了解了Transfer的背景,以及项目背后更为远大的目标,也了解到了…

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

文章目录1 文件的基本操作1.1 创建文件1.2 删除文件1.3 打开文件1.4 关闭文件1.5 读文件1.6 写文件1.7 文件基本操作小结2 文件共享2.1 基于索引结点的共享方式(硬链接)2.2 基于符号链的共享方式(软链接)2.3 文件共享小结3 文件保…

人工智能与量子计算在有前途的新忆阻器中融合

来源:ScienceAI编辑:萝卜皮近年来,计算在两个主要方面取得了进步——机器学习方面的突破,以开发通过经验自动改进的算法,以及对理论上证明比任何超级计算机更强大的量子计算机的研究。现在,科学家们已经创建…

17 操作系统第四章 磁盘管理 磁盘的结构 磁盘调度算法 减少磁盘延迟时间的方法

文章目录1 磁盘的结构1.1 磁盘、磁道、扇区1.2 磁盘如何读取数据1.4 盘面、柱面、磁盘的物理地址1.5 磁盘的分类1.6 磁盘的结构小结2 磁盘调度算法2.1 一次磁盘读/写操作需要的时间2.2 先来先服务算法(FCFS)2.3 最短寻找时间优先(SSTF&#x…

深度学习准备「爆破」著名的欧拉方程

来源:ScienceAI编辑:绿萝250 多年来,数学家一直试图「爆破」物理学中一些最重要的方程:那些描述流体如何流动的方程。如果他们成功了,那么他们将会发现一种情况,在这种情况下,这些方程会被打破—…

18 操作系统第五章 设备管理 IO设备的基本概念和分类 IO控制器 IO控制方式 IO软件层次结构 IO核心子系统 假脱机技术 设备的分配与回收 缓冲区管理

文章目录1 IO设备的基本概念和分类1.1 什么是I/O设备1.2 I/O设备分类2 IO控制器2.1 I/O设备组成2.2 I/O控制器功能2.3 I/O控制器的组成2.4 寄存器编址方式2.5 IO控制器小结3 IO控制方式3.1 程序直接控制方式3.2 中断驱动方式3.3 DMA方式3.3.1 DMA控制器3.3.2 DMA方式3.4 通道控…

Nature发布第一张人类造血干细胞发育的全面路线图

来源:生物通加州大学洛杉矶分校(UCLA)的科学家创建了一份史无前例的路线图,追踪了人类胚胎中造血干细胞发育的每一步,为人们在实验室中生产功能齐全的造血干细胞提供了蓝图。来自胚胎主动脉壁的人类造血干细胞这项研究…

1 计算机组成原理第一章 计算机系统概述 计算机发展历程、层次结构、性能指标

文章目录1 计算机发展历程1.1 软硬件发展1.2 分类以及发展方向2 计算机系统层次结构2.1 计算机系统组成2.1.1 硬件的基本组成2.1.2 软件系统2. 2 CPU及其工作过程2.2.1 运算器2.2.2 控制器2.2.3 计算机的工作过程2.2.4 计算机系统层次结构2.2.5 存储器3 计算机性能指标3.1 容量…

Google 与 GitHub 结盟,为保护软件供应链而战!

出品:CSDN(ID:CSDNnews)整理:章雨铭 责编:屠敏4月7日,据谷歌透露,它一直在跟GitHub合作,创建一种防伪方法,用于签署源代码,解决像影响Solar…