您的位置:首页 > 其它

操作系统(经典进程同步问题)之写者优先

2017-03-27 17:57 309 查看
一个数据文件或记录可以被多个进程共享使用,我们将读文件的进程称为reader,写文件的进程成为writer。允许对个进程同属进行读取一个共享对象,因此读操作不会造成数据数据文件的混乱,但不允许reader,writer进行同时对共享文件的访问,因为这种访问会造成文件的数据混乱。所谓读者-写者问题。

读者-写者问题中,读者优先问题描述下面这种情况。

在文件的访问读取中,如果有写进程,写先进行写进程的调度,读进程在所有读进程完成后进行执行。这就是写者优先。
解决方法如下:

设置wmutex为各写者间的互斥时间访问。
设置Filemutex为文件互斥事件竞争访问
wcount为写进程的数量
rcount为读进程的数量
mutex1读进程互斥访问
mutex2写进程互斥访问


Writer:begin
wait(mutex1): //申请文件的写进程
wcount = wcount+1; //文件写进程+1
if wcount = 1 then wait(Filemutex); //判断文件是不是有一个写进程,如果一个写进程申请文件使用权,确保文件无进程使用,否则写进程阻塞在这里
signal(mutex1);
wait(wmutex);//申请写进程开始写
写数据;
singal(wmutex);//释放写进程
wait(mutex1);//申请文件写进程
wcount = wcount - 1; //写进程-1
if wcount = 0 then singal(Filemutex);//此时,写进程为0,申请文件使用权进行释放写进程(因为写写进程互斥)
singal(mutex1);
end


reader:begin
wait(mutex1); //读者先进行申请文件的写申请,如果能够申请到mutex1表明有写进程正在执行,此时读进程阻塞
singal(mutex1);//获取mutex1后释放,让写进程能够随时申请到写进程
wait(mutex2);
rcount  = rount + 1;
if rcount = 0 then wait(Filemutex);
singal(mutex2);
wait(mutex2);
读操作;
singal(mutex2);
wait(mutex2)
rcount = rcount -1;
if rcount  = 0 then singal(Filemutex);
singal(mutex2);
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  操作系统