1、kmalloc、vmalloc、malloc的區別
vmallocmem = (unsigned char*)vmalloc(1000000);
printk("<1>vmallocmem addr=%x", vmallocmem);
return 0;
}void __exit mem_module_exit(void)
module_init(mem_module_init);
module_exit(mem_module_exit);
我們的系統上有160mb的記憶體空間,執行一次上述程式,發現pagemem的位址在0xc7997000(約3g+121m)、kmallocmem 位址在0xc9bc1380(約3g+155m)、vmallocmem的位址在0xcabeb000(約3g+171m)處,符合前文所述的記憶體布局。
2、簡要的闡述軟中斷、tasklet和工作佇列的區別
軟中斷、tasklet和工作佇列並不是linux核心中一直存在的機制,而是由更早版本的核心中的「下半部」(bottom half)演變而來。下半部的機制實際上包括五種,但2.6版本的核心中,下半部和任務佇列的函式都消失了,只剩下了前三者。本文重點在於介紹這三者之間的關係。(函式細節將不會在本文中出現,可以參考文獻,點這裡)
(1)上半部和下半部的區別
上半部指的是中斷處理程式,下半部則指的是一些雖然與中斷有相關性但是可以延後執行的任務。舉個例子:在網路傳輸中,網絡卡接收到資料報這個事件不一定需要馬上被處理,適合用下半部去實現;但是使用者敲擊鍵盤這樣的事件就必須馬上被響應,應該用中斷實現。
兩者的主要區別在於:中斷不能被相同型別的中斷打斷,而下半部依然可以被中斷打斷;中斷對於時間非常敏感,而下半部基本上都是一些可以延遲的工作。由於二者的這種區別,所以對於乙個工作是放在上半部還是放在下半部去執行,可以參考下面四條:
a)如果乙個任務對時間非常敏感,將其放在中斷處理程式中執行。
b)如果乙個任務和硬體相關,將其放在中斷處理程式中執行。
c)如果乙個任務要保證不被其他中斷(特別是相同的中斷)打斷,將其放在中斷處理程式中執行。
d)其他所有任務,考慮放在下半部去執行。
(2)為什麼要使用軟中斷?
軟中斷作為下半部機制的代表,是隨著smp(share memory processor)的出現應運而生的,它也是tasklet實現的基礎(tasklet實際上只是在軟中斷的基礎上新增了一定的機制)。軟中斷一般是「可延遲函式」的總稱,有時候也包括了tasklet(請讀者在遇到的時候根據上下文推斷是否包含tasklet)。它的出現就是因為要滿足上面所提出的上半部和下半部的區別,使得對時間不敏感的任務延後執行,而且可以在多個cpu上並行執行,使得總的系統效率可以更高。它的特性包括:
a)產生後並不是馬上可以執行,必須要等待核心的排程才能執行。軟中斷不能被自己打斷,只能被硬體中斷打斷(上半部)。
b)可以併發執行在多個cpu上(即使同一型別的也可以)。所以軟中斷必須設計為可重入的函式(允許多個cpu同時操作),因此也需要使用自旋鎖來保護其資料結構。
(3)為什麼要使用tasklet?(tasklet和軟中斷的區別)
由於軟中斷必須使用可重入函式,這就導致設計上的複雜度變高,作為裝置驅動程式的開發者來說,增加了負擔。而如果某種應用並不需要在多個cpu上並行執行,那麼軟中斷其實是沒有必要的。因此誕生了彌補以上兩個要求的tasklet。它具有以下特性:
a)一種特定型別的tasklet只能執行在乙個cpu上,不能並行,只能序列執行。
b)多個不同型別的tasklet可以並行在多個cpu上。
c)軟中斷是靜態分配的,在核心編譯好之後,就不能改變。但tasklet就靈活許多,可以在執行時改變(比如新增模組時)。
tasklet是在兩種軟中斷型別的基礎上實現的,因此如果不需要軟中斷的並行特性,tasklet就是最好的選擇。
(4)為什麼要使用工作佇列work queue?(work queue和軟中斷的區別)
上面我們介紹的可延遲函式執行在中斷上下文中(軟中斷的乙個檢查點就是do_irq退出的時候),於是導致了一些問題:軟中斷不能睡眠、不能阻塞。由於中斷上下文出於核心態,沒有程序切換,所以如果軟中斷一旦睡眠或者阻塞,將無法退出這種狀態,導致核心會整個僵死。但可阻塞函式不能用在中斷上下文中實現,必須要執行在程序上下文中,例如訪問磁碟資料塊的函式。因此,可阻塞函式不能用軟中斷來實現。但是它們往往又具有可延遲的特性。
因此在2.6版的核心中出現了在核心態執行的工作佇列(替代了2.4核心中的任務佇列)。它也具有一些可延遲函式的特點(需要被啟用和延後執行),但是能夠能夠在不同的程序間切換,以完成不同的工作。
廣聯達2018校招筆試題
廣聯達現場筆試,有一種難受叫做,沒時間了,也沒紙了,但是卻發現了程式的錯誤。第一題 輸入乙個n,輸出1 2 3 4 5 6 7.n的值。int fun int num return sum void main void main int num cin num int len sizeof ar s...
2018校園招聘科大訊飛校招筆試題
原題如下 課程衝突 時間限制 c c 語言 2000ms 其他語言 4000ms 記憶體限制 c c 語言 65536kb 其他語言 589824kb 題目描述 小明是一名學生,又到了學校的選課時間,他想選一些課程學習,已知課程開課時間都在每週一到周五之內,早上4講課,下午4講課,晚上2講課。小明擔...
筆試題 網易2018秋招內推筆試
問題描述 小易有乙個長度為n的整數序列,a 1,a n。然後考慮在乙個空序列b上進行n次以下操作 1 將a i放入b序列的末尾 2 逆置b序列 小易需要你計算輸出操作n次之後的b序列。輸入描述 輸入包括兩行,第一行包括乙個整數n 2 n 2 10 5 即序列的長度。第二行包括n個整數a i 1 a ...