首页 > 试题广场 >

运行在多核处理器上的Linux环境中,若临界区非常短,且不允

[单选题]
运行在多核处理器上的Linux环境中,若临界区非常短,且不允许线程上下文切换的情况下,使用下列哪种机制满足上述需求并且性能最好?
  • SpinLock
  • Mutex
  • Semaphore
  • Condition variable
spinlock在多处理器多线程环境的场景中有很广泛的使用,一般要求使用spinlock的临界区尽量简短,这样获取的锁可以尽快释放,以满足其他忙等的线程。Spinlock和mutex不同,spinlock不会导致线程的状态切换(用户态->内核态),但是spinlock使用不当(如临界区执行时间过长)会导致cpu busy飙高。
发表于 2015-11-13 15:36:10 回复(0)
http://kb.cnblogs.com/page/105657/    解释得比较清楚。
发表于 2016-06-17 23:29:48 回复(0)
SpinLock:自旋(自我检查锁是否可用,无需上下文切换)
Mutex:互斥(需要线程上下文切换)
Semaphore:信号量(先抢先得,也需要线程上下文切换)
Condition variable:条件变量 

发表于 2021-07-22 00:09:28 回复(0)
mutex信号量是sleep-waiting,当没有获得mutex时会有上下文切换,将自己加到忙等待队列中,直到另外一个线程释放mutex时并唤醒它,而这时cpu是空闲的,可以调度其他工作。 自旋锁spinlock是busy-waiting,就是说当没有可用的锁时,就一直忙等待并且不停的进行锁请求,直到这个得到这个锁。这个过程cpu始终处于忙碌状态,不能作别的任务
发表于 2017-04-07 19:44:29 回复(0)
A吧
发表于 2016-01-09 10:00:06 回复(1)

spinlock

why spinlock

sem实时性差--sem如果不允许进入临界区,那么会放弃CPU切换到其它进程,待进入临界区的进程释放锁后,再切换到该进程。那么一来一回切换进程的时间开销,对于实时性来说是种伤害

how spinlock

不能放弃cpu---busy_loop。
多核:perfect!
单核: no 抢占, 主动放弃也不行。

for no deadlock

spin_lock 的实现者:

一是禁止了进入临界区进程被剥夺的权利,二是禁止了运行该进程所在CPU的中断。

user:

而spin_lock的使用者,则需要保证临界区代码不调用可能放弃CPU的函数

FBI warning

由于spin_lock的使用会浪费CPU资源(因为busy_loop),所以为了尽可能地消除负面影响,要求使用者spin_lock所保护的临界区代码尽可能精炼简单

编辑于 2018-11-01 18:37:05 回复(0)
spinlock 自旋,快,临界区要短,线程切换比较频繁
mutex 互斥,当没得到锁,会沉入内核,需要系统调用唤醒(代价高)
发表于 2017-06-16 10:15:21 回复(0)
SpinLock
发表于 2016-08-27 08:55:47 回复(0)
自旋锁(spinlock)是一种锁定机制,它是在多线程编程中用于保护共享资源不被并发访问而引起的数据竞争问题的一种方式。与互斥锁(mutex)不同的是,当一个线程尝试获取自旋锁时,如果该锁已经被其他线程占用,它会一直循环忙等(即自旋),直到锁可用为止,而不是将线程挂起等待。自旋锁适用于对共享资源的访问时间很短的情况,因为它避免了线程切换和上下文切换所带来的开销,但是在资源竞争激烈的情况下可能会造成性能下降。

线程上下文切换是指在多线程环境下,CPU从一个线程切换到另一个线程时,需要保存当前线程的上下文(包括寄存器值、程序计数器、栈指针等)并加载下一个线程的上下文。这个过程需要耗费一定的时间和资源。

线程上下文切换通常发生在以下情况下:
1. 当一个线程的时间片用完,需要切换到下一个就绪状态的线程。
2. 当一个线程主动调用了某个阻塞的系统调用,需要等待系统调用完成后才能继续执行,此时可以切换到其他就绪状态的线程。
3. 当一个线程遇到了某个条件等待(如互斥锁、信号量)时,需要让出CPU,等待条件满足后再继续执行。

线程上下文切换的开销包括保存和恢复寄存器值、切换页表、刷新TLB(Translation Lookaside Buffer)等。频繁的线程上下文切换会导致CPU资源浪费,降低系统的性能。因此,在设计多线程应用程序时,需要合理地控制线程的数量和调度策略,以减少上下文切换的次数。
编辑于 2023-11-09 17:22:40 回复(0)
SpinLock:自旋(自我检查锁是否可用,无需上下文切换) Mutex:互斥(需要线程上下文切换) Semaphore:信号量(先抢先得,也需要线程上下文切换) Condition variable:条件变量
编辑于 2024-01-20 18:01:37 回复(0)
这题乍一看不会做,仔细一看spinlock好像是CAS自旋锁,自旋锁顾名思义就是一直等着获取的锁,因此是不存在上下文切换的,符合要求。
发表于 2021-08-03 11:40:43 回复(0)
自旋锁
发表于 2017-02-27 22:22:33 回复(0)