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

3604

被折叠的 条评论
为什么被折叠?



