---
# System prepended metadata

title: '***Operating Systems midterm exam:3***'

---

# ***Operating Systems midterm exam:3***

喵喵<3

## readme

 **粗體** = 🚗💈考過n次類似概念 , n>1 🦖
 
 🦄答案目前只有2018較完整 正在補充中...
 
 🦥歡迎加上習五影片網址(附播放時間我會很愛你🐍
 
 🦦內容若有錯誤 請留言或PM提出  x(｡･∀･)ﾉﾞ<3
 - [time=Thu, Nov 11, 2021 10:41 AM]
 
---

## *2017 midterm*

1. 中斷（interrupt）處理，除了polling以外還有哪二種處理方法

    :::spoiler
    ![](https://i.imgur.com/yWYZlPX.png)
    :::

2. 分別定義cache memory中的「 coherency問題 」和「 consistency問題 」

    :::spoiler
    
    https://youtu.be/EmvCg0M-XTI?list=PLMWkAn-aOA0bRR7n_A86Hs51B2WrAQA9i&t=223
    :::

3. **CPU的user mode和kernel mode與記憶體中的user space和kernel space的關係**

4. 一台電腦中，不同的process之間會有行程間通訊（inter-process communication即IPC），請給一個實際的例子說明不同行程間會進行IPC system call傳遞參數的三種方法

5. 請舉一個例子說明layered approach並不適用於「複雜的作業系統設計」

6. **請問kernel module（一個較小的kernel可以外掛不同模組到kernel內部）和micro kernel的差異**

7. 下列是producer-consumer問題，請問該解法中的in, out二個變數為何不會有race condition的問題
    > ![](https://i.imgur.com/OBr0UdG.png) 
    > ![](https://i.imgur.com/g0D3y1W.png)

    :::spoiler
    https://youtu.be/0XQAfLYfQkg?list=PLMWkAn-aOA0bRR7n_A86Hs51B2WrAQA9i&t=13
    
    :::

8. **請問context-switch主要的overhead在什麼地方**

9. 請問一個有10個thread的process執行execv()以後，會有多少thread

10. 下列為行程切換的4個時間點，請問non-preemptive scheduler最起碼要在哪些時間點進行行程切換
    1.	Switches from running to waiting state
    2.	Switches from running to ready state
    3.	Switches from waiting to ready
    4.	Terminates

11. 請舉一個例子說明不同的排程演算法（scheduling algorithm）可能導致 CPUutilization 不同

12. 下列行程使用FCFS和SJF演算法，在不同方法下，每個process的waiting time各為多少（假設P1先到，P3最後到）
    > ![](https://i.imgur.com/MtF8Wkj.png)

13. 作業系統如何知道行程（process）的下一個burst time？

14. Ｌ教授認為SJF演算法可以改善電腦系統的I/O，請論述這個觀念

15. 下列為課本給的演算法，該演算法試著要解決critical section的問題，其中lock變數的初始值為0，請問該方法是否滿足這三個條件Mutual Exclusion、Progress、Bounded Waiting

    > ![](https://i.imgur.com/oPZyrVj.png)
    
16. 請問下列的二個行程是否「一定會」發生deadlock

    > ![](https://i.imgur.com/BCfJNad.png)

17. 請定義reader-writer問題

18. 請給一個演算法可以用以解決reader-writer問題

---

## *2018* *midterm*

1. **現代化的作業系統的安全性相當的依賴硬體所提供的支援。CPU 執行於二種模式 kernel mode 與 user mode，記憶體則分為 user space 及 kernel space。**
    1) 請以表格畫出存取權。 
    2) 請大致描述一下，user mode application 如何存取 kernel 所提供的系統呼叫。（hint：系統的進入點是？模式切換？一起？） 
    3) kernel 如何切換回 user mode？（接下來要執行的程式碼？模式切換？一起？）

    :::spoiler
    1.
      |             | kernel space  | user space |     
      | ----------- | ------------- | ---------- |
      | kernel mode |        ㇢      |     ㇢     |
      |  user mode  |                |     ㇢     |
    2. 從user mode切換到kernel mode，是透過syscall（組語）。syscall至少同時做下列二件事情：設定RIP(OS指定進入點)、將模式切換為kernel mode
    3. 從kernel mode回到user mode使用sysret指令作業系統會將返回位址（就是接下來要執行的user mode程式碼）放在一個特定的地方（x64放在RCX）

    :::

2. **Linux 提供的 system call 大部分是 blocking system call，如果某一支程式執行一個 blocking system call，並且已經於 kernel mode「等待某個事件」發生（例如：read 等待 I/O 完成）**，
    - 請問 Linux 如何處理 signal（例如：ctr-c）（hint：二種方式）

    :::spoiler
    1.先不理會該signal，繼續完成system call，等system call完成再處理
    2.處理該signal，該system call變成失敗，「通常」作業系統會重新起始該system call（即：該system call重做一次）
    :::
    

3. 請比較這二個名詞：1) ==context switch== 2) ==mode change==
    - 請說明這觸發這二者的發生原因。再說明這二者哪一個的overhead 比較高。（hint：可以考慮 cache 所造成的影響）

    :::spoiler
    1.Context switch本來在執行 process (task)A，改成執行process(task) B
    
    2.Mode change Process A原本執行於user mode，因為呼叫system call，而轉為執行於 kernel mode

    Context switch overhead比較高，因為context switch 要切換cache ，cache比register的數量多很多。

    :::

4. **請說明 memory-mapped I/O 和 port-mapped I/O 的不同。（hint：可以用範例程式碼說明「或」圖示說明「或」說明二者的定址空間的差異）**

    :::spoiler
    > ![](https://i.imgur.com/8luIVaH.png)
    
    > ![](https://i.imgur.com/xvWKfnI.png)

    使用特別的指令，將資料傳輸到特定的「port」，port和memory space是  分開的定址空間
    X86-32的I/O port的定址空間只有0~65535
    X86-32的記憶體定址空間有0~4G
    ex:
        out 0x255, AX		;將AX暫存器寫到0x255 port
        in AX, 0x100		;從0x100 port將資料寫到AX暫存器

    :::

5. Ron 博士覺得下面這張圖很具有代表性， bufcache、bufRAM、bufdisk，這三者的資料應該要保持一致性。 1)請問在硬碟中為何要加上 bufdisk？當 disk 上的 µc（micro controller）將資料透過 DMA 傳輸到 DRAM 後 bufRAM、bufdisk 的資料就一致了。2) 處理器核心（core）存取 bufcache 請提出一個方法可以保證 core 可以讀到最新的資料（換句話說：必須保證 bufcache、bufRAM 的資料一致性）。（hint：有數種解決方式，比較直覺的是：直接用「☐ ☐ 解決」）

    ![](https://i.imgur.com/zu0twlp.png)
    
    :::spoiler
    1.不想拖慢bus的速度
    2. x86的解決之道：
    （DEV => CPU）使用硬體解決，如果該段記憶體也存在cache中，硬體自動會將DMA的資料更新到cache
    （CPU => DEV）藉由設定，讓CPU在該記憶體區段進行寫入時，直接寫穿（write through，或noncacheable），直達裝置上的記憶體

    :::
    

6. **請畫出大約的流程圖說明中斷的處理流程，你的圖上面必須包含中斷向量表、interrupt service routine。並說明第#號中斷，怎樣找到它的 interrupt service routine。**

    :::spoiler
    >![](https://i.imgur.com/jdciAy4.png)

    :::

7. 請問 CPU 可以直接存取的最大的「儲存體是什麼」？為什麼 CPU 沒辦法直接用 disk 開機？（hint：這二者幾乎互相為答案 ^_^） 

    :::spoiler
    1.DRAM or NVM ，CPU要存取必須要能byte addressable。
    2.因為CPU無法直接存取disk，需要軟體驅動來block定址disk。
   	(disk是所謂的block device ，CPU 沒辦法直接存取需透過驅動程式。)

    :::

8. **vDSO是Linux所提供的快速系統呼叫的方式。請問vDSO可以從user program直接存取、執行嗎？以clock_gettime()為例，說明 vDSO 的基本想法：**
    1. 哪些東西可以用 vDSO 實現，
    2. kernel 怎樣保證使用者存取到的都是新的資料
    （hint：1. 我想 clock_gettime 本身就是 hint，clock_gettime 有何特別之處？ 2. 反正 kernel 本來就要定期更新系統時間，所以不如就...）

    :::spoiler
    1. 沒有機密性的資訊，例如 : clock_gettime、getpid
    (這些system call透露這些資訊，也不會不影響kernel安全性)
    2. Kernel 定期去更新vvar 內的資訊，讓User存取時都取得最新資料
    (反正kernel本來就要定期更新系統時間，所以不如就順便把在user space    的資料更新)
    :::

9. virtual machine 中有一個技巧稱之為「trap-and-emulate」，請問哪些指令可以用這個技巧執行？（hint：guest OS和 guest APP 都執行於 user mode，只有 host OS 執行於 kernel mode，...）

    :::spoiler
    如果以「存取CPU的特別資料」來說，RDTSC應該要「被」設計為特權指令。但Intel將RDTSC設計為普通指令，在user mode執行這一道指令，不會產生任何trap。呼叫system call有三種指令，分別是「INT 0x80」、「sysenter」、「syscall」，這三個指令都會造成trap，但這三個指令都是Intel設計來給programmer在user mode使用的。
 
    標準的特權指令像是：
    「rdmsr」、「wrmsr」這二個指令只能在kernel mode執行。

    由於題目是「trap-and-emulate」因此標準答案是：特權指令，或寫「系統呼叫」。

    特權指令，因為guest OS執行於user mode，因此執行特權指令會產生trap。X86的部分指令，如RDTSC會透露CPU的時間，該指令不是特權指令，就無法透過trap-and-emulate來模擬，這種指令必須透過「改寫binary code」的方式來模擬（術語叫做binary translation）

    :::

10. 請問 KVM 中的 balloon device 是用來協調什麼的？（hint：三杯水的故事）
    :::spoiler
    記憶體
    :::

11. 這一題上課沒教，授課老師也不確定答案，但如果是你，你要怎樣設計呢？
gcc -pg的功能可以在函數的開始位址插入特別的程式碼（例如：在Linux kernel中，插入「call function_trace_call()」），但這樣只能追蹤函數的進入點，但如果只是這樣，無法追蹤函數的「離開點」，如下圖 ftrace 可以追蹤到函數的進入點和離開點。你覺得 ftrace 怎樣辦到的？（Ron 博士覺得可以從 stack 下手，但要怎樣下手呢？）

    ![](https://i.imgur.com/P2d9hy4.png)
    
    :::spoiler
    或許可以特過修改stack中的return address
    :::
    
12. 如下圖，請說明 cooperative OS 和 preemptable OS 分別要在哪些時機點呼叫 scheduler？請填寫 cooperative OS和 preemptable OS 各會在哪些時間點呼叫 scheduler 的代號（複選）。

    :::spoiler
    preemptable OS:1.2.3.4.5
    cooperative OS:1.2
    :::

 ![](https://i.imgur.com/d4yB1Cq.png)




13. Linux kernel 2.4 讓所有的 CPU 共用同一個 runqueue，每次 CPU 要挑選 task 的時候，必須根據「適不適合」，對所有的 task 打分數。因為所有的 CPU 共用一個 runqueue，因此當一個 CPU 正在打分數時，其他 CPU 就必須「等待」。2.6 核心以後（不管是 O(1)或 CFS）都採用「一個更有效的架構」，讓 scheduler 變得更快。請說明新架構的優點（hint：就架構的缺點，所有 CPU 要對所有 task 打分數➔慢，每次打分數還要看這個 task 跟這顆 CPU 的交情怎樣➔慢，大家都鎖住同一個 runqeue➔慢）

    :::spoiler
    CPU有自己的queue
    不用一直重打分數，只有當task從active移動到expired時打一次分數
    不用看affinity
    Active：放還沒用完的task
    Expired：放用完的task
    Put：loading太重，把task給別人
    Pull：loading太輕，拿別人的task
    搜尋task數量變少
    只要處理自己runqueue中的東西就好。
    :::

14. 請用下圖說明 Linux kernel 2.4 怎樣讓 I/O bound 的 task 獲得更高的優先權（hint：2.4 中，time slice 大，就代表優先權高，因此...回填...有人有剩，有人沒剩...，所以補上以後...） 

    :::spoiler
    timeSlice全部回填，原本的I/O bound中的task有剩下的timeSlice，    所以在大家回填後，會有較多的timeslice，而priority正比於time         slice，因此相當於擁有較高的優先權。
    :::

15. Linux O(1) scheduler 比 2.4 好的地方就在於「打分數的方式」，2.4 的演算法即時每次打出來的分數都差不多，但每次都要重新打分數。請問 O(1) scheduler 做了什麼樣的改進，讓 scheduler 的效率有效的提升（hint：active array、expired array，sleep_time）

    :::spoiler
    Active array:存放time quantum還沒用完的task
    Expired array: 存放time quantum還沒完的task
    Active array到Expired array打一次分數，打分數依照在上一回合的    sleep_time

    :::

16. 「授課老師認為」CFS 最特別的地方是在「回填 time quantum」的部分。請問在 CFS 中，一個高優先權的 task 除了可以拿到更多的 CPU time 以外，還有什麼樣的好處（hint：這個好處就是 round robin 演算法的目標）

    :::spoiler
    更好的response time。
    執行密度比較高。
    :::

17. 考慮 CFS，共三個 task 稱之為 a、b、c，這三個 task 分別可以拿到 1/2、1/4、1/4 的 CPU time，請以甘特圖畫出這三個 task 的執行過程（從時間 0 畫到時間 8）。假設一開始所有 task 的 vruntime 都為 0，如果 vruntime 相同時，優先權等級為 a>b>c

    :::spoiler
    ![](https://i.imgur.com/h0t8Ium.png)
    abcaabca
    :::

18. CFS 怎樣讓 I/O-bound task 拿到比較高的優先權？（hint：大家的 vruntime 會不斷的增加，所以從 waiting queue 回來的 task 要怎樣設定 vruntime？）

    :::spoiler
    設為目前所有task中vruntime最小的
    Min_vruntime或
    Min_vruntime-Δ
    :::

19. 在 2.4 scheduler 演算法中，如果一個 task 不斷地睡覺，那麼他會一直累積 time slice，而 time slice 越大，優先權也越大，要怎樣避免有人撰寫一個「睡大覺-醒來不幹正事-睡大覺-醒來不幹正事...」的程式，擾亂系統執行。
（hint：1/2 + 1/4 + 1/8 + 1/16 + 1/32 + ⋯ = 1）
    
    :::spoiler
    每次除以2加到最後最後頂多是原本的兩倍
    :::

20. 二個 CPU 分別為 CPU1 及 CPU2 各自對 global 做「加 1」，其 x86 組合語言相當於「① 載入 global 到 AX 暫存器、② 對 AX 做加 1、③ 將 AX 存回 global」，共三個步驟。請安排這二個 CPU 的指令執行順序，讓 global 的值為 2。
（hint：錯開）

    :::spoiler
    例如一個CPU先執行，再執行另外一個CPU
    :::

21. 請定義 race condition（hint：順序、時序、事件等...不一樣）

    :::spoiler
    wiki:程式執行的順序時序事件的發生跟設計師預想不同。
    恐龍書:執行結果跟執行順序有關
    :::

22. Critical section 是解決 race condition 的方法之一，其想法就是讓存取共通資料的程式碼錯開執行。critical section 須滿足三個條件，分別是：mutual exclusion、progress、bounded waiting。如果我們不考慮 progress 和 bounded waiting的情況下，你是否可以給一個「簡單」的方法解決 mutual exclusion？
（hint：一路綠燈）

    :::spoiler
    例如：讓其中一個程序一直執行，另一個不准執行
    :::

23. 下面是一個錯誤的 Peterson’s solution，其中有二行對調。請證明這個方法是錯誤的（hint：給一個 P0 及 P1 都能夠進入 CS 的例子）

    >![](https://i.imgur.com/bhl3h70.png)

    :::spoiler
    > ![](https://i.imgur.com/jiuKDW8.png)

    :::


24. **下面是某同學實現的 Peterson’s solution 中的 P0 部分，但這樣實現是錯誤的。請舉一個實際的例子說明這樣的程式碼經過編譯器最佳化之後會發生錯誤。（hint：while（即：9 行）前設定 turn=1（即：8 行）；而 while 的控制變數又包含了 turn，所以編譯器可能會怎樣做呢？）**

    >![](https://i.imgur.com/Tny30MT.png)

   
    :::spoiler
    
    要用atomic store 。否則turn=1及turn==1可能會被編譯器整個拿掉。
     ```c=
    while(1)
    {
    flag0=1;
    while(flag1==true);
    /*critical section*/
    flag[0]=false;
    }
    ```
    :::

---

## *2019* *midterm*

1. 一個安全性的作業系統（如：Linux）最起碼需要二個執行模式（dual mode operation）。
請問：      
甲、 Dual mode中的kernel mode和user mode的差異（存取硬體？記憶體？） 
乙、 在記憶體方面需要什麼樣的配合？（hint：記憶體好像檔案一樣對不同人要有不同的？？） 
丙、 系統如何從user mode切換到kernel mode（hint：特別的指令、單一進入點？）

    :::spoiler
    甲.kernal mode可以存取硬碟跟記憶體，但user mode不行
    乙.有Access Control List去管理檔案系統的權限
    丙.單一進入點 system call
    user mode->kernel mode 返回位置存在rip並且呼叫syscall
    kernel mode-> user mode 返回位置存在RCX並且呼叫sysret
    :::

2. Signal對system call的影響為何？
（hint：在interrutable和uniterrutable時，system call收到signal會怎樣？restart？）
    
    :::spoiler
    可中斷系統呼叫，會中斷當前系統呼叫，使當前系統呼叫無效，處理完信號後重新啟動 該系統呼叫不可中斷系統呼叫，不理會當前syscall，等到返回user mode時才處理signal
    :::

3. **請從context-switch和mode change的角度，說明==monolithic kernel的優點==**
    
 
    
    :::spoiler
    如果需要行程間的通訊，因為大部分模組套件都放在核心內，只要耗費function call的成本就好
    context-switch成本
    1. store/restore register
    2. TLB miss
    3. Cache miss(主要是這個)
    mode change成本
    1.將在user mode的暫存器轉移到kernel mode
    
    https://youtu.be/G64RpFIo1SE?list=PLMWkAn-aOA0bRR7n_A86Hs51B2WrAQA9i&t=23
    :::
    

4. **電腦的主記憶體的三大主要用途？請問是否需要定期清除記憶體，說明你的觀點**

    :::spoiler
    - cache memory(提供CPU快速存取資料，不用跑到memory搬資料)
    - buffer memory(可以提升I/O的速度)
    - program memory(memory提拱給程式可以使用的空間)
    我認為是要，因為有些cache的資料太過老舊，如果留著也只是造成資料的不一致性
    :::

5. 請設計一個系統，可以監控印表機的使用量（hint：印表機在Linux中為一個特殊檔案「/dev/usb/lp0」，假設可以使用「lpr」將文字檔案送到印表機，請問你要怎樣設定這些檔案的權限）（hint：/dev/usb/lp0的權限要設定為何，lpr又為何？）

6. 請問何謂port I/O和memory mapped I/O？請問memory mapped I/O的優勢

    :::spoiler
    port I/O : port的定址空間跟memory space的定址空間是分開的，兩個是不同的bus，有in跟out指令可以對port進行操作 
    memory mapped I/O : 裝置的定址空間跟memory space的定址空間是一樣的，有相同的匯流排，若CPU讀到記憶體某區段是I/O就會進行I/O的操作，優勢在於操作的指令跟記憶體相同(方便性)，定址空間較大 
    :::


7. 目前的硬碟的控制器多半具有DMA，請問DMA的功能為何？請問硬碟中為什麼要有DRAM充當buffer？（注意：是「buffer」不是「cache」）

    :::spoiler
   因為匯流排bus上的速度比較快，但磁碟寫出的速度很慢，如果先把磁碟內容給buffer，這樣就可以提升I/O的速度讓資料在匯流排上移動
   :::

8. 請說明中斷的流程（hint：硬體、中斷訊息、CPU怎樣暫停目前的執行、從哪邊找到這個中斷的「軟體處理流程」，中斷處理完以後要幹什麼事）

    :::spoiler
    1. CPU會有一條線監視裝置有沒有發出中斷
    2. 接收到中斷後，會去查中斷向量表(函式指標陣列)
    3. 由ISR去排成哪個bottom half(workqueue tasklet softirq)去處理此中斷
    4. 中斷完成後排程器會為我們決定下一個執行哪個任務，不一定是剛剛被中斷的任務
    :::

9. Linux為什麼要把驅動程式分成top half和bottom half？

    :::spoiler
    因為要將緊急得部分先做完(top half很快)，耗時的工作給bottom half來做，這樣的好處是我可以快速接收中斷，中斷處理放到bottom half做之後我又可以接收下一個中斷，如果沒有分top half跟bottom half，就要等到一坨東西都做完才可以在接收中斷
    :::

10. 請解釋SMT（同時多執行緒，Simultaneous multithreading）大致的運作原理。（hint：同時執行多個「行程」？一起執行的好處？）

    :::spoiler
     > 多個核心一起執行的好處就是可以同時擁有多個thread，只要能確保不會有race condition的問題，就可以把一個大工作分成很多小工作平行處理
     :::

11. bigLITTLE的原理（hint：小核心和大核心，主要是速度增加還是省電，如何達成）

    :::spoiler
    有高效能和低耗能的核心供OS調換，兼顧省電與效能

    :::
   

12. 請問32條記憶體組成超寬通道（memory channel），和32條記憶體組成8條小通道的差異

13. 為什麼CPU剛啟動時cache沒有打開（hint：I/O）

    :::spoiler
    一開始不知道哪些位址屬於I/O哪些屬於主記憶體，如果這時候打開Cache Memory，CPU讀寫都在Cache，無法初始化裝置
    :::

14. 請==大==略用組合語言，透過system call在螢幕上印出 “hello”。
 好==麻==煩

15. **什麼是vdso（hint：核心將…跟使用者行程…，就是什麼樣的情況下會用vdso，有什麼好處）**

    :::spoiler
     kernel定期將沒有機密性卻放在kernel的資料更新到vdso內，當user要取得資訊時只要進行function call就好
     :::

16. 舉出一個例子說明guest OS（就是被模擬機執行的那個OS）最好要能與vmm（virtual machine monitor，就是能執行guest OS的那個模擬機）溝通（例如：提供什麼樣的特殊指令，提供什麼樣的特殊驅動程式，為什麼要提供你所說的「額外機制」）

    > ![](https://i.imgur.com/wCyoaPV.png)
    
17. 請問如果取消ASLR（位址空間組態隨機載入，Address space layout randomization）的話，可以進行怎樣的優化

18. 請問如果讓CPU-bound的優先權比較高會造成什麼樣的現象（hint：注意一下，是「CPU」，稍微敘述一下為什麼會有這樣的現象。可以使用Ｃ代表電腦正在處理CPU-bound，用I代表電腦正在處理I/O bound）


19. 在Linux kernel中，隸屬於同一個process的thread至少共用哪個物件？

20. 舉一個例子說明，non-preemptive OS在什麼樣的情境下效能會比preemptive OS好。大概說明原因。

21. **如果要讓I/O的效能提高，又要能夠有好一點的response time，請問應該把time slice設定為多少？（hint：一個數字，說明為何要設定成那個數字）**
    > ![](https://i.imgur.com/Owbg4tU.png)

22. 請問Linux 2.4是怎樣提高效能（hint：先定義epoch的轉換時機，然後累積了什麼，累積的東西跟優先權有何關係）

23. 請問在CFS中有辦法提高task的優先權，使得他的優先權「絕對」高過I/O嗎？請說明原因
 
24. **什麼是race condition（請寫清楚，不要英翻中。可以用舉例的方式說明）**

25. 請解釋critical section一定要滿足progress的原因（hint：A想進去，裡面沒人但…）

26. A可以preempt B，如果要製造critical section，可以怎樣做最簡單（hint：不可以使用spinlock、semaphore等，disable...）

27. 請問如果設定mutex「不支援」巢狀鎖定的好處（換句話說，在什麼樣的情況下，你會用「不支援巢狀」）

28. DMA和CPU都會更新DRAM，請列出一種方法，可以確保CPU會看到最新的資料（hint：有硬體法跟軟體法，硬體法要想辦法把資料寫到ＸＸＸ，軟體法要想辦法取消ＸＸＸ）

29. 什麼是readers-writers問題？（hint：一定要寫出在平行化方面的優勢）

--- 

## *2020 midterm*

1. **請以Linux為例說明 ==Signal== 對 system call 的影響為何？（hint：在interrutable和uninterrutable時，發出system call時如果收到signal各會怎樣？是否會收到signal或者延遲收到？立即收到signal的話原本的system call如何處理？）**

2. 請從context-switch和mode change的⾓度，以打開檔案（open）作為例⼦，說明monolithic kernel相較於micro kernel的優點（hint：open⾄少牽扯到 1. 檔案系統服務 2. 裝置系統服務，你可以具體的說明如果使⽤micro kernel將這些服務安裝成user mode APP 會有哪些overhead）

3. 電腦的主記憶體的三⼤主要⽤途？當記憶體不⾜時你可以透過清空或者將記憶內容暫時移到磁碟系統上。在這三⼤⽤途的記憶體中，你會選擇哪⼀個？說明原因。

    :::spoiler
    
    
    :::

4. ⽬前的硬碟的控制器多半具有DMA，請問DMA的功能為何？請問硬碟中為什麼要有DRAM充當buffer？（注意：是「buffer」不是「cache」）

5. Linux為什麼要把驅動程式分成top half（interrupt）和bottom half？（提⽰：可以舉例說明，如果沒有bottom half對系統有什麼樣的影響）

6. 請使⽤inline assembly，在x64的Linux上，透過system call（syscall）在螢幕上印出“hello”。（hint，請參⾒附圖的組合語⾔提⽰） 

    > ![](https://i.imgur.com/pn5W3Qn.png)


7. 請問如果讓『『『I/O-bound』』』的優先權比較⾼，對CPU-bound和I/Obound的效能的影響為何？對系統的throughput的影響⼜為何？

8. 如果要讓I/O的效能提⾼，⼜要能夠有好⼀點的response time，請問應該把time slice設定為多少？

9. 請問在CFS中有辦法提⾼task的優先權，使得他的優先權「絕對」⾼過I/O嗎？請說明原因（提⽰：I/O task的vruntime是怎樣的設定的）

10. 請問在Linux的O(1) scheduler中，如何判斷task屬於I/O-bound或CPUbound。請問O(1)中可以設定CPU-bound的優先權絕對⾼於I/O-bound嗎？說明理由（例如：I/O的優先權提升機制...）

11. 假設load和store都是atomic operation，請問下列演算法是否滿⾜mutual exclusion, progress？是就證明，不是舉反例。

    >![](https://i.imgur.com/aKQLVrJ.png)

12. **請定義context switch的overhead為何。（hint：程式碼、cache，或者你要如何量測overhead）**

--- 

<3









