操作系统-信号量机制;用信号量机制实现进程互斥、同步、前驱关系

本文深入探讨了信号量机制,包括整形信号量和记录型信号量的使用,以及它们在实现进程互斥、进程同步和处理前驱关系中的应用。通过P、V操作,信号量有效地解决了并发环境中的资源管理和同步问题,防止了忙等现象,并确保了正确的进程调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号量机制

信号量
  • 用户可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步(原语执行只能一气呵成,不可被中断,又关中断/开中断指令实现)
  • 信号量其实就是一个变量(可以是一个整数,也可以是一个更复杂的记录性变量),可以用一个信号量来表示系统中某种资源的数量。(比如:系统中只有一台打印,就可以设置一个处置为1的信号量)
  • 一对原语:wait(S)原语和signal(S)原语(可以把原语理解为函数,函数名为wait和signal,括号里的信号量S其实就是函数调用时传入的参数)
  • wait、signal原语简称为P、V操作。因此常把wait(S)、signal(S)两个操作分别写为P(S)、V(S)
整形信号量
  • 用一个整整数型的变量作为信号量,用来表示系统中某种资源的数量(对信号量的操作只有三种:初始化、P操作、V操作 )
  • P操作:进去操作,资源数-1(对资源的申请)
  • V操作:退出操作,资源数+1(对资源的释放)
  • “检查”和“上锁”一气呵成,避免了并发、异步导致的问题
  • 存在的问题:不满足“让权等待”,会发生“忙等”(下一个进程会一直处于while()循环中)

在这里插入图片描述

记录型信号量
  • 解决了“忙等”的问题
  • P操作:资源数-1后判断是否还有资源,如果没有,使用block原语使该进程从运行态转换为阻塞态,并挂入到等待队列中
  • V操作:资源数+1后判断是否还有等待该进程的资源被堵塞,如果有,使用wakeup原语将唤醒等待队列中的一个进程,将阻塞态转换为运行态

这里是引用

  • S.value的初值表示系统某种资源的数目

信号量机制的应用

信号量机制实现进程互斥
  • 分析并发进程的关键活动,划分临界区
  • 设置互斥信号量mutex,初值为1
  • 在临界区之前执行P(mutex)
  • 在临界区之后执行V(mutex)
  • P、V操作必须成对出现。缺少P操作不能保证临界资源的互斥访问;缺少V操作会导致资源永不被释放,等待进程永远不会被唤醒

这里是引用

  • semaphor:信号量的英文单词,题目没特别说明,可命名此形式
信号量机制实现进程同步
  • 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或代码)
  • 设置同步信号量S,初始为0
  • 在“前操作”之后执行“V操作”
  • 在“后操作”之前执行“P操作”

在这里插入图片描述

信号量机制实现进程的前驱关系
  • 每一对进程前驱关系都是一个进程同步问题
  • 每对进程前驱关系都各设置一个同步变量
  • 在“前操作”之后对相应的同步变量执行“V操作”
  • 在“后操作”之前对相应的同步变量设置“P操作”

前驱关系:进程中的多个代码,必须在上一个代码执行后才能执行下一个代码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值