Linux信号量是一种睡眠锁。如果有一个任务试图获得一个不可用(已经被占用)的信号量时,信号量会将其推入一个等待队列,然后让其睡眠。这时处理器可以重获自由,从而去执行其他代码。当持有的信号量可用(被释放)后,处于等待队列中的那个任务被唤醒,并获得该信号量。
举例说明:
当某个人来到门前,他抓取钥匙,进入房间。
当另外一个人来到门前的时候,发现没有了钥匙,他不会在门口徘徊等待,而是把自己的名字写入一个列表中,然后就打盹去了。
当房间里面的人出来的时候,就会到门口查看一下列表,如果列表上有名字,就找到列表上的第一个名字的人把他叫醒,让他进入房间。
在这种方式中,钥匙(相当于信号量)确保一次只有一个人(相当于执行线程)进入房间(相当于临界区)。
这个方式比自旋锁提供了更好的处理器利用率。
信号量比自旋锁有更大的开销。