同步与互斥
同步与互斥
临界区互斥的四种软件方法和三种硬件方法都
无法实现让权等待
- 注意跳出阻塞中的while循环(也就是进入临界区)的条件是
false
,值为true会持续阻塞在while语句中 - 除了
让权等待
准则外,其他三个互斥机制准则必须遵循
- 注意跳出阻塞中的while循环(也就是进入临界区)的条件是
互斥锁和信号量机制都需要依赖原子操作来实现检查和占用锁的过程,例如 TSL 指令
临界区互斥的软件实现方式(如单标志法)和硬件实现方式(如中断屏蔽方法)是
不同于互斥锁和信号量机制
的方法。它们是在不支持原子操作的系统中,通过编程或硬件手段来实现临界区的互斥临界区与临界资源
- 注意区分清楚临界区与临界资源
- 如五个并发进程的
临界资源可能只有一个
,但是每个进程都有一个临界区
- 临界区:访问临界资源的代码段
- 如五个并发进程的
- 进程进入临界区必须满足互斥条件,当进程进入临界区但尚未离开时就被迫进入阻塞是可以的。系统中经常出现这样的情形。
- 在此状态下,只要其他进程在运行过程中不寻求进入该进程的临界区,就应允许其运行,即
分配 CPU
。 - 该进程所锁定的临界区是不允许其他进程访问的,其他进程若要访问,必定会在临界区的”锁”上阻塞,期待该进程下次运行时可以离开并将临界区交给它。
- 在此状态下,只要其他进程在运行过程中不寻求进入该进程的临界区,就应允许其运行,即
- 临界资源是
互斥共享资源
,非共享数据
不属于临界资源 - 临界资源与共享资源的区别在于,在一段时间内能否允许被多个进程访问(并发使用)
公用队列
可供多个进程使用,但一次只可供一个进程使用,若多个进程同时使用公用队列,势必造成队列中的数据混乱而无法使用。私用数据
仅供一个进程使用,不存在临界区问题- 如不同程序段运行的不同代码的变量,可能变量名相同(类似于函数的
局部变量
),实际上存储在不同的地址单元中,并不属于临界资源
- 如不同程序段运行的不同代码的变量,可能变量名相同(类似于函数的
可重入的程序代码
一次可供多个进程使用。- 可重入代码,也称纯代码。
- 允许多个进程在任意时刻共享访问。
- 每次调用都以同样的方式运行,为使其结果不受影响,代码不能被任何进程修改。
- 如
共享程序段
- 可能同时被多个进程使用,所以必须可重入编码,否则无法实现共享的功能。
- 注意区分清楚临界区与临界资源
同步与互斥的实现
- 在高级语言中一条语句编译后会形成若干条指令,这代表着一句代码中间的实现可能会被打断
- 如x+=1编译后对应的指令
- 取出变量x对应的内存单元中的数据,放入寄存器R1
- 计算R1+1的值并将值放回x对应的内存单元
- 操作如果不实现互斥,就有可能导致程序执行过程中变的不确定,使数据混乱
- 如x+=1编译后对应的指令
- 在高级语言中一条语句编译后会形成若干条指令,这代表着一句代码中间的实现可能会被打断
管程
- 管程的 signal操作与信号量机制中的V操作不同
- 信号量机制中的V操作一定会
改变信号量的值
S=S+1。 - 而管程中的 signal操作是针对
某个条件变量
的,若不存在因该条件而阻塞的进程, 则 signal不会产生任何影响。
- 信号量机制中的V操作一定会
- 管程是
进程同步工具
,解决信号量机制大量同步操作分散的问题
- 管程的 signal操作与信号量机制中的V操作不同
信号量机制
- 在
多道程序技术
中,信号量机制是一种有效实现进程同步
和互斥
的工具。进程执行的前驱关系实质上是指进程的同步关系
。- 除此之外,只有进程的
并发执行
不需要信号量来控制
- 除此之外,只有进程的
- 与互斥信号量初值一般置1不同,用PV操作实现进程同步时,信号量的初值应根据具体情况来确定。
- 若期望的消息尚未产生,则对应的初值应设为 0
- 若期望的消息已存在,则信号量的初值应设为一个非0的正整数。
- 区分
互斥信号量
与同步信号量
- 互斥信号量:初始值一般为1
- 同步信号量:初始值根据
可用资源数
确定- 生产者消费者问题中,一般会设置两个同步信号量
- empty=资源数
- 表示当前缓冲器的剩余容量
- full=0
- 表示当前缓冲器中有多少可供消费的产品
- empty=资源数
- 生产者消费者问题中,一般会设置两个同步信号量
- 若系统原来存在等待进入临界区的进程,mutex小于等于-1,
- 在执行 V(mutex) 操作后,mutex的值小于等于0。
- 记录型信号量
- S.value>0,表示某类可用资源的数量。每次P操作,意味着诡求分配一个单位的资源。
- S.value <=0,表示某类资源已经没有,或者说还有因请求该资源而被阻塞的进程。
- S.value <=0时的绝对值,表示等待进程数目。
- 在