(二十五)操作系统--读者·写者问题
创始人
2024-06-01 05:46:50
0

文章目录

  • 一、问题描述
  • 二、问题分析
    • 1.关系分析
    • 2.整理思路
    • 3.设置信号量
    • 4.注意
  • 三、代码实现
    • 1.代码
    • 2.改进代码
  • 四、总结

一、问题描述

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

因此要求

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

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

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

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

二、问题分析

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;  //记录当前有几个读进程在访问文件
semaphore mutex = 1;  //用于保证对count变量的互斥访问writer (){while(1){P(rw);  //写之前“加锁”写文件...v (rw);  //写之后"解锁”}
}reader {while(1){P(mutex);  //各读进程互斥访问countif(count==0)P(rw) ;  //第一个读进程负责“加锁"count++;  //访问文件的读进程数+1v (mutex);读文件....P(mutex);   //各读进程互斥访问countcount--;  //访问文件的读进程数-1if(count==O)v(rw);  //最后一个读进程负责"解锁”v(mutex);}
}

  若两个读进程并发执行,则两个读进程有可能先后执行P(rw),从而使第二个读进程阻塞的情况。
  解决方法:出现上述问题的原因在于对count变量的检查和赋值无法一气呵成,因此可以设置另一个互斥信号量来保证各读进程对count的访问是互斥的。
  潜在的问题:只要有读进程还在读,写进程就要一直阻塞等待,可能“饿死”因此,这种算法中,读进程是优先的。

2.改进代码

semaphore rw=1;  //用于实现对文件的互斥访问
int count = 0;  //记录当前有几个读进程在访问文件
semaphore mutex = 1;  //用于保证对count变量的互斥访问
semaphore w = 1;  //用于实现“写优先”writer {while(1){P(w);P(rw);写文件…v(rw);v(w);}
}reader (){while(1){P(w);P(mutex);if(count==0)P(rw);count++;v (mutex);v(w);读文件...P(mutex);count--;if(count==O )v(rw);v(mutex);}
}

分析以下并发执行P(w)的情况

  • 读者1→读者2
  • 写者1→写者2
  • 写者1→读者1
  • 读者1→写者1→读者2
  • 写者1→读者1→写者2

  结论:在这种算法中,连续进入的多个读者可以同时读文件;写者和其他进程不能同时访问文件;写者不会饥饿,但也并不是真正的“写优先”,而是相对公平的先来先服务原则。有的书上把这种算法称为“读写公平法”。

四、总结

  读者-写者问题为我们解决复杂的互斥问题提供了一个参考思路。
  其核心思想在于设置了一个计数器count用来记录当前正在访问共享文件的读进程数。我们可以用count的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理。
  另外,对 count变量的检查和赋值个能一气呵成导致了一些错误,如果需要实现“一气呵成”,自然应该想到用互斥信号量。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...