操作系统 读者 - 写者问题

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

读者 - 写者问题

问题描述

一个数据文件或记录,可被多个进程共享,但仅允许进程要么做“读操作”,要么做“写操作“,不允许进程同时进行读写操作。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个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
486 0
操作系统之多线程编程—读者优先/写者优先详解
|
Java 程序员 编译器
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
1.读者—写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? ​2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
操作系统实验多线程编程中的读者优先和写者优先
操作系统实验多线程编程中的读者优先和写者优先
|
3月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
110 0
Vanilla OS:下一代安全 Linux 发行版
|
29天前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
100 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
21天前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
57 7
|
22天前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
49 5
|
23天前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
3月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
121 4