填空題
1. Linux的設(shè)備驅(qū)動(dòng)分為 _________________三類,串口是什么類型設(shè)備______?
答案:字符、塊、網(wǎng)絡(luò);字符。
需要說明的是,現(xiàn)實(shí)生活中的問題沒有絕對,字符、塊、網(wǎng)絡(luò)更多是從用戶的使用層面上來說的,但是Linux的很多驅(qū)動(dòng)根本沒有用戶的使用層面,比如USB控制器、I2C控制器驅(qū)動(dòng)等,他們更多的是給USB外設(shè)、I2C外設(shè)提供內(nèi)核空間的傳輸接口。再比如針對Flash的MTD子系統(tǒng),也本身不能歸納為字符、塊還是網(wǎng)絡(luò)。MTD既有字符層面的接口,但是更多的是MTD層面的read page、write page、read oob, write oob,erase block這樣的提供給yaffs2, jffs2等文件系統(tǒng)的接口。當(dāng)然MTD也可以轉(zhuǎn)block。
我們絕對不能孤立和鉆牛角尖地去一定得出一個(gè)不是此就是彼的結(jié)論。
2.下面的程序,在Ubuntu PC的terminal運(yùn)行,打印幾個(gè)hello__________
main()
{
fork();
printf("hello ");
fork();????
printf("hello ");
while(1);
}
答案:6個(gè)hello。
第一次fork后,出現(xiàn)2個(gè)進(jìn)程執(zhí)行第一個(gè)printf,之后2個(gè)進(jìn)程又執(zhí)行了fork,這個(gè)時(shí)候有4個(gè)進(jìn)程執(zhí)行第2個(gè)printf。進(jìn)程tree關(guān)系如下:
3. 用>=,>, ?=, ?<, ?<=? 連接進(jìn)程的如下4個(gè)內(nèi)存描述形式,分析它們之間的大小關(guān)系:
VSS______________ RSS
PSS_______________RSS
USS_______________PSS
答案:vss>=rss>=pss>=uss
理解一個(gè)進(jìn)程的內(nèi)存消耗的時(shí)候,要理解vss,rss,pss,uss這4個(gè)基本概念。它們的解釋分別為:
VSS- Virtual Set Size 虛擬耗用內(nèi)存
RSS- Resident Set Size 實(shí)際使用物理內(nèi)存
PSS- Proportional Set Size 比例化后實(shí)際使用的物理內(nèi)存
USS- Unique Set Size 進(jìn)程獨(dú)自占用的物理內(nèi)存
下面的一幅圖上有3個(gè)進(jìn)程,pid為1044的 bash、pid為1045的 bash和pid為1054的 cat。每個(gè)進(jìn)程透過自己的頁表,把虛擬地址空間指向內(nèi)存條上面的物理地址,每次切換一個(gè)進(jìn)程,即切換一份獨(dú)特的頁表。
僅從此圖而言,進(jìn)程1044的vss和rss分別是:
vss= "1"+"2"+"3"
rss= "4"+"5"+"6"
但是是不是“4"+"5"+"6”就是1044這個(gè)進(jìn)程真實(shí)耗費(fèi)的內(nèi)存呢?這顯然也是不準(zhǔn)確的,因?yàn)?4"明顯被3個(gè)進(jìn)程指向,"5"明顯被2個(gè)進(jìn)程指向,壞事是大家一起干的,不能1044一個(gè)人背黑鍋。這個(gè)時(shí)候,就衍生出了一個(gè)pss(按比例計(jì)算的駐留內(nèi)存)的概念,僅從這一幅圖而言,進(jìn)程1044的pss為:
rss= "4"/3 +"5"/2 +"6"
最后,還有進(jìn)程1044獨(dú)占且駐留的內(nèi)存uss(Unique Set Size?),僅從此圖而言,
Uss = "6"。
4. 下面這個(gè)程序,三次打印的data分別是__, __, __。
int data = 10;
int child_process()
{
printf("Child process %d, data%d ",getpid(),data);
data = 20;
printf("Child process %d, data%d ",getpid(),data);
_exit(0);
}
int main(int argc,char* argv[])
{
if(vfork()==0) {
child_process(); ???
}
else{
sleep(1);
printf("Parent process %d,data %d ",getpid(), data);
}
}
答案:10, 20,20?
本題屬于送分題。既然是vfork,子進(jìn)程會(huì)在vfork后將自己的MM直接暫時(shí)指向父進(jìn)程。
本題若將vfork改為fork,答案則為10, 20, 10。因?yàn)閒ork,會(huì)執(zhí)行內(nèi)存的“寫時(shí)拷貝”
5. ?請描述內(nèi)核代碼如下三種編譯方式的含義
[]?____________________
[*]?__________________
[M]?___________________
答案:不編譯,編譯進(jìn)kerne的image,編譯為module。送分題。
6. ?gdb設(shè)置斷點(diǎn)的指令是______,單步n和s的區(qū)別是____________________________________
答案:b, n單步會(huì)跳過函數(shù),s單步會(huì)進(jìn)入函數(shù)
7. 下面一段python程序:
hello.py
print "Hello World! Love, Python"
echo 3 > /proc/sys/vm/drop_caches后,第2次運(yùn)行比第一次運(yùn)行快的原因是?
答案:下面的測試可以顯示第二次比第一次快的原因。
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
第一次運(yùn)行:
$ ime -v python hello.py
Hello World! Love, Python
Command being timed: "python hello.py"
...
Elapsed (wall clock) time (hss or m 0:00.19
...
Major (requiring I/O) page faults: 29
Minor (reclaiming a frame) page faults: 546
Voluntary context switches: 122
Involuntary context switches: 34
Swaps: 0
File system inputs: 9920
...
第二次運(yùn)行:
$ ime -v python hello.py
Hello World! Love, Python
Command being timed: "python hello.py"
...
Elapsed (wall clock) time (hss or m 0:00.01
...
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 552
Voluntary context switches: 1
Involuntary context switches: 8
Swaps: 0
File system inputs: 0
File system outputs: 0
...
第2次運(yùn)行的速度比第一次快了很多倍,是因?yàn)榈?次里面大量的major page fault和file讀取沒有了。第一次的運(yùn)行導(dǎo)致I/O在內(nèi)存的page cache的大量命中。
8. 請用公式描述下圖free命令中數(shù)字的關(guān)系
a = ___________ +? ________
g = b - ________ - _________
h = c + ________ + _________
答案:a= b+c; g= b- e -f; h =c +e +f; 送分題。
第二行的used是第一行used減去兩類page cache(buffers和cached);第二行的free是第一行的free加上兩類page cache。
buffers是指用來給塊設(shè)備做的page cache大小(比如/dev/sda1);cached是來給文件系統(tǒng)里面文件做的page cache大小(比如/usr/local/xxx/1.jpg)。
問答題
1. 描述內(nèi)核atomic, spinlock, mutex這三個(gè)鎖分別的實(shí)用場景和主要區(qū)別
答案:atomic針對的是一個(gè)整數(shù),可以用于中斷、軟中斷、進(jìn)程上下文。但是由于現(xiàn)實(shí)生活中,一個(gè)整數(shù)獨(dú)立與別人無關(guān)的場景并不特別多見,所以atomic用地并沒有想象地那么多。比如下面一個(gè)結(jié)構(gòu)體
struct a
{
int a1;
int a2;
int a3;
};
盡管a1, a2, a3都是int,但是并不意味著可以用atomic單獨(dú)操作a1, a2, a3,因?yàn)樗麄冎g經(jīng)常彼此交織,很可能應(yīng)該被共同加lock,采用spinlock或mutex。
spinlock針對一個(gè)區(qū)間(critical section),spinlock鎖住的區(qū)間不能睡眠,因此,spinlock也是中斷、軟中斷、進(jìn)程上下文到處都可以用。spinlock在核內(nèi)會(huì)關(guān)閉scheduler,多核下核間則自旋(核A中斷、軟中斷、進(jìn)程拿到后,核B中斷、軟中斷、進(jìn)程想拿,核B自旋)。一般情況下,spinlock鎖住的區(qū)間要短,要不睡眠。
mutex鎖住的區(qū)間可能睡眠,當(dāng)一個(gè)進(jìn)程拿不到mutex的時(shí)候,也會(huì)放棄CPU進(jìn)入睡眠狀態(tài),直至目前占有mutex的進(jìn)程釋放mutex將其喚醒。mutex鎖住的區(qū)間可能睡眠,mutex拿不到的時(shí)候也會(huì)自身進(jìn)程睡眠,因此mutex一般只能用于進(jìn)程上下文,不適合中斷、軟中斷、鎖住本核調(diào)度器的spinlock區(qū)間內(nèi)。
編輯:黃飛
?
評論
查看更多