###### tags: `111期中準備`
# 作業系統預測(從106開始往後寫 重複就不寫了)
*品:我寫的東西有錯幫我改感恩~*
*茜:我要先去睡了 預計明早5.繼續 晚安*
## 請說明哪三種方法可將系統呼叫(system call)的參數(parameter)傳遞給作業系統?

- ==簡寫( register , block , stack)==
- 利用 Registers 儲存參數
- 將參數存在 Memory Block 後,把該 block 的起始位址存在一個 register 中,之後將此 register 傳遞給 OS
- 利用 system stack 儲存參數,藉由 push 來保存參數,pop 來取出參數
## Interrupt / trap / exception

- Interrupt 中斷,通知系統工作已完成,分為外部中斷、內部中斷
- 中斷是系統中由硬體所產生的訊號。調用中斷處理程序來處理中斷的原因; 然後將控制返回到中斷的上下文和指令。
- Trap 由軟體產生的中斷,因為錯誤或不合法所造成的中斷,內部中斷的一種
- 可以用來呼叫作業系統功能(如:發出I/O完成的訊號,以消除對裝置輪詢)或捕獲算數錯誤
- Trap:不合法的使用(/0、overflow);當使用者需要OS服務時,用systemcall呼叫OS執行ISR(品)
## DMA

- (a)DMA傳輸前,CPU把匯流排控制權交給DMA控制器,結束DMA傳輸後,DMA立即把匯流排控制權交回給CPU。(*設備控制器將數據塊從緩衝存儲器直接傳輸到主存儲器,無需 CPU 干預*)
- (b)當傳輸結束的時候,裝置就會以中斷的方式通知中央處理器。
- (c ) 停止CPU訪問內存,使內存的效能沒能充分發揮;週期挪用,當有DMA需求時會挪用多個週期。(品)
## IPC (message passing)
- direct :
- send (P, message) – 向process P 發送消息
- receive(Q, message) – 從process Q 接收消息
- 鏈接是自動建立的
- 一個鏈接只與一對通信進程相關聯
- 每對之間恰好存在一個鏈接
- 鏈接可能是單向的,但通常是雙向的
- indirect :
- 從mailbox郵箱(也稱為端口)定向和接收消息(每個郵箱都有一個唯一的 id)
- 只有共享郵箱的process才能進行通信
- 僅當進程共享公共郵箱時才建立鏈接
- 一個鏈接可能與許多進程相關聯
- 每對進程可能共享多個通信鏈接
- 鏈接可以是單向的或雙向的

字醜見諒(筆誤mobileA->mailboxA)(品)
## process在主記憶體中所佔的空間可分為四個部分
- data segment
- 存放global variable及static local variable
- text segment
- 存放程式指令
- stack
- 存放 臨時數據(temporary data)
- Function parameters, return addresses, local variables
- heap
- 動態記憶體配置
- 包含在運行時動態分配的內存(containing memory dynamically allocated during run time)(此為講義說法)
## process state diagram

## CPU scheduling 於哪四種時機執行 (哪些事件發生時須做CPU scheduling)?(品)
- running->terminated
- running->waiting
- running->ready
- waiting->ready
- (茜 講義ppt5 6)
1. Switches from running to waiting state
2. Switches from running to ready state (V 容許preemption)
3. Switches from waiting to ready (V 容許preemption)
4. Terminates
## fork() / exec()
- fork() 可能會有以下三種回傳值:
- -1: 發生錯誤
- 0: 代表為子程序
- 大於 0: 代表為父程序, 其回傳值為子程序的 ProcessID
- fork() 執行次數為2的n次方( 執行n次fork() )
- 每次呼叫 fork 時,就會讓程式行程的數量變成原來的兩倍
- exec() : 幫助建立一個全新的process (華:好像有錯??)(茜:我看到是一個函式的統稱 找不到合適的講法)
- exec() :引入另外一個process用來取代原來的process(不一定是全新)
- exec() :用systemcall載入特定binary code file到memory中執行(品)
## Linux或Unix環境下C program中,(1) fork() function產生另一process,並且傳回(return) process id,若程式中一敘述為pid = fork(); 請說明pid各種值代表之意義。(2) 請說明exec()之作用。
- (1)-1:發生錯誤,0:代表為子程序,大於0 :代表為父程序,其傳回process id.
( 2 )幫助建立一個全新的進程 replace the process’s memory space with a new program.
## 請說明(a) Multi-Level Queue排班法,(b) 為何此排班法可能會有Starvation現象?(品)
- (a)
- 1.將原本single ready queue分成許多不同優先權等級之ready queue
- 2.queue 與queue之間採fixed priority preemptive scheduling
- 3.每個queue可有自己的排班法則
- (b)一旦process被assigned to a queue,就不允許move between queue,而這種方法就會造成starvation
(華)
## 從OS角度,解釋或說明(不必翻譯) (a) interrupt vector, (b) privileged instructions, (c) system call 與要求system service API 之差異, (d) DMA, (e) context switch
- (a)中斷服務程式的入口位址,幫助作業系統可以根據此尋找中斷處理程式的位址,再依據相應位址去執行中斷處理程式
- (b)可能造成系統重大危害的指令被稱為privilege instructions.只能在kernel mode 下執行,不允許在user mode
- (c )
- system call:一種計算機系統程序向操作系統內核請求服務的技術。用戶進程使用系統調用請求操作系統服務。
- system sevice:為程序創建和運行提供了環境,將用戶請求轉換為滿足需求所需的一組系統調用。
- (d)允許電腦內部的硬體子系統(電腦外殼),可以獨立的直接讀寫系統記憶體,而不需要CPU介入處理
- (e)當CPU 要切換到另一個processor時,os要儲存舊process狀態,並載入新的process 狀態
## 請說明採用最短剩餘時間先做時,CPU burst time如何決定,請說明之。
- (講義ppt5 15)
- 與每個進程關聯其下一個 CPU 突發的長度
- 使用這些長度以最短的時間安排流程
- How do we determine the length of the next CPU burst?
- ==Could ask the user==
- ==Estimate (須和前一個相似)==
- 華:行程下一次 CPU burst time設為前幾次CPU burst time的指數平均值(我覺得是這樣)
## 請說明 CPU 從一 process “Switch” 至另一 process 之動作。(品)

Context Switch 的發生是因為 interrupt 或程式自己做了 system call,此時程式就會把資源讓出來,等 interrupt 或 system call 完成之後再繼續執行。當程式讓出資源時,作業系統會先將原程式的狀態存進 PCB,再讀入新程式的 PCB,以此類推。
## 請舉出 Interprocess Communication (IPC) 的兩種做法,並簡略說明之。

## 請說明non-uniform memory access
- 當系統在執行程式時,會因為資料存放的記憶體位置不同,而產生讀取速度的差異,所以在實行上會盡量將執行的 CPU core 與記憶體排在一起。(妮)
## 請說明Asymmetric 與 Symmetric差異
- Asymmetric 與 Symmetric 兩種,Asymmetric 作業系統會將要執行的程式交給 master,再由 master 分配給其它 CPU core 執行,由於 master 只負責分配任務,所以機器的效能會略為低下;Symmetric 則相反,是所有的 CPU 各自去從 queue 中拉取程式執行,這時就會產生同步問題。(妮)
## 請說明multilevel feedback queue 作為schedualing時設計應該注意事項
- queue 的數量、每個queue 的演算法,考慮程序往上或往下到其他 queue 的時機
## 在UNIX/Linux作業系統,C program中呼叫fork() function來建立另一process,系統複製parent process給child process,但fork()傳回之 process id不同外,(a) 請說明fork()傳回之 process id有何不同;(b)以下程式執行後,printf()被執行幾次(文字說明你的想法)。
```C==
#include <stdio.h>
#include <unistd.h>
int main() {
fork(); // first
fork(); // second
fork(); // third
printf("Done!\n");
return 0;
}
```
-(a)process 如果在那組fork分出去是PID 是 0的話代表他是children process
如果有自己的編碼 則是parents process(b) 第4行時 parent process 會產生一個child1
第五行時,parent 跟child1會產生2個child child2跟child3
第六行時,會再產生四個child
︎ 最後總共有8個process會print