1.读者优先
当有读者进程进行读时,允许多个读者同时读,但不允许写者写;当有写者进程进行写时,不允许其他写者写,也不允许读者读
读者算法:
p(r_mutex); //申请修改read_count
if read_count==0:
p(mutex); //获得读文件的权限
read_count++;
V(r_mutex);
阅读;
//阅读结束
p(r_mutex);
read_count--;
if read_count==0:
V(mutex); //最后一个读者阅读完毕,释放文件权限
V(r_mutex);
写者算法:
p(mutex); //请求写文件的权限
进行写操作;
v(mutex); //释放权限
r_mutex:实现读者互斥修改read_count
mutex:实现读者和写者互斥操作文件
如果还有读者在读的话,那就一直抓住mutex,实现读者的鱼贯而入,此时若写者想要进行写的话,也只能等最后一个读者释放mutex。
2.公平竞争
读者进程运行时,允许多个读者同时读,但不允许写者写;写者进程运行时,不允许其他写者写,也不允许读者读。
同时,读者与写者公平竞争,即读者与写者先来先得,谁先来,谁就排在前面
读者算法:
p(s); //请求外围互斥量s
p(r_mutex); //请求修改read_count
if read_count == 0:
p(mutex); //请求内围互斥量mutex,实现多个读者同时读
read_count++;
v(r_mutex);
v(s); //释放外围互斥量
阅读;
//阅读结束
p(r_mutex);
read_count--;
if read_count==0: //表示最后一个读者阅读完毕
v(mutex);
v(r_mutex);
写者算法:
p(s); //请求外围互斥量
p(mutex); //请求内围互斥量
进行写操作
v(mutex);
v(s);
相较于读者优先算法,引入了互斥信号量s,每一个读者想要进行读操作时,都要和写者一样先申请一下s。
一旦当写者申请s后,读者就无法成功申请到s,只能进入阻塞队列等待,避免了读者鱼贯而入导致写者无法进行写的现象。
s控制了读者进入的过程
3.写者优先
写者的优先级高于读者,读者在等待的时候,此时若有写者想要进行写,那么读者只能进行让路,让写者插队进行写操作
读者算法:
p(x);
p(s); //请求外围互斥量s
p(r_mutex); //请求修改read_count
if read_count == 0:
p(mutex); //请求内围互斥量mutex,实现多个读者同时读
read_count++;
v(r_mutex);
v(s); //释放外围互斥量
v(x);
阅读;
//阅读结束
p(r_mutex);
read_count--;
if read_count==0: //表示最后一个读者阅读完毕
v(mutex);
v(r_mutex);
写者算法:
p(w_mutex); //申请修改write_count
if write_count==0:
p(s); //申请s,把s抓住
v(w_mutex);
p(mutex); //申请文件操作权限
进行写操作
v(mutex);
p(w_mutex);
write_count--;
if write_count==0:
v(s); 释放外围互斥量s
v(w_mutex);
在写者算法里,增加的和读者优先里读者的算法类似,增加了一个write_count来抓住s。
当读者在读的时候,若第一个写者想要进行写,那么就会p(s),申请s,抓住s,此时读者无法在接着加入队列进行读。
当有其他写者在进行写的时候,若有写者想要进行写操作,那么他只需要等上一个写者释放mutex即可
在读者算法里,新加了一个互斥量x
为什么要多引入一个x?假设没有x,去掉p(x),v(x)。试想如下这种情形:一个读者申请到了s,但还没释放s,此时若先来一个读者,又来了一个写者,读者先p(s),申请s,写者由于是第一个,所以也要p(s),当上面第一个读者v(s)后,此时若系统将s分配给了先到达的读者,那么读者就会优先了
标签:count,优先,read,写者,互斥,mutex,读者 From: https://blog.csdn.net/m0_72904009/article/details/139883960