关于操作系统读者写者问题的个人总结
问题描述是一个数据文件或记录可被多个进程共享,把只要求读该文件的进程称为“Reader进程”,其他进程称为“Writer进程”。允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象,因为会引起混乱,
也就是保证一个Writer进程必须与其他进程互斥的访问共享对象的同步问题。
采用记录型信号量来大概描述整个算法
以下为类C语言:
semaphore rmutex=1,wmutex=1; //wmutex用于实现Reader和Writer在读或写时的互斥,rmutex是让多个reader进程互斥的访问readcount资源
int readcount=0; //readcount表示正在读的进程数目
读者程序:
void reader(){
do{
wait(rmutex); //对readcount进行互斥访问
if(readcount==0) wait(wmutex); //如果是第一个读者进行读过程,判断是否有写过程在临界区,如果有,写进程等待,如果没,阻塞写进程进入临界区
readcount++; //读进程可以实现,所以readcount提前++
signal(rmutex); //结束对readcount的互斥访问
-----
perform read operation;
----
wait(rmutex); //读进程实现完毕后需要对readcount--,所以依然互斥访问raedcount
readcount--;
if(readcount==0) signal(wmutex); //判断最后一个离开临界区的读进程走时是否有写进程在临界区,如果有唤醒一个写进程进入临界区
signal(rmutex);
}while(true)
}
写者程序
void writer(){
do{
wait(wmutex);
perform wirte operation
signal(wmutex);
}while(true);
}// 写进程很简单,没什么需要注意的