操作系统 读者 - 写者问题

简介: 操作系统 读者 - 写者问题

读者 - 写者问题

问题描述

一个数据文件或记录,可被多个进程共享,但仅允许进程要么做“读操作”,要么做“写操作“,不允许进程同时进行读写操作。image.png

问题分析

读者到来时:

  1. 若没有进程访问临界区,读者可以进入
  2. 若有读者在访问临界区,有写者在等待,读者可以进入(读者优先)
  3. 若有写者在访问临界区,读者等待

写者到来时:

  1. 若没有进程访问临界区,写者可以进入
  2. 若有进程在访问临界区,写者等待

总结:

  1. 读者与读者之间不互斥(无关系)
  2. 读者与写者之间互斥
  3. 读者与读者之间互斥

记录型信号量解决

实现思路

  • 因为写者进程与其他进程均为互斥关系,故设置互斥信号量:wmutex,来实现写者进程的互斥
  • 因为读者进程之间可以同时访问资源,所以可以设置整型变量:readcount,用于记录目前共同访问资源的读者进程数目
  • 因为添加:readcount整型变量,其可以同时被一个或多个读者进程访问,故此时readcount成为了临界资源。为了实现readcount的互斥访问,引入互斥信号量:rmutex
  • 因为通过分析存在,读者优先的条件,故读者进程对互斥信号量wmutex的影响应该是:读者进程的第一个(readcount == 0)对wmutex进行上锁,读者进程的最后一个(readcount == 0)对wmutex进行解锁

代码实现

semaphore wmutex = 1, rmutex = 1;
int readcount = 0
void reader(){
  do{
    wait(rmutex);  //readcount的互斥访问
    if(readcount == 0)
      //第一个读者进程对wmutex上锁
      wait(wmutex);
    readcount++;
    signal(rmutex);
    ……
    perform read operation;
    ……
    wait(rmutex);
    readcount--;
    if(readcount == 0)
      //最后一个读者进程对wmutex解锁
      signal(wmutex);
    signal(rmutex);
  }while(TRUE);
}
void writer(){
  do{
    wait(wmutex);
    ……
    perform write operation;
    ……
    signal(wmutex);
  }while(TRUE);
}
void main(){
  cobegin;
    writer();
    reader();
  coend;
}

信号量集解决

增加问题难度:限制同时访问资源的读者数目,假设同时最多访问资源的读者数目为RN

实现思路

  • 为了实现读者数目的限制,引入信号量L,并对其赋予初值RN。Swait(L, 1, 1),每次一个读者进程访问,便会使得L减一,最低值不得小于1,便可决定,一次最多只能有RN个读者进程;此操作便可代替readcount的一系列操作
  • 引入开关信号量:mx,当mx = 1,表示无写操作,若读进程进入,则不消耗mx,保证其余读者进程可以进入;若写进程进入,消耗mx,当mx = 0,表示正在进行写操作,其余进程均不能进入
  • Swait(mx, 1, 1; L, RN, 0):写者进程的wait,表示目前没有写进程,L = RN 同时也没有任何一个读进程

代码实现

int RN;
semaphore L = RN, mx = 1;
void reader(){
  do{
    Swait(L, 1, 1);
    Swait(mx, 1, 0);  //不消耗mx
    ……
    perform read operation;
    ……
    Ssignal(L, 1);
  }while(TRUE);
}
void writer(){
  do{
    Swait(mx, 1, 1; L, RN, 0);
    ……
    perform write operation;
    ……
    Ssignal(mx, 1);
  }while(TRUE);
}
void main(){
  cobegin;
  reader();
  writer();
  coend;
}


目录
相关文章
|
安全 测试技术
操作系统实验之多线程操作之读者优先与写者优先第二版
操作系统实验之多线程操作之读者优先与写者优先第二版
操作系统实验之多线程操作之读者优先与写者优先第二版
操作系统实验多线程编程中的读者优先和写者优先
操作系统实验多线程编程中的读者优先和写者优先
|
测试技术 Windows
操作系统之多线程编程—读者优先/写者优先详解
创建一个包含n 个线程的控制台进程。用这n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
277 0
操作系统之多线程编程—读者优先/写者优先详解
|
Java 程序员 编译器
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
1.读者—写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? ​2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
|
15天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
29 0
|
16天前
|
Linux 编译器 开发者
Linux设备树解析:桥接硬件与操作系统的关键架构
在探索Linux的庞大和复杂世界时🌌,我们经常会遇到许多关键概念和工具🛠️,它们使得Linux成为了一个强大和灵活的操作系统💪。其中,"设备树"(Device Tree)是一个不可或缺的部分🌲,尤其是在嵌入式系统🖥️和多平台硬件支持方面🔌。让我们深入了解Linux设备树是什么,它的起源,以及为什么Linux需要它🌳。
Linux设备树解析:桥接硬件与操作系统的关键架构
|
1月前
|
Linux 数据安全/隐私保护 虚拟化
Linux技术基础(1)——操作系统的安装
本文是龙蜥操作系统(Anolis OS) 8.4 的安装指南,用户可以从[龙蜥社区下载页面](https://openanolis.cn/download)获取ISO镜像。安装方法包括物理机的光驱和USB闪存方式,以及虚拟机中的VMware Workstation Pro设置。安装过程涉及选择语言、配置安装目标、选择软件集合和内核,设置Root密码及创建新用户。安装完成后,可通过文本模式或图形化界面验证系统版本,如Anolis OS 8.4,标志着安装成功。
|
1月前
|
存储 缓存 算法
Linux--系统结构与操作系统
Linux--系统结构与操作系统
|
1月前
|
Linux 网络安全 数据安全/隐私保护
如何在 VM 虚拟机中安装 CentOS Linux 9 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 CentOS Linux 9 操作系统保姆级教程(附链接)
161 0
|
1月前
|
缓存 Linux Shell
Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)
Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)
52 1