总览
中断屏蔽方法
不适应于多处理机:多处理机上的不同处理机进程也有,可能执行关中断然后访问临界区资源,这样就存在多个进程同时访问临界资源了
TestAndSet指令
Test-and-Set是一种特殊的硬件指令,用于实现进程间的互斥。它通常被用于控制对共享资源(临界资源)的访问。
具体来说,Test-and-Set指令包含两个步骤:
测试步骤:检查指定的内存地址(通常是某个标志位)的当前值。
设置步骤:将该内存地址设置为1(或某个预设的值)。
这两个步骤构成一个原子操作,即在执行过程中不会被其他处理器中断,确保了操作的同步性。
Test-and-Set指令通常应用于以下场景:
当进程需要进入临界区时,它会执行Test-and-Set指令来检查锁的状态。
如果返回的旧值为0(表示锁未被占用),则进程进入临界区,并将锁设置为1,防止其他进程进入。
当进程离开临界区时,它会将锁设置为0(解锁),允许其他进程进入。
让权等待:依然在不能访问临界区的时候仍在while循环中,导致占用CPU
适用于多处理机的原因
TestAndSet指令适用于多处理机,因为它提供了一种机制来确保在多处理器环境下对共享资源的互斥访问。
首先,TestAndSet指令是一个原子操作,这意味着在执行这个指令时,不会被其他进程或处理器中断。这个特性在多处理机系统中尤为重要,因为多个处理器可能同时尝试访问同一个共享资源。通过使用TestAndSet指令,可以确保在任何时候只有一个处理器能够修改共享资源的状态。
其次,TestAndSet指令允许处理器直接与内存进行交互,而不需要经过操作系统的干预。这使得它在多处理机环境中非常有用,因为它可以减少对操作系统内核的依赖,从而提高系统的效率和响应速度。
最后,虽然TestAndSet指令在某些情况下可能不适用于用户进程,但在多处理机系统的内核进程中,它仍然是一个非常有价值的工具,用于实现对临界资源的互斥访问。
Swap指令
将lock的值给old(对应此时临界区的上锁状态),然后lock值被设为true,因为old值最开始被设为true了,然后再检查lock
小结
进程互斥:锁
忙等待期间如果发生临界区解锁了,那么不需要切换进程上下文了。这样相比等待代价很低。而如果是忙等待期间就让其下处理机并切换进程,那么如果此时正好临界区解锁了,那么又得切换回到原来要访问临界区资源处于忙等待得进程才可以使用临界区(当然,这样得前提是有进程上锁后使用临界区和解锁的总共时间较短,如此其他进程忙等待时间就比较短)
单处理机不适用:因为忙等待期间其他进程即使要解锁要得等忙等待时间结束才行