操作系统的优先读者和优先写着的读者/写着问题
2016-09-28 16:28
204 查看
读者写着是由Courtois在1971年提出的一个经典的进程同步问题,他为并发环境下访问一个文件或数据表的数据集建立一个可以普遍使用的模型,对目前广泛运用的多用户或分布式数据库具有直接意义。
读者/写着问题可以分成两种类型,即优先读者的读者/写着问题和优先写着的读者/写着问题
一、优先读者
分析:读者可以共享
写着互斥
除非有一个写着在访问共享数据集,其他情况下,读者不应该等待
写着执行写操作前,应该让所有读者和写着退出。
就是读者是直接访问数据区,而写着需要看数据区里面是否有人,知道没人,才能访问,否则,一直等待。
首先我们需要一个互斥信号量w = 1---写着与写着间,读者与写着间共享的一个信号量,用于读者“加锁”用的,第一个读者一进去,立马让它变成0,就相当于加了一层锁,不让写着进,写着只能在外面等待。直到最后一个读者出来,才让w = 1,相当于“解锁”,这是写着才能进。
因为读者可以直接进,所以我们还要一个用于读者计数的变量ReadCnt = 0,读者之间要访问ReadCnt,因此,我们还要加上一个信号量mutex = 1,用于控制读者之间互斥访问ReadCnt
typedef int semaphore;
semaphore mutex = 1,w = 1;
int ReadCnt = 0;
Process Reader(void)
{
while(1)
{
p(mutex);
ReadCnt++;
if(ReadCnt == 1)
p(w);
v(mutex);
{对数据进行读操作};
p(mutex);
ReadCnt--;
if(ReadCnt == 0)
v(w);
v(mutex);
}
}
Process writer(void)
{
while(1)
{
p(w);
{对数据进行写操作};
v(w);
}
}
二、写着优先
分析:除非读者已经进去进行读操作,否则都是写着优先。
1.我们要设立信号量w = 1,用于第一个读者与写着互斥,(有读者在读操作,写着不能在进去了)
2.设立一个ReadCnt = 0,读者计数,不过只有都是读者情况它才不断计数,当有写着发出写请求了,那些外面的读者只能等待,直到里面读者都出来,然后写着第一个进去。
3.读者间访问共享变量ReadCnt,需要一个互斥信号量mutex = 1,一个一个来访问。
4.需要一个信号量r = 1,用于写着的“加锁”,它是控制第一个写着与读者的互斥。我写着一进去,立马将r = 0,这样读者就不好进去,直到最后一个写着出来,将它变成1,即“解锁”,这样读者才能进去。
5.由于写着可能比较多,设立一个写着计数的WriteCnt = 0。
6.写着计数嘛,肯定需要一个互斥变量进行控制mutex2 = 1,用于一个一个访问共享变量WriteCnt。
typedef int semaphore;
semaphore mutex = 1,mutex2 = 1,w = 1,r = 1;
int ReadCnt = 0,WriteCnt = 0;
Process Reader(void)
{
while(1)
{
p(r); //读者想读之前,先看看有没有写着
p(mutex);
v(r);
ReadCnt++;
if(ReadCnt == 1)
p(w);
v(mutex);
{进行读操作};
p(mutex);
ReadCnt--;
if(ReadCnt == 0)
v(w);
v(mutex);
}
}
Process writer(void)
{
while(1)
{
p(mutex2);
WriteCnt++;
if(WriteCnt == 1)
p(r);
v(mutex2);
{进行写操作};
p(mutex2);
WriteCnt--;
if(WritCnt == 0)
v(r);
v(mutex);
}
}
读者/写着问题可以分成两种类型,即优先读者的读者/写着问题和优先写着的读者/写着问题
一、优先读者
分析:读者可以共享
写着互斥
除非有一个写着在访问共享数据集,其他情况下,读者不应该等待
写着执行写操作前,应该让所有读者和写着退出。
就是读者是直接访问数据区,而写着需要看数据区里面是否有人,知道没人,才能访问,否则,一直等待。
首先我们需要一个互斥信号量w = 1---写着与写着间,读者与写着间共享的一个信号量,用于读者“加锁”用的,第一个读者一进去,立马让它变成0,就相当于加了一层锁,不让写着进,写着只能在外面等待。直到最后一个读者出来,才让w = 1,相当于“解锁”,这是写着才能进。
因为读者可以直接进,所以我们还要一个用于读者计数的变量ReadCnt = 0,读者之间要访问ReadCnt,因此,我们还要加上一个信号量mutex = 1,用于控制读者之间互斥访问ReadCnt
typedef int semaphore;
semaphore mutex = 1,w = 1;
int ReadCnt = 0;
Process Reader(void)
{
while(1)
{
p(mutex);
ReadCnt++;
if(ReadCnt == 1)
p(w);
v(mutex);
{对数据进行读操作};
p(mutex);
ReadCnt--;
if(ReadCnt == 0)
v(w);
v(mutex);
}
}
Process writer(void)
{
while(1)
{
p(w);
{对数据进行写操作};
v(w);
}
}
二、写着优先
分析:除非读者已经进去进行读操作,否则都是写着优先。
1.我们要设立信号量w = 1,用于第一个读者与写着互斥,(有读者在读操作,写着不能在进去了)
2.设立一个ReadCnt = 0,读者计数,不过只有都是读者情况它才不断计数,当有写着发出写请求了,那些外面的读者只能等待,直到里面读者都出来,然后写着第一个进去。
3.读者间访问共享变量ReadCnt,需要一个互斥信号量mutex = 1,一个一个来访问。
4.需要一个信号量r = 1,用于写着的“加锁”,它是控制第一个写着与读者的互斥。我写着一进去,立马将r = 0,这样读者就不好进去,直到最后一个写着出来,将它变成1,即“解锁”,这样读者才能进去。
5.由于写着可能比较多,设立一个写着计数的WriteCnt = 0。
6.写着计数嘛,肯定需要一个互斥变量进行控制mutex2 = 1,用于一个一个访问共享变量WriteCnt。
typedef int semaphore;
semaphore mutex = 1,mutex2 = 1,w = 1,r = 1;
int ReadCnt = 0,WriteCnt = 0;
Process Reader(void)
{
while(1)
{
p(r); //读者想读之前,先看看有没有写着
p(mutex);
v(r);
ReadCnt++;
if(ReadCnt == 1)
p(w);
v(mutex);
{进行读操作};
p(mutex);
ReadCnt--;
if(ReadCnt == 0)
v(w);
v(mutex);
}
}
Process writer(void)
{
while(1)
{
p(mutex2);
WriteCnt++;
if(WriteCnt == 1)
p(r);
v(mutex2);
{进行写操作};
p(mutex2);
WriteCnt--;
if(WritCnt == 0)
v(r);
v(mutex);
}
}
相关文章推荐
- 优先读者/写者问题—操作系统
- 经典操作系统问题――读写者问题(读者优先)
- 操作系统——读者写者问题(读者优先、强写者优先 和 公平竞争)
- 操作系统--信号量经典同步问题之读者优先问题
- 操作系统的优先读者和优先写着的读者/写着问题
- 操作系统进程同步三大问题:生产者消费者,哲学家进餐,读者写者问题
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 读者写者问题之写者优先(java)
- 操作系统—读者写者问题
- 读者-写者问题 写者优先与公平竞争
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- 读者-写者问题 写者优先与公平竞争
- 【经典操作系统问题】读者写者问题分析
- 读者写者问题--使用信号量的读者优先与写者优先程序分析
- 读者写者问题之写者优先
- (转)很有借鉴意义!读者写者问题--使用信号量的读者优先与写者优先程序分析
- 读者-写着问题中写者优先的实现
- IPC之读者写者问题:写者优先
- 好开心呀,能用自己学习知识去做作业了,也算是解决一些问题吧。操作系统实践作业:短作业优先(SJF)和先来先服务算法(FCFS)
- 操作系统——读者写者问题详解