信号量机制
信号量
- 用户可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步(原语执行只能一气呵成,不可被中断,又关中断/开中断指令实现)
- 信号量其实就是一个变量(可以是一个整数,也可以是一个更复杂的记录性变量),可以用一个信号量来表示系统中某种资源的数量。(比如:系统中只有一台打印,就可以设置一个处置为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操作”
前驱关系:进程中的多个代码,必须在上一个代码执行后才能执行下一个代码