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

  一个数据文件或记录可以被多个进程共享使用,我们将读文件的进程称为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


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,让我来回答你的问题。 在 Java 中实现进程同步与互斥通常采用信号量机制。下面是一个简单的读者写者问题的示例代码: ```java import java.util.concurrent.Semaphore; public class ReaderWriter { Semaphore mutex = new Semaphore(1); // 互斥信号量 Semaphore w = new Semaphore(1); // 写者信号量 int readCount = 0; // 读者计数器 public void startReading() throws InterruptedException { mutex.acquire(); // 获取互斥信号量 readCount++; // 读者计数器加 1 if (readCount == 1) { w.acquire(); // 如果是第一个读者,获取写者信号量 } mutex.release(); // 释放互斥信号量 // 执行读操作 System.out.println("Reading..."); mutex.acquire(); // 获取互斥信号量 readCount--; // 读者计数器减 1 if (readCount == 0) { w.release(); // 如果是最后一个读者,释放写者信号量 } mutex.release(); // 释放互斥信号量 } public void startWriting() throws InterruptedException { w.acquire(); // 获取写者信号量 // 执行写操作 System.out.println("Writing..."); w.release(); // 释放写者信号量 } } ``` 上述代码中,`mutex` 用于实现互斥,`w` 用于实现写者优先。读者进程在执行读操作前获取互斥信号量,避免了多个读者同时访问共享资源的情况。同时,读者计数器记录了当前正在执行读操作的读者数量,当第一个读者进程进入临界区时,它会获取写者信号量,使得后续写者进程无法进入临界区。当最后一个读者离开临界区时,它会释放写者信号量,让后续的写者进程可以进入临界区。写者进程则直接获取写者信号量,执行写操作后释放该信号量。 需要注意的是,上述代码仅为示例,还需要对其进行完善和优化,例如添加异常处理、避免死锁等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kylin5221

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值