# OS 面試題 :::success **面試整理** 1. [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) 2. [聯發科上機考面試整理](https://hackmd.io/@Rance/SkSJL_5gX) ::: ## 10/10 ### 4. 什麼是OS? from [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) 確保 Process 可以正確執行,不會讓 Process 跟 Process 之間互相干擾,並透過 kernel mode 跟 user mode 保護硬體,並提供 high level 的 system call 讓使用者不能直接操作硬體,簡化操作,也更加有效率等。 ### 54. TCP/IP Model from [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) ![](https://i.imgur.com/aKHEDyo.png) OSI 7 layers physical layer session layer transport layer //tcp Network //IP link layer //mac addr physical ### 10. pointer From [聯發科上機考面試整理](https://hackmd.io/@Rance/SkSJL_5gX) ```c++= int a[5]={1,2,3,4,5}; int *p=a; *(p++)+=123; *(++p)+=123; ``` 請問a陣列的每個值為何? {124, 2, 126, 4, 5} ## 10/15 ### 13.寫一個 function 可傳入正整數參數 N,回傳 1 + 2 + 3 +…+N 的和: From [聯發科上機考面試整理](https://hackmd.io/@Rance/SkSJL_5gX) :::success ```c++= int nsum (int n) { return (1+n)*n/2; } ``` ::: ### 15. 寫一個“標準”巨集MIN ,這個巨集輸入兩個參數並返回較小的一個。 From [聯發科上機考面試整理](https://hackmd.io/@Rance/SkSJL_5gX) ```c++= #define min(a,b) ((a>b?b:a)) ``` ### 10. atomic From [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) :::warning atomic transaction 因為一個 transaction 由一 instruction set 所組成 如果指明了某一 transaction 是 atomic 代表這個 transaction 在執行時, 其所屬的 instruction set 不是全部執行 不然就是全部不執行, 沒有那種執行一半的 ::: ### 13.Real-time operating system, RTOS From [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) :::danger 實時作業系統與一般的作業系統相比,最大的特色就是其「實時性」, 也就是說,如果有一個任務需要執行, 實時作業系統會馬上(在較短時間內)執行該任務, 不會有較長的延時。這種特性保證了各個任務的及時執行 設計實時作業系統的首要目標不是高的吞吐量,而是保證任務在特定時間內完成 ::: ### 44. write through / write back 的差別,哪個快? From [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) write through: 是直接把資料寫回記憶體 write back: 是先將資料按一定數量接受下來﹐然後將相同位址的資料一次過整批送回記憶體 write back快很多,早期的 cache 只有 write through 模式﹐但現在的 cache 都使用 write back 模式 ## 10/17 ### 5. 講解一下如何避免 Race Condition From [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) #### 5-1 解決此問題的基本概念,便是讓共享的資源在不同執行緒內可以受到控制, 但有時因為設計不良,便會出現競爭危害(race hazard)。又稱為競爭條件(race condition) OS本身有提供 Semaphore 跟 Monitor 只要使用得當就可以避免這樣的問題。 #### 5-2 下列程式會產生 race codition問題,我們無法確定最後` var `的值是 `10 `或是` 20`? ```c++= Parent thread: Child thread: int var; // global variable // create child thread pthread_create(...) var = 20; // // var = 10; exit pthread_join(...) printf("%d\n", var); ``` Parent thread: Child thread: int var; // global variable pthread_lock lock; // create child thread pthread_create(...) pthread_mutex_lock(&lock) var = 20; pthread_mutex_unlock(&lock) pthread_mutex_lock(&lock) var = 10; pthread_mutex_unlock(&lock) exit pthread_join(...) printf("%d\n", var); var = 10 :::info #### ANS: 直覺的解法便是讓兩段設定var的程序有先後關係,如下例, 透過訊息的傳遞會讓設定 var 值的程序有 "happens-before" 關係, 也就是 var = 20; 一定會在 var = 10; 之前發生。因此最後的結果固定會是10。 Parent thread: Child thread: int var; // create child thread pthread_create(...) var = 20; // send message to child // wait for message to arrive var = 10; exit // wait for child pthread_join(...) printf("%d\n", var); 所以,若是某個記憶體內的資料,會同時被兩個不同的 thread進行存取, 我們可以先檢查這兩個 thread 寫入同份資料時是否存在 "happens-before relation", 若不存在此關係,便存在 race condition. ::: ### 8. CPU怎麼處理interrupt ? 處理的時候會做什麼? From [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#4) ![](https://i.imgur.com/kIY0kvt.png) ● Interrupt 的種類 **I. External Interrupt(外部中斷):** CPU 外的週邊元件所引起的。 (I/O Complete Interrupt, I/O Device error) **II. Internal Interrupt(內部中斷):** 不合法的用法所引起的。 (Debug、Divide-by-zero、overflow) **III. Software Interrupt(軟體中斷):** 使用者程式在執行時,若需要OS 提供服 務時,會藉由System Call 來呼叫OS 執行對應的service routine,完成服務請求 後,再將結果傳回給使用者程式。 ● Interrupt 的處理流程 **Setps** 1. 暫停目前process 之執行。 2. 保存此process 當時執行狀況。 3. OS 會根據Interrupt ID 查尋Interrupt vector。 4. 取得ISR(Interrupt Service Routine)的起始位址。 5. ISR 執行。 6. ISR 執行完成,回到原先中斷前的執行。 **Interrupt I/O(中斷式I/O)** Steps 1. 發出I/O 要求給CPU(OS)。 2. CPU 設定I/O commands 給I/O Device controller。 3. I/O Device 運作執行。 4. PA 等待 I/O 完成。 5. PB 取得CPU 執行。 6. 當I/O 運作完成,則I/O 會發出一個「I/O Complete Interrupt」(I/O完成中斷) 通知OS。 7. OS 暫停目前process 的執行。 8. OS根據Interrupt ID 去查詢Interrupt vector,取出對應的ISR(Interrupt Service Routine)的起始位址。 9. CPU 執行ISR。 10.ISR 執行完畢,OS 通知PA 其I/O 要求完成,將PA 的狀態改成Ready。 11.由CPU 排班挑選process 執行。 ISR: ISR簡單來說就是中斷會跳去執行的函式,而他跟task或process不同的地方是, 做context switch的時候ISR只會PUSH部份暫存器,而task或process會push所有的暫存器 ## 20.Find the possible error From [聯發科上機考面試整理](https://hackmd.io/@Rance/SkSJL_5gX) ```c++= int ival; int **p; pointer to pointer Ival = *p; <- ``` **ANS:** reference a pointer to a int ## 10/23 ### 10. 介紹一下Mutex、Semaphore、Spinlock :::info 30秒: 最大的差異在於 Mutex 只能由上鎖的 thread 解鎖, 而 Semaphore 沒有這個限制, 可以由原本的 thread 或是另外一個 thread 解開。 另外,Mutex 只能讓一個 thread 進入 critical section, Semaphore 的話則可以設定要讓幾個 thread 進入。 這讓實際上使用 Mutex 跟 Semaphore 場景有很大的差別。 _ 60秒 (cont.): 舉例而言,Mutex 的兩個特性: 一個是只能有持鎖人解鎖、一個是在釋放鎖之前不能退出的特性, 讓 Mutex 叫常使用在 critical section 只能有一個 thread 進入, 而且要避免 priority inversion 的時候; Semaphore 也能透過 binary semaphore 做到類似的事情, 卻沒有辦法避免 priority inversion 出現。 _ 120秒 (cont.): 而 Semaphore 更常是用在同步兩個 thread 或功能上面, 因為 Semaphore 實際上使用的是 signal 的 up 與 down, 讓 Semaphore 可以變成是一種 notification 的作用, 例如 A thread 執行到某個地方時 B thread 才能繼續下去, 就可以使用 Semaphore 來達成這樣的作用。 Mutex是一把鑰匙,一個人拿了就可進入一個房間,出來的時候把鑰匙交給隊列的第一個。 一般的用法是用於串行化對critical section代碼的訪問, 保證這段代碼不會被並行的運行。 (Function前用mutex lock,執行完unction後把mutex後釋出, sleep給其他thread使用) (A mutex is really a semaphore with value 1.) ::: :::info Semaphore是一件可以容納N人的房間,如果人不滿就可以進去, 如果人滿了,就要等待有人出來。 對於N=1的情況,稱為binary semaphore。 一般的用法是,用於限制對於某一資源的同時訪問。 semaphore, mutex 會有睡覺的副作用, 什麼是「睡覺」, 就是原本在執行的這段程式碼, 在執行了 semaphore, mutex 的 function 之後, 有可能會自己把 cpu 讓出去 (有點像是 coroutine 的 yeild), 要 等一會兒才會再繼續執行; 那 spinlock 呢? 答案很有趣, 在 kernel space 不會, 甚是在 kernel space 的 spinlock 還需要關閉中斷, 很多情境都比 user mode 複雜; 在 user space 一樣會讓出 cpu, 不過是被迫讓出去 (os 排程的管理), 而不是自己讓出去 spinlock spinlock利用test and set這個指令看有沒有辦法取得lock 因為是指令層級的操作所以有辦法達到atomic 當lock無法取得時會用polling的方式不斷嘗試 特別的地方是當他取得lock時 process將不會進入睡眠(沒有context switch) 效能會比semaphore好 因為他不做context switch可以一直執行 ::: :::info **mutex vs spinlock** Mutex 屬於 sleep-waiting 類型的鎖。 Spin lock 屬於 busy-waiting 類型的鎖。 只能用在 thread 程式, 如果是兩個 process, 你沒辦法用 mutex/spinlock 去保護共享資源, 共享資源並非只有共享記憶體/變數, file, 硬體資源都是。 **mutex vs semaphore** mutex 除了擁有者外還有優先權的概念, 類似 thread 的優先權那樣 semaphore 不只能用在 thread 程式, 兩個不同的 process 也可以用 semaphore 共享資源。 不過 3 者的共同點都需要 atomic 的操作。 ::: ### 18. Memory Hierarchy register cache memory disk(Hard disk) Tape :::info Register – Cache – Main Memory – Disk –Tape 愈快 ← 速度 → 愈慢 愈昂貴 ← 價格 → 愈便宜 愈小 ← 容量 → 愈大 **SRAM (Static RAM):** 用Flip/Flop儲存,速度快,密度低(元件大),成本高,作Cache等快速記憶體,不須Refresh。 **DRAM (Dynamic RAM):** 用電容器製作,速度慢,密度高(元件小),成本低,為Main Memory的主體,須Refresh 儲存的電荷會隨著時間漸漸消失,因此需要有個再充電(Refresh)的動作保持電容儲存的資料 :::