引言
在之前的内容中便已经提到过,多进程视图有四个部分,如下图所示,而此篇主要就是叙述进程间如何进行合作,即有关信号量的概念以及原理
进程同步及信号量概念
概念
让进程走走停停来保证多进程合作的有序
信号实现同步及其局限性
- 可以通过信号实现进程的同步,如使用count的满或不满来传递信号
- 使用信号实现同步会具有局限性,只能粗略的控制进程同步,比如在此处如下图中,有两个进程阻塞的情况下,信号只能控制到一个进程唤醒,而另外一个睡眠的进程便会被遗忘,这就是信号的局限
- 由于信号的局限,于是后续便引出了信号+量纲来实现的信号量,其可以细化的控制进程同步
引入信号量来实现进程同步
- 由于信号的局限,于是引入信号量,其一般由一个整数数值来进行表示,给其赋予一定的意义之后,便可以实现进程同步,并且能够细化的控制进程,不会出现信号的局限性
- 在下面的例子中,以value为信号量记载资源个数,当value小于0时,代表资源使用完,进程如果此时需要资源,则直接阻塞,使得进程休眠,同时value--,其对应的含义便是**|value|个进程阻塞**,因此也可以通过Value是否为负值,来决定是否唤醒阻塞的进程,从而实现进程的休眠唤醒,进而实现了进程间的同步
示列使用
以下给出信号量的一个具体使用,了解其用处
临界区
临界区的由来
临界区代码保护原则
临界区的实现方法
- 软件层面
-
轮换法(有缺陷)
两个进程执行时 ,可能让一个变量被重复操作,于是引出标记法,具体缺陷原因见视频
- 标记法(会造成死锁)
- 非对称标记法(结合轮换和标记法)
- 面包店算法(对于多个进程提出的算法)
2. 硬件层面
- 关闭中断(只使用于一个cpu单核)
-
硬件原子指令法(普遍适用)
通过硬件,将锁的语句变成一条原子指令来执行,继而可以直接锁,不会被切断
- 实际运用
linux如何实现临界区
此处的重点主要在于队列如何构成,比较难以理解,注意tmp在内核栈中即可知道,可以直接通过tmp索引下一个pcb,而此处的唤醒也需要注意是全部唤醒,让进程重新根据优先级竞争
死锁
概念:多个进程由于等待对方持有的资源而造成谁都无法执行的情况称为死锁
死锁的起因
死锁的必要条件
死锁的四种解决方法
- 死锁预防
- 死锁避免
- 死锁检测(回滚进程)
- 死锁忽略(windows,linux使用)
评论