作者简介
:
王俊杰(
1987-
) , 女, 山东潍坊人, 华中师范大学计算机科学系硕士研究生, 研究方向为软件测试、操作系统进程。
读者—写者问题的写者优先算法
王俊杰
(
华中师范大学 计算机科学系, 湖北 武汉
430079)
摘 要: 分析了操作系统中读者
-
写者问题这一进程同步互斥问题, 给出了两种信号量实现的写者优先算法。
关键词: 信号量; 写者优先; 互斥; 共享资源
中图分类号
:
TP312
文献标识码:
A
文章编号:
1672- 7800(2008
)
02- 0142- 03
0
前言
在系统中, 许多进程常常需要共享资源, 而这些资源往往
要求排它性的使用
, 因此进程间需要互斥地使用这些资源。用
常规的程序来实现进程之间同步、互斥关系需要复杂的算法,
而且还会造成“忙等待”, 浪费
CPU
资源。
为此
, 著名的荷兰计算机科学家
Dijkstra
把互斥的关键含
义抽象成信号量
(Semaphore)
概念, 并引入在信号量上的
P
、
V
操
作作为同步原语。
1
读者
-
写者问题及定者优先算法
读者
-
写者问题是一个信号量实现的经典的进程同步互斥
问题。在系统中, 很多竞争的进程试图读写一个数据集中的数
据。多个进程同时读数据是可以接受的, 但是如果一个进程正
在写数据
, 而其它所有进程不能访问该数据, 那么对于写者优
先问题, 就是要求读者写者同时访问时, 写者优先。但是多数教
材给出的是类似下面的程序。
各信号量的含义如下
:
Wcount
用于记录正在等待的写者的个数的整型变量, 初
值为
0
;
Rcount
用于记录正在读的读者个数的整型变量, 初值为
0
;
Wmutex:
用于写计数的互斥信号量
,
初值为
1
;
Rmutex:
用于读计数的互斥信号量
,
初值为
1
;
Read:
用于写进程对读进程的互斥
,
初值为
1
;
Write:
用于读进程对写进程互斥和写进程之间的互斥
,
初
值为
1
。
写者:
begin
p(wmutex);
wcount := wcount +1;
if(wcount==1)
then p(read);
v(wmutex);
p(write);
写数据集
v(write);
p(wmutex);
wcount := wcount - 1 ;
if(wcount==0)
then v(read);
v(wmutex);
end
读者:
begin
p(read);
p(rmutex);
rcount := rcount +1;
if(rcount==1)
then p(write);
v(rmutex);
v(read);
读数据集
p(rmutex);
rcount := rcount - 1;
if(rcount==0)
then v(write);
end
算法分析: 假设有诸多读者
R1,R2,R3
……及诸多写者
W1,
W2,W3
……都要访问数据集, 对以下几种情况的优先、互斥情
况分析如下
:
(
1
) 当写者先到达进入数据集访问, 其先到达的次序为
软 件 导 刊
Software Guide
第
7
卷 第
2
期
2008
年
2
月
Vol.7 No.2
Feb. 2008
评论0