《奔跑吧 Linux內核》之Linux內核奔跑卷

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;
}複製代碼


  • 優先級、nice和權重之間有什麼關係?


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設備驅動程序》,而後再閱讀本書。

    相關文章
    相關標籤/搜索