操作系统——信号量和管程

信号量和管程

信号量和管程都是用来解决进程同步问题的。

信号量

介绍

此种方式由迪杰斯特拉在20世纪60年代提出的。信号量是操作系统提供的一种协调共享资源访问的方法。此种办法是早期操作系统中主要的同步机制,现在很少使用

  • 软件同步是平等线程间的一种同步协商机制
  • 信号量是由OS来进行管理的,OS是管理者,地位高于进程
  • 用信号量来表示系统资源的数量。

信号是一种抽象的数据类型

  • 由一个整型变量(sem)和两个原子操作组成。变量可以理解为要共享的资源数目。
  • P():sem减1,若sem<0,进入等待,否则继续
  • V():sem加1,若sem<=0,则唤醒一个进程

信号量是被保护的整数变量

  • 初始化完成后,只能通过P和V操作修改
  • 由操作系统保证,PV操作是原子操作

P可能阻塞,V不会阻塞。

通常假设通信量是公平的

  • 线程不会被无限期阻塞在P操作
  • 假定信号量按照先进先出排队。
  • 自旋锁无法做到先进先出

信号量的实现

class Semaphore {
    int sem;
    WaitQueue q;
}
Semaphore::P() {
    sem--;
    if (sem < 0) {
        add this progress p to q;
        block(p);
    }
}
Semaphore::V() {
    sem++;
    if (sem >= 0) {//sem为负数时说明有进程在等待资源,而sem自增后还不为正数说明有进程在等待资源
        remove progress p from q;
        wakeup(p);
    }
}

信号量的使用

信号量可分为两种信号量:

  • 二进制信号量:资源数目为0或者1
  • 资源信号量:资源数目为任何非负值
  • 两者等价,基于一个可以实现另一个。

信号量使用分为两种情况:

互斥访问:实现临界区的互斥访问控制

给每类资源设置一个信号量,其初值为1,因为临界区的资源同一

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值