操作系统 读者 - 写者问题

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

读者 - 写者问题

问题描述

一个数据文件或记录,可被多个进程共享,但仅允许进程要么做“读操作”,要么做“写操作“,不允许进程同时进行读写操作。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个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
414 0
操作系统之多线程编程—读者优先/写者优先详解
|
Java 程序员 编译器
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
1.读者—写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? ​2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
操作系统实验多线程编程中的读者优先和写者优先
操作系统实验多线程编程中的读者优先和写者优先
|
2月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
2月前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
1月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
|
2月前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
381 1
阿里云Linux os copilot 运维助手初体验
|
2月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
2月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
141 1