# 作業系統期中考 ### 為了避免增加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; // 剩餘區 } } ```