操作系统 读者 - 写者问题

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

读者 - 写者问题

问题描述

一个数据文件或记录,可被多个进程共享,但仅允许进程要么做“读操作”,要么做“写操作“,不允许进程同时进行读写操作。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个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
459 0
操作系统之多线程编程—读者优先/写者优先详解
|
Java 程序员 编译器
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
1.读者—写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? ​2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
操作系统实验多线程编程中的读者优先和写者优先
操作系统实验多线程编程中的读者优先和写者优先
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
53 0
Vanilla OS:下一代安全 Linux 发行版
|
26天前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
51 4
|
1月前
|
人工智能 安全 Linux
|
5月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
2月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
4月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
134 3