(二十五)操作系统--读者·写者问题

一、问题描述

  有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。

因此要求

  • 允许多个读者可以同时对文件执行读操作;
  • 只允许一个写者往文件中写信息;
  • 任一写者在完成写操作之前不允许其他读者或写者工作;
  • 写者执行写操作前,应让已有的读者和写者全部退出。

  与消费者进程不同,读者进程在读数据后并不会将数据清空,并不会改变数据。因此多个读者可同时访问共享数据。
请添加图片描述

  读进程与写进程同时共享数据,可能导致读出的数据不一致的问题。
请添加图片描述

  两个写进程同时共享数据,可能导致数据错误覆盖的问题。
请添加图片描述

二、问题分析

1.关系分析

  找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  两类进程:写进程、读进程
  互斥关系:写进程-写进程、写进程―读进程。读进程与读进程不存在互斥问题。

2.整理思路

  根据各进程的操作流程确定P、V操作的大致顺序
  写者进程和任何进程都互斥,设置一个互斥信号量 rw,在写者访问共享文件前后分别执行P、v操作。读者进程和写者进程也要互斥,因此读者访问共享文件前后也要对rw执行P、v操作。
  如果所有读者进程在访问共享文件之前都执行P(rw)操作,那么会导致各个读进程之间也无法同时访问文件。

3.设置信号量

  设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

4.注意

读者写者问题的核心思想――怎么处理该问题呢?
  P(rw)和 v(rw)其实就是对共享文件的“加锁”和“解锁”。既然各个读进程需要同时访问,而读进程与写进程又必须互斥访问,那么我们可以让第一个访问文件的读进程“加锁”,让最后一个访问完文件的读进程“解锁”。可以设置一个整数变量count来记录当前有几个读进程在访问文件。

三、代码实现

1.代码

semaphore rw=1;  //用于实现对文件的互斥访问。表示当前是否有进程在访问共享文件
int count =0;  //记录当前有几个读进程在访问文件
s
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
读者-写者问题是一种经典的并发控制问题,其主要目的是在多个进程或线程同时访问共享资源时,保证数据的一致性和完整性。在操作系统中,读者-写者问题常常出现在多个进程或线程同时访问共享文件或数据库时。 以下是一种基于信号量的解决方案: 1. 定义两个全局变量 readcount 和 writecount,分别表示当前正在取的进程数和正在写入的进程数。 2. 定义三个信号量:mutex、read_sem 和 write_sem。 - mutex:用于实现互斥访问 readcount 和 writecount。 - read_sem:用于控制进程的访问权限。 - write_sem:用于控制写入进程的访问权限。 3. 进程的代码: ``` P(read_sem); // 请求取权限 P(mutex); // 保证 readcount 的互斥访问 readcount++; if (readcount == 1) { P(write_sem); // 如果当前没有进程,请求写入权限 } V(mutex); V(read_sem); // 释放取权限 // 取共享资源的代码 P(mutex); // 保证 readcount 的互斥访问 readcount--; if (readcount == 0) { V(write_sem); // 如果当前没有进程,释放写入权限 } V(mutex); ``` 4. 写进程的代码: ``` P(write_sem); // 请求写入权限 P(mutex); // 保证 writecount 的互斥访问 writecount++; V(mutex); // 写入共享资源的代码 P(mutex); // 保证 writecount 的互斥访问 writecount--; V(mutex); V(write_sem); // 释放写入权限 ``` 上述代码中,P() 和 V() 分别表示请求信号量和释放信号量的操作。Mutex 用于实现互斥访问,保证 readcount 和 writecount 的正确性。Read_sem 和 write_sem 用于控制进程和写进程的访问权限,保证读写的顺序正确。 这种解决方案可以有效地避免读者写者同时访问共享资源,保证数据的正确性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤傲倾城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值