问答题 某数据库有一个写进程,多个读进程,它们之间读、写操作的互斥要求是:写进程正在写该数据库时不能有其他进程读该数据库,也不能有其他进程写该数据库;读进程之间不互斥,可以同时读该数据库。请用信号量及P、V操作描述这一组进程的工作过程。
【正确答案】
【答案解析】在本题中,允许读进程同时读数据库,但写进程正在写数据库时不允许其他进程读数据库,也不允许其他进程写该数据库。为了解决读、写进程之间的同步,应设置两个信号量和一个共享变量:读互斥信号量rmutex,用于使读进程互斥地访问共享变量count,其初值为1;写互斥信号量wmutex用于实现写进程与读进程的互斥及写进程与写进程的互斥,其初值为1;共享变量count用于记录当前正在读数据库的读进程数目,初值为0。其工作过程如下:
int rmutex=1;
int wmutex=1;
int count=0;
main() {
cobegin
Reader();
Writer();
coend
}
Reader() {
while(1) {
P(rmutex):
if(count==0)
P(wmutex);//当第一个读进程读数据库时,阻止写进程写;
count++;
V(rmutex):
读数据库;
P(rmutex);
count--;
if(count==0)
V(wmutex);//当最后一个读进程读完数据库时,允许写进程写;
V(rmutex);
}
Writer() {
while(i) {
P(wmutex);
写数据库;
V(wmutex);
}
}
在本题中,要注意对信号量rmutex意义的理解。rmutex是一个互斥信号量,用于使读进程互斥地访问共享变量count。该信号量并不表示读进程的数目,表示读进程数目的是共享变量count。当一个读进程要读数据库时,应将读进程计数count增加1。如果此前(count加1以前)数据库中无读进程,还应对写互斥信号量wmutex做P操作,这样若数据库中无写进程,则通过P操作组织写进程写;若数据库中有写进程,则通过P操作让读进程等待。
同理,当一个读进程完成读数据库操作时,应将读进程计数count减少1;如果此时(count减1以后)数据库中已无读进程,还应对写互斥信号wmutex作V操作,以允许写进程写。