1. 什么是进程同步
进程具有异步性的特征, 各个并发执行的进程以独立的不可预知的速度推进
进程同步机制是为了解决进程异步的问题, 也被称为直接制约关系
2. 什么是进程互斥
OS中的某些资源虽然可以提供给多个进程使用,但一个时间段内只允许有一个进程访问该资源(这种资源被称为临界资源)
do{
进入区 // 检查是否可进入临界区, 若可进入则**对资源上锁**
临界区 // 访问临界资源的代码, 也叫临界段
退出区 // **对资源解锁**
剩余区 // 做其它处理
}
临界资源的互斥访问原则
- 空闲让进 : 在临界区空闲时允许请求访问临界区的进程进入
- 忙则等待 : 当已有进程进入临界区时 , 其它线程等待
- 有限等待 : 保证请求访问的进程在有限时间内进入临界区
- 让权等待 : 当进程进不了临界区时, 立即释放处理机
3. 进程互斥的软件实现方法
(1) 单标志法 : 进程在访问完临界区后会把临界区权限转交给另一个进程 , 每个进程进入临界区的权限是由另一个进程赋予的;
使用一个 int turn; 的公共变量表示允许进入临界区的进程号, turn变量的初始值为1;
缺点 : 当临界区空闲的时候未必能有线程能进入临界区;
(2) 双标志先检查法 : 设置一个bool数组, 数组元素表示各个进程想进入临界区的意愿
缺点: 可能会出现两个进程同时访问临界区的问题 , 违背忙则等待原则
(3) 双标志后检查法 :
缺点: 可能会造成进程饥饿现象
(4) Peterson算法 : 两个进程都试图进入临界区时, 可以让进程主动让对方先使用临界区
4. 进程互斥的硬件实现方法
(1)中断屏蔽方法 : 利用开关中断指令实现
关中断;
临界区;
开中断;
缺点 : 不适用于多处理机系统; 只适用于操作系统内核进程
(2) TestAndSet指令 : 简称TS指令, 也有地方称为TSL指令; 由硬件实现 , 适合多处理机的环境
C语言描述硬件逻辑 :
检查和上锁的操作是一步完成的
(3) Swap指令 : 功能是交换两个变量的值 ; 适合多处理机的环境;
在逻辑上和TSL指令无太大的区别
5. 信号量机制
信号量其实就是一个变量, 可以用一个信号量来表示系统中某种资源的数量
用户可以通过使用OS提供的一对原语(wait(S) & signal(S)原语) , 来对信号量进行操作, 以实现进程的互斥和同步;
其中, wait可用P表示 , signal可用V表示
(1) 整型信号量
用于表示系统中某种资源的数量, 当系统资源暂时不足时, 进程进不了临界区将会一直占用处理机
(2) 记录型信号量
当系统资源暂时不足时会将请求的线程加入到等待队列中去, 遵循让权等待原则
(3) 信号量机制实现进程互斥
- 分析并发进程的关键活动, 划定临界区
- 设置互斥信号量mutex, 初值设为1
- 在临界区之前执行P(mutex)
- 在临界区之后执行V(mutex)
(4) 信号量机制实现进程同步
- 分析什么地方需要实现同步关系, 即必须保证"一前一后"执行两个操作
- 设置同步信号量S, 初始化为0
- 在"前操作"之后执行V(S)
- 在"后操作"之前执行P(S)