亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 關(guān)于自旋鎖的一個(gè)很弱的問(wèn)題 [打印本頁(yè)]

作者: yushang    時(shí)間: 2009-04-01 09:52
標(biāo)題: 關(guān)于自旋鎖的一個(gè)很弱的問(wèn)題
線程持有自旋鎖時(shí)為什么不能休眠呢
作者: junonly    時(shí)間: 2009-04-01 11:23
如果另外一個(gè)線程需要該鎖,就可能會(huì)死鎖(至少是性能下降,不知道什么時(shí)候休眠的線程能被再次調(diào)度)
作者: yushang    時(shí)間: 2009-04-01 11:56
lock            lock
...               ...   
                        / lock
           =>         \ unlock
...               ...   
unlock        unlock
假設(shè)線程被搶占或者中斷了,無(wú)論是哪種方式,都等價(jià)于在線程中插入了另外一個(gè)執(zhí)行路徑,如果在該執(zhí)行路徑上會(huì)競(jìng)爭(zhēng)相同的自旋鎖,死鎖就發(fā)生了,如果不競(jìng)爭(zhēng)相同的自旋鎖,死鎖還是不會(huì)發(fā)生的,這樣理解對(duì)吧
作者: Cyberman.Wu    時(shí)間: 2009-04-01 12:55
spin lock基本上就是一個(gè)死循環(huán)不停地測(cè)試某個(gè)值有沒(méi)有變成預(yù)期的吧,所謂得到其實(shí)就是改了某個(gè)值而已,在改回去之后如果休眠了任何其它進(jìn)程(不管是本CPU還是其它的)再想得到這個(gè)spin lock就會(huì)在內(nèi)核態(tài)忙等了,多數(shù)會(huì)導(dǎo)致死機(jī)。
作者: ruanunix    時(shí)間: 2009-04-01 16:30
自旋鎖不休眠,信號(hào)量用來(lái)休眠
作者: new_learner    時(shí)間: 2009-04-11 21:09
原帖由 yushang 于 2009-4-1 09:52 發(fā)表
線程持有自旋鎖時(shí)為什么不能休眠呢


如果線程能休眠,那為什么不用信號(hào)量呢?
自旋鎖一般用于不能發(fā)生休眠(不會(huì)產(chǎn)生進(jìn)程上下文切換)的內(nèi)核路徑,比如中斷。



原帖由 yushang 于 2009-4-1 11:56 發(fā)表
lock            lock
...               ...   
                        / lock
           =>         \ unlock
...               ...   
unlock        unlock
假設(shè)線程被搶占或者中斷了,無(wú)論是哪種 ...

如果使用了自旋鎖,線程是不會(huì)發(fā)生內(nèi)核搶占的,可以看下自旋鎖的實(shí)現(xiàn):
在非SMP(UP)系統(tǒng)中:

  1. #define spin_lock(lock)                        _spin_lock(lock)

  2. #define _spin_lock(lock)                        __LOCK(lock)

  3. #define __LOCK(lock) \
  4.   do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)

  5. preempt_disable()禁止了內(nèi)核搶占
復(fù)制代碼


在SMP中

  1. #define spin_lock(lock)                        _spin_lock(lock)

  2. void __lockfunc _spin_lock(spinlock_t *lock)
  3. {
  4.         preempt_disable();
  5.         _raw_spin_lock(lock);
  6. }

  7. preempt_disable()禁止了內(nèi)核搶占
復(fù)制代碼


如果你怕中斷處理程序同時(shí)訪問(wèn)被中斷的進(jìn)程正在持有的自旋鎖,可以調(diào)用這樣的函數(shù):

  1. spin_lock_irqsave(lock, flags);

  2. spin_unlock_irqrestore(lock, flags) ;
復(fù)制代碼

這樣就萬(wàn)無(wú)一失了。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2