信号量介绍
信号量是一种具有两个组成部分的数据类型:一组进程和一个非负整数,以及一个等待队列。它用于解释临界区的问题,并通过使用两个进程来解释。暂停和信号用于技术组织。它可以是一个变量,用于控制多个线程对共享资源的访问,并避免像多任务进程这样的系统中的临界区问题。信号量允许计数共享资源,称为计数信号量。
操作级别
有一些级别可以帮助理解信号量。这些级别如下:
运行 - 它表示操作正在执行。
就绪 - 它表示操作需要运行。
空闲 - 当没有进程正在运行时,操作处于此状态。
阻塞 - 进程可能未准备好进行分割操作。它可能由某些外围事件触发。
完成 - 当一个进程执行完它的最终声明后。
非活动 - 操作在某个点被激活。技术的早期阶段。
初始化
信号量S应该初始化为一个大于0的非负整数和一个空的进程集。
$$S<-(k,\phi)$$
信号量
信号量中的操作
以下是两个原子操作:wait和signal,如下所示。
Wait - 根据非负整数的值,如果它有值,则减少它的值,并且进程p可以继续执行;如果它是0,则进程p被插入到等待队列中,并且进程p的状态变为阻塞。在这种情况下,进程p被认为在信号量上阻塞。
Signal - 根据进程集的值,如果它是空的,则增加整数的值;如果它不是空的,则释放一个任意的进程,并将p的状态改为完成。
信号量在进程同步中的作用
信号量是用于协调大型机中多个进程事件的同步机制。它们用于实现互斥、避免竞争状态和执行进程间的同步。
wait操作减少信号量的值,signal操作增加信号量的值。它用于实现临界区,即程序中只能由一个进程同时执行的区域。进程可以访问共享资源,例如共享内存或输入/输出设备。
信号量的类型
有一些类型的信号量,如下所示:
一般信号量 - 一个信号量的进程集可以具有任意非负值的信号量称为一般信号量。
二元信号量 - 一个信号量的进程集只取值零和一的信号量称为二元信号量,也称为互斥锁(mutex)。
强信号量 - 与弱信号量不同,当非负整数通过等待队列更改时,进程集保持不变。弱信号量中未被通知的进程的移除可能导致饥饿,而在这里,它不会发生饥饿。
S<-(0, empty)
忙等待信号量 - 它可能不包含非负整数,信号量S由一组操作识别。这种类型的信号量在多处理器系统中使用,其中等待的进程获得其处理器并且不浪费可能用于计算的中央处理单元时间。
信号量的优点
由于信号量中的忙等待队列,不会消耗进程时间和资源。这是因为进程只有在满足特定条件后才能进入临界区。
用户可以灵活地管理资源。
它们不允许多个进程同时进入临界区。实现了互斥,并且比其他同步机制更有效。
用户是与机器无关的,因为它们运行在微内核的与机器无关的程序中。
信号量的缺点
为了避免死锁,signal() 和 wait() 操作必须以正确的顺序执行。
信号量的编码比较困难,并且可能无法实现互斥。
当低优先级进程比高优先级进程更早访问临界区时,可能会出现优先级反转的情况。
结论
本文介绍了不同类型的信号量、信号量的优缺点。信号量的主要缺点是需要忙等待队列。如果一个进程在临界区中,其他试图进入临界区的进程将必须等待,直到临界区不再被任何进程占用。一旦进入队列,它就会不断检查信号量的值并浪费CPU周期。