操作系统的优先读者和优先写着的读者/写着问题

来源:互联网 发布:阿里云别名解析 编辑:程序博客网 时间:2024/05/16 06:51

读者写着是由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);
}
}

0 0
原创粉丝点击