本文迁移并整理自个人之前在博客园的博客。
本文参考资料:
- 《操作系统:精髓与设计原理》
- 信号量
- 用信号量解决进程的同步与互斥探讨
- 信号量与PV操作
- 【Windows】用信号量实现生产者-消费者模型
几个关键名词
原子操作原子操作
:一个或多个指令的序列,对外是不可分的,即没有其他进程可以看到其中间状态或者中断此操作。
互斥与同步互斥
:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步
:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
临界资源与临界区临界资源
就是一次只允许一个进程访问的资源,一个进程在使用临界资源的时候,另一个进程是无法访问的,操作系统也不能够中途剥夺正在使用者的使用权利,即临界资源是不可剥夺性资源。临界区
(critical section)就是进程中访问临界资源的那段程序代码。注意,临界区是程序代码,不是内存资源了。这是临界资源与临界区的区别。
临界区的使用原则(也即同步机制应遵循的准则,注意与死锁产生的四个条件相区分开来)可总结为十六字诀:“空闲让进,忙则等待,有限等待,让权等待”下:
1)空闲让进:临界资源空闲时一定要让进程进入,不发生“互斥礼让”行为。
2)忙则等待:临界资源正在使用时外面的进程等待。
3)有限等待:进程等待进入临界区的时间是有限的,不会发生“饿死”的情况。
4)让权等待:进程等待进入临界区时应该放弃CPU的使用。
死锁与活锁死锁
:两个或两个以上的进程因其中的每个进程都在等待其他进程做完某些事情而不能继续执行。活锁
:两个或两个以上的进程为了响应其他进程中的变化而持续改变自己的状态但不做有用的工作
饥饿饥饿
:指一个可运行的进程尽管能继续执行,但被调度器无限期地忽视,而不能被调度执行的情况。