区别一:实现方式
自旋锁是自旋等待,进程状态始终处于TASK_RUNNING。
在自旋锁的临界区中,进程是不能陷入睡眠的。
而信号量可以睡眠。
自旋锁的效率比较高,因为它少了进程状态切换的消耗。
因为自旋锁是忙等待,所以临界区的代码不能太长。
自旋锁是关抢占的,所以在单处理器非抢占的内核下,自旋锁是没用的。是空操作。
信号量并没有关抢占,所以,只有需要获得锁的进程才会睡眠,其他进程还可以继续运行。
自旋锁是自旋等待,进程状态始终处于TASK_RUNNING。
信号量是睡眠等待,进程在等待是处于TASK_INTERRUPTIBLE。
在自旋锁的临界区中,进程是不能陷入睡眠的。
而信号量可以睡眠。
同时,基于上面的原因,中断上下文中只能使用自旋锁(中断里不能休眠),在有睡眠代码的临界区只能使用信号量
明显的,信号量对系统的负载小,因为它睡眠了。
自旋锁的效率比较高,因为它少了进程状态切换的消耗。
相对的信号量的效率比较低,因为进程的等待需要切换进程状态。
因为自旋锁是忙等待,所以临界区的代码不能太长。
而信号量可以使用在运行时间较长的临界区代码。
自旋锁是关抢占的,所以在单处理器非抢占的内核下,自旋锁是没用的。是空操作。
信号量并没有关抢占,所以,只有需要获得锁的进程才会睡眠,其他进程还可以继续运行。