- 論壇徽章:
- 0
|
下面的同步討論假設(shè)只是在單CPU系統(tǒng)上(可搶占)
在單CPU系統(tǒng)上內(nèi)核同步機(jī)制spin_lock代碼如下:
#define spin_lock(lock) _spin_lock(lock)
#define _spin_lock(lock) __LOCK(lock)
#define __LOCK(lock) \
do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
可見(jiàn)在單CPU系統(tǒng)上加鎖操作只是做了一個(gè)禁止搶占操作.
下面我有兩個(gè)疑問(wèn):
1: 假設(shè)進(jìn)程A正在訪(fǎng)問(wèn)臨界區(qū)D,此時(shí)系統(tǒng)來(lái)了一個(gè)IRQ將任務(wù)B喚醒;A任務(wù)被搶系統(tǒng)執(zhí)行任務(wù)B,如果此時(shí)任務(wù)B
也訪(fǎng)問(wèn)臨界區(qū)D ,這算是競(jìng)爭(zhēng)嗎?
在單CPU系統(tǒng)中,從微觀(guān)上來(lái)說(shuō),在某時(shí)刻系統(tǒng)只能執(zhí)行一個(gè)任務(wù),如果上面的問(wèn)題不算競(jìng)爭(zhēng),那么對(duì)單CPU系統(tǒng)來(lái)說(shuō)
訪(fǎng)問(wèn)內(nèi)存資源是不可能出現(xiàn)競(jìng)爭(zhēng)的,也就不需要任何加鎖操作。
2:接著1的問(wèn)題,如果上面情況不算是競(jìng)爭(zhēng), 那么在加鎖操作為什么要preempt_disable()?
對(duì)于SMP系統(tǒng)加鎖需要preempt_disable()禁止搶占還可以理解(為了提高SMP系統(tǒng)效率, 如果A核上的一個(gè)a進(jìn)程正在訪(fǎng)問(wèn)臨界區(qū)
此時(shí)a任務(wù)被搶占,,如果此時(shí)B核上的b任務(wù)正在忙等待鎖 ,此時(shí)系統(tǒng)效率就會(huì)降低;如果禁止搶占的話(huà) a任務(wù)就不會(huì)被搶占,從而可以
很快的釋放鎖.)
但是對(duì)于單CPU來(lái)說(shuō)同一時(shí)刻不可能有兩個(gè)任務(wù)同時(shí)在運(yùn)行,所以這里禁止搶占是什么意思? |
|