操作系统——读者写者问题

读者写者问题:

声明:本博客有参考王道考研的《操作系统》

核心思想:设计了一个count的计数器,判断当前进程是否为第一个/最后一个进程,从而做不同的处理。


Describe:

有一个文件F,所有读者可以对其共享阅读(同时阅读),写者不能同时写,读者和写者也不能同时进行。

分析:

两进程: 读者、写者
进程关系: 读者——读者[非互斥]、 读者——写者[互斥]、 写者——写者[互斥]

(仅供参考,欢迎指正):
①设置信号量

semaphore rw=1;         //用于实现对文件的互斥访问,当前是否有进程访问文件
semaphore mutex=1;     //保证读者计数器之间互斥访问
int count=0;           //记录当前读者是否唯一
semaphore w=1;         //用于实现“写优先”

②P、V操作

writer(){
	while(true){
	   P(w);
	   P(rw);  //写者先test,当前文件是否有其他进程访问
	   写文件...V(rw);  //完成写操作,释放“锁”
	   V(w);
	}
}

reader(){
	while(true){
	P(w);
       P(mutex);    //各进程互斥访问count,实现多个读者同时读取
          if(count==0) //当前是否是唯一一位读者
            P(rw);       //首位读者负责“加锁”   **********************************为什么要加mutex
            count++;     //读者人数加1
       V(mutex);
    V(w);
	   读文件...;
	   P(mutex);    //各进程互斥访问count
	        count--;
	        if(count==0)
	          V(rw);       //最后一个进程负责“解锁”
       V(mutex);
	}
}

注释:
①当第一个读者进行互斥加锁后,第二个读者再P(rw)处进入,此时count还是0,又执行P(rw)加锁,这样后者无法与第一个读者共同读操作,必须等第一位结束。加上mutex后可以在第一位读者进行完加锁(count 0---->1)之后再进行读就可以同时进行了。因为count成了1,后者不需要再次P(rw).
总结:
1、“读写公平法”关于“写优先”的一点解释:写优先也是先来先服务原则,当读者1在读时,写者1等其完成后可进行读,如果此时来了读者2并且没有
w控制,那么读者2会插队到写者1前面;这样如果加入w,就是可以保证在写者1工作完后读者2再来读操作。
2、难点:
第一位读者要加锁:不允许其他写者访问
最后一位读者要解锁:允许其他写者访问
而且,读者之间可以同时读操作

说明:如有错误欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows2000环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制(包括读者优先和写者优先): 1)写-写互斥,即不能有两个写者同时进行写操作。 2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。, 3)读-读允许,即可以有一个或多个读者在读。 读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 2测试数据文件格式 测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者,w表示写者。第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共 享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。 下面是一个测试数据文件的例子: 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5.1 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值