进程同步与互斥
有时并发的几个进程为了完成某个任务,需要按一定顺序先后进行操作,这种顺序就是直接制约关系,又叫进程同步。在同步操作时,多个进程需要访问同一个资源,这个资源叫临界资源。一个进程访问临界区时,其他进程都无法访问,这叫间接制约关系,也叫互斥。
互斥访问临界资源代码的组成部分:
- 进入区:负责检查能否进入临界区,如果可以,就设置正在的访问的标志,可以理解为加锁。
临界区:访问临界资源并操作数据的代码段。 - 退出区:解除正在访问临界区的标志,可以理解为解锁。
剩余区:其他操作。
互斥访问的原则:
- 空闲让进:临界区没有进程时,可以允许请求访问临界区的进程访问。
- 忙则等待:如果有线程在访问临界区,其他线程必须等待。
有限等待:进程等待的时间必须是有限的。 - 让权等待:如果进程无法访问临界区,那么就得释放处理机。
互斥访问算法: - 单标志法:设计一个“标志”,是布尔型变量,如果想访问临界区就设为true。在进入区只检查标志,不进行上锁。违反了忙则让进原则。
- 双标志先检查:标志是一个布尔型变量的数组,如果线程1想访问临界区,就把下标为1的元素设为true,先检查标志再加锁。如违反忙则等待原则
- 双标志后检查:先加锁后检查。违反空闲让进、有限等待。
- Pterson算法:在双标志后检查加法中遇到都想进入线程。违反让权等待原则。
互斥访问指令:
- 中断屏蔽方法:使用开/关中断指令,适用于单处理机和内核进程。
- TestAndSet:使用TS/TSL指令。
- Swap:XCHG指令。
信号量
信号量是指系统中某种资源的数量,比如打印机。系统通过一对原语对信号量进行操作wait(S)和signal(S),可以简写为P(S)、V(S),即P、V操作
- 整数型信号量:使用wait原语检查信号量是否大于0,大于0就让进程进入临界区,信号量减1,否则让进程等待下去直到信号不为0,相当于“进入区”。如果有进程退出临界区,就通过signal原语把资源加1。优点是实现了加锁和检查一起进行,缺点是这种信号量无法在没有空闲资源时让等待的线程阻塞,违反让权等待原则。
- 记录型信号量:记录型信号量既记录资源数,还记录阻塞队列里的进程。进程需要进入临界区时,就使用wait原语,wait原语将信号量减1,如果信号量的剩余资源数小于0就把进程挂到信号量的阻塞队列里。如果一个进程使用完了资源,就通过signal原语退出,资源数加1,如果还是小于等于0,那么就唤醒等待队列里的进程,让它进入就绪状态。这样就不违背让权等待原则。
管程
信号量实现起来比较复杂,管程是一种能替代信号量功能的更简单的软件模块,结构如下:
- 只在管程内共享的数据结构说明
- 对数据结构进行操作的一组过程(函数)
- 对数据结构进行初始化的语句
- 管程的名字
管程的特点:
- 进程只能通过管程提供的“入口”才能进入管程
= 同一时间只有只有一个进程在管程内操作
这篇博客探讨了操作系统中的进程同步与互斥概念,包括进入区、临界区、退出区和剩余区,强调了互斥访问的四个原则,并介绍了几种互斥访问算法,如单标志法、双标志先检查和Peterson算法。接着,文章讲解了信号量的类型,如整数型和记录型信号量,以及它们如何确保资源的正确分配。最后,管程作为简化信号量管理的工具被提出,其特点是保证同一时间只有一个进程在管程内操作。
2808

被折叠的 条评论
为什么被折叠?



