操作系统八股文05-补充-PV操作、管程、生产者消费者

补充1-PV操作、管程、生产者消费者

1. PV操作

P操作

void wait(S) {
    S.value--;
    if (S.value < 0) {
        进入资源S的等待队列 S.L;
        自我阻塞 block(S.L);
    }
}

V操作

void signal(S) {
    S.value++;
    if (s.value <= 0) {
        从S.L中取出一个进程P;
        唤醒进程P wakeup(P);
    }
}

2. 生产者消费者

  • 对缓冲区的访问 - 互斥
  • 生产者/消费者关系 - 同步
S.mutex = 1; // 互斥信号量

S.empty = n; // 同步信号量
S.full = 0;

Producer {
    while(1) {
        生产数据;
        P(empty);
        P(mutex);
        放数据;
        V(mutex);
        V(full);
    }
}


Customer {
    while (1) {
        P(full);
        P(mutex);
        取数据;
        V(mutex);
        V(empty);
    }
}

3. 管程

  • 把对共享资源的操作进行封装
  • 每次只允许一个进程进入管程,进而实现互斥
  • PV操作分解为
    • 数据结构:用于标识资源数目
    • 条件变量:用于唤醒/阻塞进程
monitor_demo {
    共享数据结构 S;
    条件变量 condition x;
    
    void init_code () {
        初始化资源数目;
    } 
    
    void take_away() {
        if (S <= 0) {
            x.wait();
        }
        S--;
    }
    
    void give_back() {
        S++;
        if (有进程等待) {
            s.notify();
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值