【操作系统】进程同步,信号量机制

1.什么是进程同步,为什么要引入进程同步?

  • 进程同步:同步也叫做直接制约关系,是协调它们的工作次序而等待、传递信息所产生的制约关系,这种关系源于它们之间的相互合作。
  • 引入原因:在多道程序环境下,进程是并发执行的,每个进程之间都存在着不同的相互制约的关系。为了协调进程之间的相互制约的关系,引入了进程同步的概念。

2.同步机制应该遵循的原则是什么?为什么要遵循这些原则?

  • 为了禁止两个进程同时进入临界区,同步机制应遵循以下准则:
    • 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程进入。
    • 忙则等待。临界区有进程时,其他试图进入的必须等待。
    • 有限等待。保证进程不会产生饥饿。
    • 让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等。
  • 例如,有一根吸管,一杯奶茶和人。当吸管为空的时候人不能吃到奶茶里的珍珠会“阻塞”,一旦当珍珠送入吸管时,人才能被“唤醒”。反之,当吸管里都是珍珠时,奶茶被“阻塞”,只有当人吃掉一些的时候,才能“唤醒”奶茶。

3.什么是信号量,为什么引入信号量机制?

  • 信号量:其实就是一个变量(可以是整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中的某种资源的数量,比如:系统中有一台打印机就可以设置设置初值为1的信号量。
  • 引入信号量机制:用户可以通过系统提供的一对源语来对信号量进行操作,从而很方便的实现进程互斥,进程同步。

4. 给出记录型信号量wait()和signal()操作的实现代码。

  • 记录型信号量:实现了“让权等待”的策略,而不存在“忙等”现象的进程同步机制。
  • //记录型信号量的定义
typedef struct {

    int value;            //剩余资源数

    struct process *L;    //等待队列

   

} semaphore;
  • //wait原语申请
void wait (semaphore S){

    S.value--;          //S.value表示,资源数

    if(S.value < 0){

        block (S.L);    //如果剩余资源不够,使用block阻塞进程

    }

}
  • //signal原语释放资源
void signal (semaphore S){

    s.value++;

    if(S.value <= 0){

        wakeup(S.L);    //释放之后,如果还有别的进程还在等待这个资源,则使用wakeup唤醒。

    }

}

5. 用wait(),signal()或者sem_wait()和sem_post()实现司机和售票员的同步。

  • 问题描述:公共汽车上,司机和售票员的活动分别是:
    • 司机的活动:启动车辆——>正常行车——>到站停车。
    • 售票员的活动:关车门——>售票——>开车门。
    • 在汽车不断的到站、停站、行驶过程中,用信号量和wait(),signal()操作实现它们的同步
  • 问题解决:
    • 我们可以使用两个信号量来实现司机与售票员间的同步,具体实现形式如下:
    • 司机进程:
      • wait(s1);——>启动;——>正常行驶;——>到站停;——>signal(s2)。
    • 售票员进程:
      • 关车门;——>signal(s1);——>售票;——>wait(s2);——>开车门。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值