操作系统经典同步问题——读者-写者问题和哲学家进餐问题

1.读者-写者问题

问题描述一个数据文件或者记录可以被多个进程共享,我们只要要求读该进程的成为“Reader进程”,其他进程称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或者Writer进程同时访问共享对象。

简单来描述就是可以同时多个读者一起读但是一旦写者开始写那么读者或者其他写者就不可以再进行访问了。

关于写者

我们发现在这个问题当中,写者是和写者互斥的同时他也是跟读者互斥的所以我们可以知道它是一个对所有都互斥的进程。所以我们对他的操作就简单了我们只需要一个互斥信号量就可以解决这个问题。

我们设置一个互斥信号量Wmutex即可解决这个问题

Writer(){

while(1){

P(Wmutex)

进行写操作

V(Wmutex)

}
}

关于读者

我们发现在这个问题当中读者是和读者同步的但是他是跟写者互斥的。我们在这种情况下设置一个用来记录读者数量的readcount的变量根据读者的数量来进行判读如果读者的数量>0那么这时只可以进行读者的访问写者的访问时不可以的每一次进行对写者的操作时都需要我们先判断readcount的数值。我们同样也为读者设置一个互斥信号量rmutex

Reader(){

while(1){

p(rmutex) //各读进程互斥访问readcount

if(readcount==0) p(Wmutex) //当前没有读者就可以进行写者的操作

readcount++ //读者申请的话需要数量加一

v(rmutex) 

读文件...           //上面这一部分使得多个读者能够同时访问接下来读进程结束要出来

P(rmutex);//各读进程互斥访问raeadcount

readcount--;//每当一个读进程完成读操作,读者数量-1

if(readcount==0)  //当前没有读者就可以进行写者的操作

V(wmutex);//当没有读者,读操作结束后,写进程解锁

V(rmutex);

}

}

2.哲学家进餐问题

5个哲学家共用一张圆桌,分别坐在圆桌的周围5张椅子上,在圆桌上有5个筷子注意是5个不是5双和5个碗。哲学家平时要思考只有饿了才会吃饭。只有它拿到两只筷子才可以吃饭。

mutex[5] = {1,1,1,1,1};         //初始化信号量

philosopher(){

while(1) {

P(mutex[i]);    //拿左边的筷子

P(mutex[(i+1)%5]);//拿右边的筷子

进餐...

V(mutex[i]);//放回左边的筷子

V(mutex[(i+1)%5]);//放回右边的筷子
}
}
但是上面会出现死锁的情况当每个哲学家都拿了左边的筷子那么没人能拿到右边的筷子那么就会出现死锁的问题。关于这个问题我们有三种解决方案

(1)最多让4个哲学家同时去拿左边的筷子那么这样肯定会有一个哲学家可以用餐用完餐之后释放筷子其他人也可以正常使用了。

(2)哲学家必须同时可以拿到左右两只筷子时才允许他拿起筷子进餐

(3)给哲学家标记序号,奇数号哲学家拿左边筷子再拿右边筷子而偶数号哲学家则相反。那么按照规定1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子,即所有哲学家都先竞争奇数号筷子再竞争偶数号筷子最终肯定有一个哲学家可以拿到两只筷子进餐。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Nginx三】——Nginx实现反向代理

系列文章目录 【Nginx一】——Nginx介绍(正向代理 反向代理 负载均衡 动静分离) 【Nginx二】——Nginx常用命令 配置文件 Nginx如何处理请求 【Nginx三】——反向代理系列文章目录前言一、反向代理是什么?二、Nginx实现反向代理1.tomcat环境…

Redis高频40问

Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的&#xf…

【Spring Cloud Alibaba】11.链路追踪(SkyWalking)

文章目录简介什么是链路追踪什么是SkyWalking功能列表整体架构单机搭建步骤安装数据存储源基于Docker安装Elasticsearch基于Docker安装MySQL基于Docker配置SkyWalking OAPElasticsearch 方式MySQL方式创建数据库下载mysql-connector-java创建参数说明配置SkyWalking Agent下载解…

shiro

目录 1.简介 2.shiro的组成 3.结构 3.1外部结构 3.2内部结构 4.shiro中的过滤器 5.shiro中的jsp标签 6.基于shiro的认证 6.1引入依赖 6.2web.xml配置 6.3添加spring的配置文件applicationContext-shiro.xm 6.4完成登录方法 6.5完成认证方法 7.授权 7.1使用xml进…

odoo owl 边学边练 动态控制子组件

odoo owl 边学边练 动态控制子组件 根组件控制一个子组件(DemoComponent)。它记录其所有生命周期方法。尝试通过单击或通过/单击两个主按钮,然后查看控制台中的内容发生 代码: js: const { Component, useState, mount, useComponent, onWillStart, onMounted, onWill…

基于AI分词模型,构建一个简陋的Web应用

文章目录前言1. 效果展示2. 应用设计3. 实现3.1. lac分词模型的服务化部署3.2 使用Flask构建app4. 小结前言 内容纯属个人经验,若有不当或错误之处,还请见谅,欢迎指出。 文中大致介绍了,如何快捷地使用PaddleHub服务化部署一个简…

【从零开始学习 UVM】3.5、UVM TestBench架构 —— UVM Sequencer [uvm_sequencer]

文章目录 Usage(用法)Custom Sequencer(自定义sequencer)Class Hierarchy一个 sequencer 生成数据事务作为类对象并将其发送到driver以执行。建议扩展uvm_sequencer基类,因为它包含了允许sequence与driver通信所需的所有功能。基类是由可以被sequencer处理的requset和resp…

全局事件总线

全局事件总线作用就是实现组件间通信,就像对讲机一样 首先:我们如何让所有的组件都能访问到x,我们可以使用window绑定,但是发现以后我们都要依赖于window这个对象;还有种方式就是在vc它的源码上即,prototy…

带你弄明白c++的4种类型转换

目录 C语言中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast RTTI 常见面试题 这篇博客主要是帮助大家了解和学会使用C中规定的四种类型转换。首先我们先回顾一下C语言中的类型转换。 C语言中的类型转换 在C语言中,如果赋…

电商一站式管理后台必备工具:电商API接口,网络爬虫、数据抓取、批量处理订单

随着网络的发展,网络购物已经成为人们的日常生活方式之一。电商们也面对日益强烈的竞争压力。很多电商都会使用一站式后台管理软件,来实现多平台操作,为公司日常管理提升效率。如何实现多电商平台的数据交互呢? 这里就需要用到电…

VectorDraw Developer Framework 10.1003.1 Crack

VectorDraw Developer Framework &#xff08;VDF&#xff09; 10.1003.1.0 添加对“vdPolyface”的纹理支持并提高性能。 23月 2023&#xff0c; 16 - 36&#xff1a;<>新版本 特征 发动机 改进了“GeVisibleArea”和“GetModel2dProjection”性能。带有“ClipBound…

海心沙元宇宙音乐会虚拟主持人玩法再升级,虚拟动力技术全程助力

3月22日晚&#xff0c;由中共广州市委宣传部、广州市文化广电旅游局支持&#xff0c;中共广州市天河区委、广州市天河区人民政府指导的首届湾区元宇宙数字艺术节震撼开幕&#xff0c;一场沉浸式“宙响天河——海心沙元宇宙音乐会”震撼上演&#xff01; 音乐会结合了虚拟主持人…

如何使用 Python Pandas 更新行和列

让我们了解如何使用 Python pandas 更新行和列。 在现实世界中&#xff0c;大多数时候我们没有准备好分析数据集。 可能存在许多不一致、无效值、不正确的标签等等。 话虽如此&#xff0c;更新这些值以实现数据的一致性是非常有必要的。 在本篇文章中&#xff0c;我们将重点介绍…

安装Maven、搭建Maven环境、使用Eclipse创建Maven工程

安装Maven apache官网下载需要的版本&#xff0c;然后解压缩 https://maven.apache.org/download.cgi 也可以选择其他版本 搭建Maven环境 点击此电脑—>属性—>高级系统设置—>环境变量—>新建 新建系统变量 变量名&#xff1a;MAVEN_HOME 值&#xff1a…

基于springboot实现农机电招平台【源码+论文】分享

基于springboot实现农机电招平台演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xf…

使用Vue脚手架(CLI)创建Vue项目并分析项目结构

什么是Vue脚手架&#xff1f; CLI(Command Line Interface)命令行接口工具 vue脚手架是vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;&#xff0c;帮助开发者专门做工程化开发 关于脚手架版本&#xff1a;选择最新的即可&#xff0c;因为最新的可以兼容低版本…

JAVA入门(开发环境和一些概念)

嵌入式为什么学JAVA 为了做安卓开发 JAVA开发环境 建立工程 这里的src是存放JAVA代码的地方&#xff0c;在这里右键&#xff0c;new&#xff0c;class 生成一个Test.java JAVA的第一个helllo world&#xff1a; 运行&#xff1a; 了解下JAVA的周边概念&#xff08;可能被…

华为OD机试题,用 Java 解【自动曝光】问题 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:自动曝光 题目 一个图像有n个像…

【git】将本地项目同步到远程

前提&#xff1a;git已经安装&#xff0c;并与账号完成密钥绑定 在github上创建一个新仓库 在项目文件夹下&#xff0c;右击选择git bash here &#xff0c;打开一个终端对话框 git init (在项目目录下出现隐藏的.git文件夹&#xff0c;目的是把该项目文件夹变成git可管理…

keepalived

一、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么 keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单节点故障。 keepalived工作原理 keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redu…
最新文章