华为内部面试题库---(10)
1. 對(duì)于linux內(nèi)核信號(hào)量,說法正確的是(多選):(參考:Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn),第二版,第9章,9.4小節(jié))
A. 如果獲取一個(gè)被占用的信號(hào)量,任務(wù)會(huì)睡眠,等待信號(hào)量釋放之后,該任務(wù)才能重新獲得調(diào)度
B. 信號(hào)量可以允許任意數(shù)量的鎖持有者
C. 信號(hào)量保護(hù)的代碼可以被搶占
D. 信號(hào)量的實(shí)現(xiàn)也是與體系架構(gòu)相關(guān)的
答案:A,B,C,D
試題解析:信號(hào)量是一個(gè)睡眠鎖,在信號(hào)量被占用時(shí),企圖獲取該信號(hào)量的任務(wù)會(huì)睡眠,等待信號(hào)量被釋放,或者被喚醒,之后再重新獲得調(diào)度;
信號(hào)量在初始化時(shí),其count可以初始化為大于等于0的任何數(shù)值,因此可以允許任意數(shù)量的鎖持有者;
信號(hào)量獲取后,在釋放之前,并不管搶占,正因?yàn)檫@個(gè)原因,在可搶占的內(nèi)核中,高優(yōu)先級(jí)任務(wù)可以搶占獲取信號(hào)量的低優(yōu)先級(jí)任務(wù);
在內(nèi)核中,信號(hào)量數(shù)據(jù)結(jié)構(gòu)如下:
struct semaphore {
?????? spinlock_t????????????? lock;
?????? unsigned int?????????? count;
?????? struct list_head?????? wait_list;
};
自旋鎖保護(hù)P/V(對(duì)其count加減)操作,而自旋鎖是基于原子操作才能實(shí)現(xiàn),因此信號(hào)量是與體系架構(gòu)相關(guān)的。
?
2. 對(duì)于內(nèi)核信號(hào)量,對(duì)其使用方法,錯(cuò)誤的是(單選):(參考:Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn),第二版,第9章,9.4小節(jié))
A. 信號(hào)量在使用之前一定要初始化,否則在使用時(shí)可能會(huì)導(dǎo)致內(nèi)核崩潰
B. 對(duì)信號(hào)量的操作,其實(shí)就是P/V操作,在linux內(nèi)核中,對(duì)信號(hào)量的down()相當(dāng)于V操作,up()相當(dāng)于P操作
C. 在使用down_interruptible()函數(shù)未獲取信號(hào)量時(shí),進(jìn)入睡眠的任務(wù)可以被信號(hào)喚醒
D. 如果想在獲取信號(hào)量失敗后超時(shí)退出,可以使用down_timeout()函數(shù)接口
答案:B
試題解析:內(nèi)核信號(hào)量以及內(nèi)核mutex,在使用之前都需要初始化,內(nèi)核對(duì)信號(hào)量的初始化,方法有:
1. ?sema_init(struct semaphore *sem, int val),將count的值初始化為val;
2. init_MUTEX(sem), 將count的值初始化為1,通常用于互斥操作;
3. init_MUTEX_LOCKED(sem), 將count的值初始化為0,通常用于異步事件的同步;
在linux內(nèi)核中,對(duì)信號(hào)量的down()相當(dāng)于P操作,up()相當(dāng)于V操作
down_interruptible()以及down_timeout()接口函數(shù),可參考內(nèi)核代碼。
因此選B
?
3. 對(duì)于信號(hào)量和自旋鎖使用區(qū)別,錯(cuò)誤的是(單選):(參考:Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn),第二版,第9章,9.4小節(jié))
A. 信號(hào)量適合于多進(jìn)程對(duì)資源互斥,競(jìng)爭(zhēng)失敗就會(huì)發(fā)生上下文切換,適合進(jìn)程長(zhǎng)時(shí)間占用資源;
B. 如果占用資源時(shí)間短于線程上下文切換開銷時(shí)間,使用自旋鎖
C. 在使用信號(hào)量和自旋鎖時(shí),持有信號(hào)量或者自旋鎖的代碼可以被高優(yōu)先級(jí)任務(wù)搶占
D. 如果需要在中斷上下文中保護(hù)臨界區(qū),則只能使用spinlock,不能使用信號(hào)量
答案:C
試題解析:信號(hào)量特點(diǎn):
1. linux中的信號(hào)量是一種睡眠鎖,當(dāng)一個(gè)任務(wù)試圖獲得一個(gè)已經(jīng)被占用的信號(hào)量,信號(hào)量會(huì)將其推進(jìn)一個(gè)等待隊(duì)列,然后讓其睡眠。
2. 爭(zhēng)用信號(hào)量的進(jìn)程在等待鎖可用時(shí)會(huì)睡眠,使用鎖長(zhǎng)時(shí)間持有的情況;
3. 允許任意數(shù)量持有該鎖。
自旋鎖特點(diǎn):
1. 低開銷加鎖;
2. 短期鎖定;
3. 可用于中斷上下文中加鎖;
4. 只允許一個(gè)任務(wù)獲取。
自旋鎖用于多核之間的同步,因此需要禁止搶占,否則很容易造成死鎖(如在本地CPU上任務(wù)被搶占,在高優(yōu)先級(jí)任務(wù)中又獲取了同一個(gè)自旋鎖,死鎖)由此得出:C錯(cuò)誤,獲取自旋鎖的代碼不能被搶占。
?
4. 下面不是解決linux內(nèi)核態(tài)并發(fā)機(jī)制的是(單選):(參考:Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn),第二版,第9章)
A. 自旋鎖;
B. 互斥鎖mutex
C. 原子操作
D. 管道
答案:D。
試題解析:管道是一種用戶態(tài)進(jìn)程間通信機(jī)制。管道是進(jìn)程之間的一個(gè)單向數(shù)據(jù)流:一個(gè)進(jìn)程寫入管道的所有數(shù)據(jù)都由內(nèi)核定向到另一個(gè)進(jìn)程,另一個(gè)進(jìn)程由此就可以從管道中讀取數(shù)據(jù)。
?
5. 下面不是內(nèi)核態(tài)和用戶態(tài)間通信機(jī)制的是(單選):(參考:http://www.ibm.com/developerworks/cn/linux/l-netlink/index.html)
A. Netlink;
B. 消息隊(duì)列
C. 系統(tǒng)調(diào)用
D. ioctl
答案:B
試題解析:消息隊(duì)列是一種用戶態(tài)進(jìn)程間通信機(jī)制,不能實(shí)現(xiàn)內(nèi)核態(tài)和用戶態(tài)間通信;
Netlink,系統(tǒng)調(diào)用,ioctl是使用較多的內(nèi)核態(tài)和用戶態(tài)間通信機(jī)制,其中系統(tǒng)調(diào)用只能由用戶態(tài)發(fā)起。
轉(zhuǎn)載于:https://www.cnblogs.com/hehehaha/archive/2013/05/20/6332760.html
總結(jié)
以上是生活随笔為你收集整理的华为内部面试题库---(10)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 中使用AsyncTask
- 下一篇: 微信不绑定卡怎么收钱