操作系统之同步与互斥的基本实现方法

105 阅读2分钟

同步的基本实现方法

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。不过它只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。

2、信号量:为控制一个具有有限数量用户资源而设计。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。信号量机制必须有公共内存,因此不能用于分布式操作系统。

3、事件:用来通知线程有某些事件已发生,从而启动后继任务的开始。事件对象通过通知操作的方式来保持线程的同步,并且可以实现不同进程中的线程同步操作。

4、互斥量:为协调共同对一个共享资源的单独访问而设计的。互斥量跟临界区很相似,但比临界区复杂。互斥对象只有一个,只有拥有互斥对象的线程才具有访问资源的权限。因为互斥量可以是跨进程的,所以一旦被创建,就可以通过名字访问它。

互斥的基本实现方法

1、软件方法:如Dekker算法、Peterson算法等。这些算法通过特定的软件逻辑来确保对临界资源的互斥访问。

2、硬件方法:利用硬件指令实现互斥,如TestAndSet指令(TSL指令)。这种方法将“检查”和“上锁”操作合并为一步原子操作,从而避免了竞态条件。不过它不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。

3、中断屏蔽方法:在某些系统中,可以通过屏蔽中断来实现互斥。当一个进程进入临界区时,屏蔽所有中断,这样其他进程就无法被调度执行,从而无法进入临界区。不过这种方法只适用于单处理机系统,且对操作系统内核进程较为有效。对于多处理机系统或用户进程,这种方法并不适用。

4、信号量机制:信号量也可以用于实现互斥。通过设置一个互斥信号量,初始值为1,表示资源可用。进程在进入临界区之前执行P操作(wait操作),将信号量减1;在离开临界区之后执行V操作(signal操作),将信号量加1。如果信号量为0,则其他进程无法进入临界区,从而实现互斥。