# Linux kernel 面試考題 ###### tags: `Interview`,`linux` ## Process vs Thread ### Process * Process 意旨已經執行並且 load 到記憶體中的 Program * 由「memory space」,「thread」 * 不是基本執行單元,thread才是執行單元 * 需要資源(CPU, memory, file, io device)才能完成工作 ### Thread * 共享process資源(code, data, file) * 有自己的「stack」,「register」 ## Multi-Process vs Multi-Thread ### Multi-Process * 因為不同Process之間有各自的記憶體空間,所以不同Process之間需要溝通則透過系統函式 * 優:相同時間內可以完成較多工作 ### Multi-Thread * 當不同thread要操作同一個資料時,需要透過spin lock 或 mutex等機制來解決 * 優:相同工作可以在較短的時間內完成 ### overall * 速度方面 multi-process > multi-thread * 資源消耗方面 multi-process > multi-thread * 記憶體消耗方面 multi-process > multi-thread * 若程式當掉,則multi-thread會全滅,但multi-process則不一定 # Synchronization * critical section * 在同步的程式設計中,臨界區段指的是一個存取共享資源的程式片段,而這些共享資源又無法同時被多個執行緒存取的特性。 當有執行緒進入臨界區段時,其他執行緒或是行程必須等待,有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共享資源是被互斥或的使用,例如:semaphore. ## 硬體解決方法 ### spin lock * 其他process會busy waiting直到spin lock 解鎖 * 會disable kernel preemption * UP的spin lock基本上不存在,就只是做disable preemption而已 * 使用原則 * 如果使用spin lock時間很長,則不要用spin lock,基本上要在2個context switch結束 * 不能在spin lock裡面使用遞迴 * spin lock可以被interrupt打斷,所以要使用spin lock時要確保interrupt不會操作到同一個資料結構,如果不能保證則需disable interrupt(local interrupt->自己那顆CPU) * 或是用spin_lock_irq, spin_lock_irqsave * spin_lock_irq: 先disable interrupt再lock,離開的時候再enable intterrupt(少用,可能原本進來時interrupt就已經disable了,離開時會把本來關掉的intterrupt打開) * spin_lock_irqsave:會把intterrupt status存起來,離開時會變回原來的狀態 * read/write spin lock * 一個process寫,多個process讀 ## copy on write * 好處: * 減少分配和複製記憶體空間的延遲時間 * 減少不必要的資源分配 * 運作: * fork()之後,child process的記憶體空間會指向和parents process同一個位址,並設置為read-only,當開始執行並需要修改記憶體時,cpu會檢測到read-only而觸發page fault,並將修改的page複製一份 * exec()則是會完整建立一個記憶體空間給chile process ### semaphore & mutex * sleeping lock(把自己set to idle) * 沒有disable preemption * 把task放到wait queue * 適合用在需要lock很長時間的情況 * 不能在interrupt 裡面使用 * 不能hole spin lock在去hole semaphore(但是可以hole semaphore再hole spin lock) * mutex * semaphore的一個special case ### completion variables ### sequential locks ### interrupt disable ### preemptions disable ### memory barriers ## 軟體解決方法 * Peterson solution # Memory ## kernel space vs user space * kernel mode -> ring0 / user mode -> ring3 ### kernel space * kernel space的程式就可以透過machine code來操作cpu所管理的硬體資源 ### user space * 不能直接操作硬體資源,需要透過syscall # C ## stack vs Heap * https://blog.gtwang.org/programming/memory-layout-of-c-program/ ### stack * 用於靜態記憶體配置 * local variable, function call address ### heap * 用於動態記憶體配置 * malloc ## function call * https://hackmd.io/@dange/rk9xmgHKX?type=view * 疊一個stack frame ```asm= push rbp mov rsp, rbp sub ... ... add ... mov rbp, rsp pop rbp ret ``` ## function pointer * 好處: * 程式可讀性、維護 * 當有一個事件需要對應到很多個function時,不用寫很多if/else or switch case # programming concept ## recursive vs iteration * recursive * 優:程式簡潔、可讀性、較少記憶體空間 * 缺:執行時參數的存取費時、需要額外stack * iteration * 優:不需要額外stack、節省執行時間 * 缺:浪費記憶體空間、程式攏長、可讀性差 ## diff. linked list and array ### Array * 需要事先宣告大小 * 在compier時就宣告好空間,固定 * 記憶體空間是連續的 * 直接存取或隨機存取 * 使用的記憶體空間較少 ### link * 可以動態宣告 * 在run time時配置空間,有彈性 * 記憶體空間可以不連續 * 需要走訪每個節點才能取得資料 * 使用的記憶體空間較大(要多存指標)