代码编织梦想

目录

1.问题描述

2.问题分析

3.问题实现

3.1 读者优先

3.2 写者优先

3.3 考虑读者1->写者1->读者2

4.总结


1.问题描述

 要求如下:

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

2.问题分析

核心问题:如何处理多个读者可以同时对文件的读操作。

3.问题实现

3.1 读者优先

初始化

semaphore rw = 1;//实现对文件的互斥访问,表示当前是否有进程在访问共享文件
int count = 0;//记录当前有多少个读进程在访问文件
semaphore mutex = 1;//用于保证对count变量的互斥访问

写者 

writer(){
	while(1){
		P(rw);//写之前加锁
		写文件...
		V(rw);//写之后解锁
		}
	}

 读者

reader(){
	while(1){
		P(mutex);//各读进程互斥访问count
		if(count==0)
			P(rw);//写进程加锁,不允许在读操作过程中执行写操作
        count++;//访问文件读进程数+1
		V(mutex);
		读文件...           //上面这一部分使得多个读者能够同时访问
		P(mutex);//各读进程互斥访问count
		count--;//每当一个读进程完成读操作,读者数量-1
		if(count==0)
			V(rw);//当没有读者,读操作结束后,写进程解锁
		V(mutex);
		}
	}

这种情况下只有源源不断的读进程存在,写进程一直阻塞等待,可能会造成“饿死”,在上述算法中,读进程是优先的。

思考:若两个读进程并发执行,则个读进程可能先后执行P(rw),从而使第二个读进程阻塞的情况。

如何解决:出现上述问题的原因在于对count变量的检查和赋值无法一气呵成

3.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);//各读进程互斥访问count
		if(count==0)
			P(rw);//写进程加锁,不允许在读操作过程中执行写操作
        count++;//访问文件读进程数+1
		V(mutex);
        V(w);
		读文件...           //上面这一部分使得多个读者能够同时访问
		P(mutex);//各读进程互斥访问count
		count--;//每当一个读进程完成读操作,读者数量-1
		if(count==0)
			V(rw);//当没有读者,读操作结束后,写进程解锁
		V(mutex);
		}
	}

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

  • 读者1->读者2 
  • 写者1->写者2 
  • 写者1->读者2 
  • 读者1->写者1->读者2
  • 写者1->读者1->写者2 

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

3.3 考虑读者1->写者1->读者2

第一个读者1在进行到读文件操作的时候,有一个写者1操作,由于第一个读者1执行了V(w),所以写者1不会阻塞在P(w),但由于第一个读者1执行了P(rw)但没有执行V(rw),写者1将会被阻塞在P(rw)上,这时候再有一个读者2,由于前面的写者1进程执行了P(w)但没有执行V(w),所以读者2将会被阻塞在P(w)上,这样写者1和读者2都将阻塞,只有当读者1结束时执行V(rw),此时写者1才能够继续执行直到执行V(w),读者2也将能够执行下去。

4.总结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49370884/article/details/127169986

Linux操作系统--读者写者问题(读者优先)-爱代码爱编程

为什么要进行并发控制 在并发程序中,多个进程或者线程的运行,本来是可以毫无关系的,也就是完全的异步执行,但是现实中往往异步执行不能满足需求 假如只有一个苹果,A和B都要执行吃苹果的程序,如果只是异步执行的话,他们都会认为自己吃完了苹果,但是无法确定到底谁吃到了苹果引出的问题就是并发执行的程序要想对共同的资源进行访问,需要实现同步,才可以保证对于共同资源

四、操作系统——读者写者问题(详解)-爱代码爱编程

一、问题描述: 二、需要满足的条件: 写进程与写进程之间必须互斥的写入数据(因为如果两个写进程同时对共享数据中的区域A中的数据进行写操作的话,会导致数据错误覆盖的问题)写进程与读进程之间必须互斥的访问共享数据(因为写进程与读进程如果同时访问共享数据,可能会导致数据不一致的问题。比如:读进程A想要访问共享数据中的B数据,但是写进程C在读进程A访问B数

读者写者问题详解 操作系统-爱代码爱编程

2.16 读者写者问题 抽象解释 多个进程访问一个共享的数据区读者(读进程)只能读数据,写者(写进程)只能写数据适用于数据库、文件、内存、寄存器等数据区的访问模型如12306购票系统,由于用户量庞大和数据量巨大,不可避免地会出现多个进程同时查询(读)或修改(写)同一条数据的情况2.16.1 读者写者问题的三个约束条件 读者之间不互斥(你和室友可以同时

进程管理的几个经典问题-爱代码爱编程

PV操作 PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1; ②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V(S):①将信号量S的值加1,即S=S+1; ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程

读者写者问题(超详细讲解)看不懂算我输-爱代码爱编程

文章目录 读者写者问题读者优先1.初始化2.写者3.读者写者优先1.初始化2.读者3.写者4.考虑读者1->写者1->读者2的情况 读者写者问题 1.允许多个读者可以同时对文件执行读操作 2.只允许一个写者往文件写信息 3.任一写者在完成写操作之前不允许其他读者后写者工作 4.写者执行写操作前,应该让已有的读者或者写者全部退出

操作系统—读者-写者问题-爱代码爱编程

读者-写者问题是进程同步的经典问题。 要求读读同时,读写互斥,写写互斥。 多个读线程允许同时访问临界资源,读文件。写线程与读线程不能同时使用文件临界资源进行操作,并且多个写线程不能同时对临界资源进行操作。 读者优先 当多个读线程与多个写线程排队时,总是读线程优于写线程先得到文件临界资源使用权。 文件资源用互斥信号量wmutex控制,初始值为1。

操作系统原理:读写者经典同步问题-爱代码爱编程

读者-写者问题的读写操作限制: 写-写互斥,即不能有两个写者同时进行写操作。读-写互斥,即不能同时有一个线程在读,而另一个线程在写。读-读允许,即可以有一个或多个读者在读。一、读者优先 当读者优先时,写文件的线程需要等读文件的线程执行完才可以执行,如果还有在读的线程则写线程需要等待。 理一理读者优先的互斥关系 1)当写文件的时候其他线程都不能访问,

操作系统实验:读者写者问题-爱代码爱编程

一.实验目的:  通过实现读者写者问题理解进程及信号量的概念 二.实验要求: 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。 三.实验内容: 利用多线程模拟读者与写者对临界区的互斥访问。读者和写者问题的读写操作限制:

计算机操作系统学习之读者-写者问题-爱代码爱编程

文章目录 一.问题描述二.问题分析三.小结 一.问题描述 有读者、写者两组并发进程,共享一个文件允许多个读者同时对文件执行读操作任一写者在完成写操作之前都不允许其他读者和写者工作写者执行写操作前,应该让已有的读者和写者全部退出二.问题分析 互斥关系1:写进程和写进程互斥关系2:写进程和读进程读进程和读进程之间不存在互斥问题写进程和任何进程都

操作系统原理实验报告——读者写者-爱代码爱编程

一、实验目的 1.现代操作系统的核心是多道程序设计、多处理器和分布式处理器,这些方案和操作系统设计技术的基础都是并发。当多个进程并发执行时,不论是在多处理器系统的情况下,还是在单处理器多道程序系统中,都会出现冲突和合作的问题。 2.理解操作系统中用互斥和同步解决问题。 3.用信号量机制分别实现读者优先和写者优先的读者-写者问题从而掌握互斥与同步的基本理念

操作系统——读者写者问题(写者优先)-爱代码爱编程

马上就要被关得精神失常了,也许这是我的最后一条博客了吧……() 啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈水文来咯!!!!! 1.什么是读者写者问题 一个数据文件或记录可被多个进程共享;我们把只要求读取该文件的进程称为“读者“,其余称为“写者”。 当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和

操作系统--读写者问题-爱代码爱编程

       一个数据文件或记录可以为多个并发进程所共享。称之需要读该文件或记录的进程为“读者进程”,而更新数据文件中的数据或修改数据的进程为“写者进程”。 读者--写者,写着--读者,写者--写着之间都存在互斥。 解决读者--写者问题一共存在三种方式: (1,读者优先;(这种情况会存在活锁现象,由于读者的不断读取与增多,会使写者一直处于饥饿状态)

读者-爱代码爱编程

一、问题描述 有读者和写者两组并发进程,共享一个文件。 当两个或两个以上的读进程同时访问共享数据时不会产生副作用 但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。 因此要求: 1.允许多个读者可以同时对文件执行读操作; 2.同一时间只允许一个写者往文件中写信息; 3.任一写者在完成写操作之前不允许其