论文部分内容阅读
摘要:在多道程序环境下,进程同步问题十分重要,操作系统引入进程后,进程的异步性在多个进程争用临界资源时会给系统造成混乱,进程同步的主要任务就是使并发执行的各个进程之间能有效地共享各种资源,相互合作,是程序的执行具有可再现性。其中读者写者问题尤其具有代表性,而记录型信号量是一个很好的解决方法。
关键词:信号量 记录式信号量 同步
一、信号量的描述
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。
信号量的取值只能是整数,即把信号量的取值定义为整型量称为整型信号量。最初由荷兰学者Dijkstra定义的,除初始化外,仅能通过两个标准的原子操作(Atomic Operation)wait(S)和signal(S)来访问。这两个操作分别称为P、V操作。wait和signal操作可描述为:
wait(S):while S≤0 do no-op
S∶=S-1;
signal(S):S∶=S+1;
S≥0说明当前有资源可供分配,S≤0无资源。,该两个操作是原子操作,不可中断的执行,当修改某个信号量是,其他进程不可同时对该信号量修改。
在该机制中的wait操作,只要是信号量S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,使进程处于“忙等”的状态。
二、记录型信号量的描述
为了解决“忙等”现象的问题,提出了记录型信号量机制,采用“让权等待”,但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。它所包含的上述两个数据项可描述为:
type semaphore=record/*定义类型为记录型*/
value:integer;
L:list of process;/*进程队列*/
end
相应地,wait(S)和signal(S)操作可描述为:
procedure wait(S)
var S:semaphore;
begin
S.value∶=S.value-1;
if S.value<0 then block(S,L)/*资源数目减一操作后若资源量小于0表示该进程申请不到资源,调用阻塞原语,将该进程挂接到阻塞队列的末尾*/
end
procedure signal(S)
var S:semaphore;
begin
S.value∶=S.value+1;
if S.value≤0then wakeup(S,L);/*系统释放一个资源,资源数目仍然资源量小于等于0,表示存在进程在阻塞队列上,调用激活原语,将该队列的第一个进程激活,从而获得资源继续执行*/
end
三、读者写着问题的提出
以上对记录型信号量的发展,原理做了简单的说明,在一个数据文件或者记录经常被多个进程共享 ,我们分为两个状态,一个是读该文件的进程称为读(Reader)进程,另外一种称为写(Writer)进程.允许多个进程同时读一个共享对象,不允许一个写进程和其他的任何同时访问共享对象。
为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。另外,再设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行Wait(Wmutex)操作
四、读者写着问题的描述
读者-写者问题可描述如下:
Var rmutex, wmutex:semaphore∶=1,1;
Readcount:integer∶=0;
begin
parbegin
Reader:begin/*读者进程*/
repeat
wait(rmutex);
if readcount=0 then wait(wmutex);/*第一个读者要申请互斥信号量wmutex */
Readcount∶=Readcount+1;
signal(rmutex);
…
perform read operation;
…
wait(rmutex);
readcount∶=readcount-1;
if readcount=0 then signal(wmutex);/*最后一个读者要释放互斥信号量wmutex */
signal(rmutex);
until false;
end
writer:begin/*写进程*/
repeat
wait(wmutex);
perform write operation;
signal(wmutex);
until false;
end
parend
end
五、总结
读者写者问题是一个有代表性的进程同步问题,作为初学者要做到透彻理解并不容易,但是如果我们将该问题进行细分,由简单到复杂,理解难度将大大降低。并能在其他的同步问题上有一定得举一反三的作用。
参考文献
[1]Crow ley C P.Operating systems:a design-oriented approach[M].Beijing:World Publishing Co,1999:100-126.
[2]汤小丹,梁红兵,哲凤屏,等.计算机操作系统[M].3版.西安:西安电子科技大学出版社,2007:58-61.
[3]帖军,陆际光.同步互斥机制中的读者-写者模型[J].中南民族大学学报:自然科学版,2005,24.
[4]《现代操作系统Modern Operating Systems》Andrew S.Tanenbaum著,陈向群等译 机械工业出版社1999.
作者简介
林德丽,出生于1983年09月,女,讲师,研究方向:计算机应用技术。
(作者单位:青岛科技大学)
关键词:信号量 记录式信号量 同步
一、信号量的描述
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。
信号量的取值只能是整数,即把信号量的取值定义为整型量称为整型信号量。最初由荷兰学者Dijkstra定义的,除初始化外,仅能通过两个标准的原子操作(Atomic Operation)wait(S)和signal(S)来访问。这两个操作分别称为P、V操作。wait和signal操作可描述为:
wait(S):while S≤0 do no-op
S∶=S-1;
signal(S):S∶=S+1;
S≥0说明当前有资源可供分配,S≤0无资源。,该两个操作是原子操作,不可中断的执行,当修改某个信号量是,其他进程不可同时对该信号量修改。
在该机制中的wait操作,只要是信号量S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,使进程处于“忙等”的状态。
二、记录型信号量的描述
为了解决“忙等”现象的问题,提出了记录型信号量机制,采用“让权等待”,但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。它所包含的上述两个数据项可描述为:
type semaphore=record/*定义类型为记录型*/
value:integer;
L:list of process;/*进程队列*/
end
相应地,wait(S)和signal(S)操作可描述为:
procedure wait(S)
var S:semaphore;
begin
S.value∶=S.value-1;
if S.value<0 then block(S,L)/*资源数目减一操作后若资源量小于0表示该进程申请不到资源,调用阻塞原语,将该进程挂接到阻塞队列的末尾*/
end
procedure signal(S)
var S:semaphore;
begin
S.value∶=S.value+1;
if S.value≤0then wakeup(S,L);/*系统释放一个资源,资源数目仍然资源量小于等于0,表示存在进程在阻塞队列上,调用激活原语,将该队列的第一个进程激活,从而获得资源继续执行*/
end
三、读者写着问题的提出
以上对记录型信号量的发展,原理做了简单的说明,在一个数据文件或者记录经常被多个进程共享 ,我们分为两个状态,一个是读该文件的进程称为读(Reader)进程,另外一种称为写(Writer)进程.允许多个进程同时读一个共享对象,不允许一个写进程和其他的任何同时访问共享对象。
为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。另外,再设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行Wait(Wmutex)操作
四、读者写着问题的描述
读者-写者问题可描述如下:
Var rmutex, wmutex:semaphore∶=1,1;
Readcount:integer∶=0;
begin
parbegin
Reader:begin/*读者进程*/
repeat
wait(rmutex);
if readcount=0 then wait(wmutex);/*第一个读者要申请互斥信号量wmutex */
Readcount∶=Readcount+1;
signal(rmutex);
…
perform read operation;
…
wait(rmutex);
readcount∶=readcount-1;
if readcount=0 then signal(wmutex);/*最后一个读者要释放互斥信号量wmutex */
signal(rmutex);
until false;
end
writer:begin/*写进程*/
repeat
wait(wmutex);
perform write operation;
signal(wmutex);
until false;
end
parend
end
五、总结
读者写者问题是一个有代表性的进程同步问题,作为初学者要做到透彻理解并不容易,但是如果我们将该问题进行细分,由简单到复杂,理解难度将大大降低。并能在其他的同步问题上有一定得举一反三的作用。
参考文献
[1]Crow ley C P.Operating systems:a design-oriented approach[M].Beijing:World Publishing Co,1999:100-126.
[2]汤小丹,梁红兵,哲凤屏,等.计算机操作系统[M].3版.西安:西安电子科技大学出版社,2007:58-61.
[3]帖军,陆际光.同步互斥机制中的读者-写者模型[J].中南民族大学学报:自然科学版,2005,24.
[4]《现代操作系统Modern Operating Systems》Andrew S.Tanenbaum著,陈向群等译 机械工业出版社1999.
作者简介
林德丽,出生于1983年09月,女,讲师,研究方向:计算机应用技术。
(作者单位:青岛科技大学)