Linux內核奔跑卷
京東購書:
item.jd.com/12152745.ht…
試讀地址:
www.epubit.com.cn/book/detail…
在閱讀本書以前,請讀者用兩小時來完成Linux內核奔跑卷,對Linux內核瞭解程度作簡要的瞭解。奔跑卷僅僅是Linux內核知識的娛樂遊戲節目,但願能給讀者帶來一絲樂趣,套用國內某個科技圈裏知名人士的名言「不服,來跑個分吧!」。html
下面一共20道大題目,每道大題目10分,一共200分,讀者能夠邊閱讀內核源代碼邊作題目,請在兩小時內完成。如沒有特殊說明,本奔跑卷基於Linux 4.0內核和ARM32/ ARM64體系架構。數據結構
1.請簡述在你所熟悉的處理器中(好比雙核Cortex-A9)一條存儲讀寫指令的執行全過程。架構
2.在一個32KB的4路組相聯的cache中,其中cache line爲32Byte,請畫出這個cache組相聯的結構圖。負載均衡
3.內核的一級頁表和二級頁表存放在什麼地方?用戶進程的一級頁表和二級頁表分別存放在什麼地方?函數
4.關於夥伴系統的幾個小問題:優化
- 系統初始化時,物理內存頁面是如何添加到夥伴系統中的?
- 系統運行時間長了物理內存會出現碎片化,夥伴系統如何避免物理內存的碎片化?
5.關於物理頁面內存分配器的幾個小問題:ui
- 請簡述Linux內核在理想狀況下頁面分配器(page allocator)是如何分配出連續物理頁面的?
- 如何從分配掩碼中肯定能夠從哪些zone中分配內存?
- 頁面分配器是按照什麼方向來掃描zone的?
6.關於slab分配器幾個小問題:spa
- slab分配器是如何分配和釋放小內存塊的?
- slab分配器中有一個着色的概念(cache color),着色有什麼做用?
- slab分配器中的slab對象有沒有根據per-cpu作一些優化,爲何?
7.用戶進程使用malloc()來分配10個page大小的內存,請問內核是否立刻分配物理內存?請描述malloc()在內核空間的實現過程。線程
8.關於struct page數據結構的幾個小問題:設計
- struct page數據結構中的_count和_mapcount有什麼區別?
- 匿名頁面和文件緩衝頁面有什麼區別?
- trylock_page()和lock_page()有什麼區別?
9.關於頁面回收的幾個小問題:
- LRU鏈表如何知道page的活動頻繁程度?
- kswapd是按照什麼方向來掃描zone的?
- 內核有哪些頁面會被kswapd寫回到交換分區?
- 當page加入到lru鏈表中,被其餘線程釋放了這個page,那麼lru鏈表如何知道這個page已經被釋放了?
10.關於內存管理的幾個重要的數據結構的關係,如mm、vma、page、vaddr、paddr:
- 如何由mm數據結構和虛擬地址vaddr找到對應的VMA?
- 如何由page和VMA找到虛擬地址vaddr?
- 如何由page找到全部映射的VMA?
- 如何由VMA和虛擬地址vaddr,找出相應的page數據結構?
11.關於缺頁中斷和虛擬內存的幾個小問題:
- 若是用戶進程使用只讀屬性(PROT_READ)來mmap映射一個文件到用戶空間,而後使用memcpy來寫這段內存空間,會是什麼樣的狀況?
- 若是多個VMA的虛擬頁面同時映射了同一個匿名頁面,那麼此時page->index應該等於多少?
12.關於進程的幾個小問題:
- 在內核中如何獲取當前進程的task_struct數據結構?
- 下面小代碼片斷裏,最後會打印出什麼?
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-\n");
}
wait(NULL);
wait(NULL);
return 0;
}複製代碼
13.關於CFS調度器的幾個小問題:
- 請簡述CFS調度器是如何工做的?
- vruntime是如何計算的?
- min_vruntime有什麼做用?
- 對新建立的進程和剛喚醒的進程有何關照?
14.關於SMP負載均衡的幾個小問題:
- 普通進程的平均負載load_avg_contrib是如何計算的?runnable_avg_sum和runnable_avg_period是什麼含義?
- 一個4核處理器裏每一個物理CPU核有獨立L1 cache而且只有一個線程,分紅兩個簇cluster0和cluster1,每一個簇包含兩個物理CPU核,簇中的CPU核共享L2 cache。請畫出該處理器在Linux內核裏調度域和調度組的拓撲關係圖。
15.關於spinlock的幾個小問題:
爲何spinlock的臨界區不能睡眠(不考慮RT-Linux的狀況)?
若是在spin_lock()和spin_unlock()的臨界區中發生了中斷,而且中斷處理程序恰巧也修改了該臨界資源,那麼會發生什麼後果?如何避免?
Ticket-based的spinlock機制是如何實現的?有什麼優缺點?
16.讀寫信號量使用的自旋等待機制(optimistic spinning)是如何實現的?
17.關於RCU的幾個小問題:
- 請解釋Quiescent State和Grace Period?
- 在mm/oom_kill.c的select_bad_process()函數中爲何要使用rcu_read_lock()?何時註冊RCU回調函數呢?
18.關於中斷的幾個小問題:
- 硬件中斷號和Linux內核的IRQ中斷號是如何映射的?
- 一個硬件中斷髮生以後,Linux內核是如何響應並處理該中斷的?
- 爲何說中斷上下文不能執行睡眠操做?
19.關於軟中斷的幾個小問題:
- 軟中斷回調函數的執行過程當中是否容許響應本地中斷?
- 同一類型的軟中斷是否容許多個CPU並行執行?
- 是否容許同一個Tasklet在多個CPU上並行執行?
20.關於workqueue的幾個小問題:
- workqueue是運行在中斷上下文,仍是進程上下文?其回調函數容許睡眠嗎?
- 若是有多個work掛入到一個工做線程中執行,當某個work的回調函數執行了阻塞操做,那麼剩下的work該怎麼辦?
答案:
奔跑卷的答案都分佈在本書的各個章節。
若是答對了90%以上,那麼恭喜您,您是深刻了解Linux內核的高手,本書可能不適合您,不過您能夠轉給身邊有須要的小夥伴。
若是答對了30%以上,那麼您對Linux內核有必定的瞭解,固然本書也適合您繼續深刻了解。
若是答對題目少於30%,那麼您還不是十分了解和精通Linux哦。如今就開始閱讀本書,與笨叔叔和小企鵝一塊兒快樂奔跑吧!固然您也能夠先閱讀Robert Love的《Linux內核設計與實現》,或者《Linux設備驅動程序》,而後再閱讀本書。