---
# System prepended metadata

title: 作業系統期中考

---

# 作業系統期中考

### 為了避免增加CPU執行負荷，直接記憶體存取(DMA)被使用在高速I/O裝置，
1. CPU如何與裝置介面協調其傳遞工作？
>CPU 將命令寫到特別暫存器後啟動 DMA 操
作，而此一暫存器取得命令後，裝置就啟動所有有關的操作。
2. CPU如何知道記憶體的操作何時完成？
>DMA 會發出中斷訊號給 CPU。 
3. 當DMA控制器正在傳遞資料時，CPU被允許執行其他使用者程式。這種作法會對使用者程式產生何種干擾？
>當 DMA 動作時，如果恰巧遇到 CPU 也要存取該部分記憶體，則 DMA
強迫 CPU 暫停，等 DMA 控制器存取完一筆資料後再令 CPU 繼續動作，
這樣會讓 CPU 的速度稍微變慢，但是 DMA 存取速率卻可以不與 CPU
的時脈同步。

### 請說明作業系統分層結構的優點
>**簡化複雜問題**
>分層式結構因模組化，能把複雜問題分解為較小而獨立的部份，簡化每一層級的設計與除錯工作。
>**各層級獨立性高**
>每一層所提供的功能，都只建立在下一層的基礎上。
>**維護容易**
>因每一層只使用較低層次所提供的操作，不須關心這些操作如何完成，因此某一層級發生修改，只要維持對上層的操作不變，就可以輕易替換。

### 靴帶式起始程式(Bootstrap program)在作業系統中所負責的工作有那些

>靴帶式程式負責把OS核心載入記憶體，並且執行核心程式

### SPOOLING原理和目的
>利用緩衝區(I/O table)暫存周邊裝置的資料，使得不能夠多工處理的系統也能加強CPU與I/O的並行，目的為提高CPU效率

### 臨界區間問題
1. 請說明何謂臨界區間問題？
>因共用資料導致同時存取時資料會產生錯誤
2. 解決臨界區間問題須滿足那些條件，請解釋這些條件的意思？
>**互斥**
>有行程在區間內執行時，其他行程不可以進入執行
>**進行**
>如果當前沒有行程在執行且有一行程想要進入，這個行程必須不在剩餘區間執行，且依序進入
>**限制性等待**
>在一個行程已經要求進入其臨界區間，且要求尚未被答應前，允許其它行程進入其臨界區間的次數有一個限制
3. 作業系統為何會產生臨界區間問題？
>因為共享資料，當不同行程想要動同一塊資料時就會產生問題

```cpp
bool test_and_set(bool target){
    bool rv = *target;
    *target = true;
    return rv;
}

do{
    while(test_and_set)
        // do something
        
        // 臨界區
        lock = 0;
        // 剩餘區
}while(1);

// ----------------------

int compare_and_swap(int *value, int expected, int new_value){
    int temp = *value;
    if(*value == expected)
        *value = new_value;
    return temp;
}

while(1){
    wait[i] = 1;
    key = 1;
    while(wait[i] && key == 1)
        key = compare_and_swap(&lock,0,1);
    wait[i] = 0;
    // 臨界區
    j = (i+1)%n;
    while((j != i) && !wait[j])
        j = (j+1)%n;
    if(j==i)
        lock = 0;
    else
        wait[j] = 0;
    // 剩餘區
}

// -----------------------

// Peterson
while(1){
    flag[i] = 1;
    turn = j;
    while(flag[i] && turn == j){
        ;
        // 臨界區
        flag[i] = 0;
        // 剩餘區
    }
}
```