操作系統:進程管理和IO控制
一、進程管理
進程管理包括進程控制,進程調度,進程同步與通信,死鎖控制四個內容。
(一)進程控制
進程是操作系統中運行的基本單位,包括程序段,數據段和進程控制段。操作系統通過進程控制塊(PCB)管理進程。每一個PCB唯一標示一個進程。它存儲進程的PID,UID,當前狀態等信息,以及進程執行某一時刻的寄存器值,并且指向進程的數據段和程序段。OS把所有PCB鏈接為一個鏈表。
進程在剛剛被創建時出于new狀態。OS負責申請一塊存儲空間作為該進程的PCB,在其中填上進程的信息,標示為ready,鏈接到PCB隊列和就緒隊列中,此時進程進入"就緒"態。進程調度程序在未來某一時刻將其分配給處理機執行,該進程出于"執行"態,OS將根據PCB中的內容初始化處理機的各個寄存器值,之后進入用戶態執行;進程請求I/O或系統調用時將放棄處理機,進入"活動阻塞"態,進程調度程序將當前處理機各寄存器值壓棧(存入PCB中,或存入核心棧),將該進程PCB運行隊列中移入阻塞隊列;當系統調用或I/O完成時被喚醒再次進入活動就緒態,即PCB由阻塞隊列鏈入就緒隊列(操作系統如何實現喚醒進程??)。如果在系統調用完成之前,進程被換到外存,相應內存空間被釋放,則進程進入"靜止阻塞態",這里中級調度程序將和磁盤驅動程序一起,把相應內容拷貝到對換空間,同時釋放內存;系統調用完成時若仍在外存中而為未被換入,則出于"靜止就緒"態,之后被換入內存可直接進入執行態,或動態就緒態。進程執行完畢后進入"僵死"態,系統將釋放內存空間,回收所有資源。
UNIX系統中提供的系統調用中,fork產生一個與父進程完全相同的子進程,在子進程的地址空間中運行;spawn則從文件中裝入一個文件作為子進程,在其地址空間運行;exec則從文件中裝一個進程到當前進程地址空間,覆蓋當前進程執行。
?。ǘ┻M程調度
這里說的進程調度主要指低級調度,即由調度程序負責完成的,在內存和處理機之間的調度。在文件和內存之間的調度成為高級調度,又叫作業調度,在內存和對換空間的調度稱為中級調度,又稱對換。低級調度算法主要有:先來先服務FIFO;.短作業優先SJF;.時間片輪轉Round Robin;靜態優先級調度;多級隊列反饋輪轉調度。UNIX系統中采用的動態優先級+多級隊列反饋輪轉調度。具體內容可參見前面的文章。
?。ㄈ┻M程通信
進程通信有直接通信和間接通信,直接通信是兩進程直接交換數據或發送信息,間接通信則是把信息發送到一個中間實體中。根據同步方式,可分為:1.發送進程阻塞,接受進程不阻塞;2.發送進程不阻塞,接受進程阻塞;3.發送進程和接收進程都阻塞。
進程通信也分為高級通信和低級通信。
高級通信通常傳輸數據量較大,包括:消息機制,共享存儲區,管道。
1、消息機制:
在消息機制里值得注意的是消息緩沖隊列方式。發送進程首先申請一塊緩沖區,把消息內容和消息首部填入其中,之后調用send系統調用。send將把該進程的消息內容拷貝到消息緩沖隊列中;接受進程首先申請接受緩沖區,之后調用receive系統調用,OS負責把消息緩沖隊列中的消息拷貝到該進程空間的緩沖區中。
2、管道通信:
相當于一個隊列形式的一個進程在管道尾寫,另一個進程在管道頭取,管道分為無名管道和有名管道。無名管道是用pipe函數創建的,只能用于子進程之間的通信,有名管道用mkfifo函數創建用于任意兩個進程之間通信,對管道的操作相當于對文件的操作比如open函數打開管道close函數關閉管道等。
低級通信包括同步和互斥兩種,通過信號量實現,主要針對臨界區問題。臨界區的互斥訪問要遵循4個原則:空閑讓進,忙則等待,有限等待,讓權等待。主要信號量分為0/1信號量,整型信號量,記錄型信號量,AND型信號量和信號量集。經典同步問題有生產者-消費者問題,讀者-寫者問題,哲學家進餐問題。
信號量:信號量是操作系統提供的管理公有資源的手段,即PV操作。對于獨享設備有驅動程序做PV操作。
p操作的過程是:s=s-1;if(s<0){進入等待隊列,自己阻塞進程}
v操作的過程是:s=s+1;if(s<0){從等待隊列取一個進程;取出的進程進入就緒隊列,當前進程該干嘛干嘛}
pv原語不能次序錯誤,而且必須成對出現。信號量的定義是semaphore mutex;經典同步問題有生產者-消費者問題;讀者-寫者問題;哲學家進餐問題。
?。ㄋ模┧梨i控制
由于進程競爭資源或推進順序非法,可能會造成進程死鎖。死鎖有四個必要條件:互斥訪問,請求保持,非剝奪,環路等待。打破其中任何一個都可以不出現死鎖。對于死鎖的處理有三類方法:
1.死鎖預防:主要是打破死鎖必要條件中的一個。打破請求保持條件,則要求進程在執行之前一次性請求到所有資源才可以執行;打破非剝奪條件,要求進程執行過程中因為缺少資源無法執行時,剝奪所有資源,將其阻塞;打破環路等待條件,則給資源編號,要求進程請求資源的順序依照編號由高到低進行。
2.死鎖避免:指Dijkstra的銀行家算法;
3.死鎖檢測消除:指在發生死鎖時檢測資源分配圖中是否有子環,然后將一個或多個進程掛起,消除死鎖;檢測算法是NP完全問題,CPU代價較大。
二、輸入輸出(I/O)管理
?。ㄒ唬? I/O管理概述
1. I/O管理功能
(1) 動態的紀錄各種設備的狀態
(2) 設備分配與回收
(3) 實施設備驅動和中段處理的工作
2. I/O應用接口
(1) 設備和設備控制器的接口:設備和cpu之間不是直接通信的而是夾著一個設備控制器,設備與設備控制器是靠三根線相連的,數據信號線,控制信號線和狀態信號線,數據信號線用于在設備和設備控制器之間傳送數據信號,控制信號線傳送由設備控制器向I/O設備發送控制信號,狀態信號線用于傳送設備當前狀態的信號。
(2) 設備控制器:控制一個或多個I/O設備,其基本功能有接收和識別(cpu發的)命令,數據交換(與cpu或與設備數據交換),標示和報告設備的狀態(給cpu發)地址識別,數據緩沖,差錯控制。
(3) 設備控制器由三部分組成:設備控制器與處理器的接口(由數據線連接DMR和控制狀態寄存器,控制線,和地址線組成),設備控制器與設備的接口(多個設備接口,每個設備接口由數據控制和狀態三種信號),I/O邏輯(當cpu啟動一個設備時,將啟動命令發給I/O邏輯同時通過地址線給I/O邏輯由它進行譯碼。。譯出命令后對所選設備進行控制。所以地址線和控制線是直接跟I/O邏輯相連的。
3. I/O通道
I/O通道是特殊的處理機。它具有執行I/O指令的能力,并通過執行通道程序來控制I/O操作,它的指令單一主要與I/O操作相關的指令,通道沒有自己的內存,它和CPU共享內存。通道又分為字節多路通道,數組選擇通道,和數組多路通道。
(1) 數組選擇通道:又稱告訴通道,在物理上可以連接多個設備,但某一段時間內通道只能選擇一個設備進行工作
(2) 數組多路通道:當某設備進行數據傳送時,通道只為該設備服務,當設備在執行尋址等控制性動作時,通道掛起該設備的通道程序,去為其他設備服務。
(3) 字節多路通道:用于大量低速設備,與設備之間數據傳送的基本單位是字節,為一個設備傳送一個字節后,又可以為另個設備傳送一個字節。數組多路通道傳輸的基本單位是塊。而且一次只能有一個設備在傳輸數據。
4. I/O控制方式
(1) 程序I/O方式:忙等方式。
(2) 中段驅動I/O方式:當某進程要啟動某個I/O設備工作時,便由cpu向相應的設備控制器發出一條I/O命令,然后立即返回繼續執行原來的任務,此時,CPU和 I/O設備并行操作。以字節為單位進行I/O。
(3) DMA I/O方式:直接存儲器訪問方式數據傳輸的單位是塊,數據之間在設備和內存中進行交換,僅塊傳輸的開始和結束時才需要CPU干預。(替代了設備控制 器)。DMA控制器中有四類寄存器:命令寄存器(存cpu發的控制命令或設備的狀態),內存地址寄存器,數據寄存器(緩沖數據作用),數據計數器(存本次要讀的字節數)。
(4) I/O通道控制方式:通道是通過執行通道程序,并與設備控制器共同實現對I/O設備的控制的。通道指令格式為命令
1)操作碼:規定了指令所執行的操作。
2)內存地址:標明讀操作和寫操作時的內存首址
3)計數:表示本條占領所要讀或寫數據的字節數
4)通道程序結束位P:用于表示通道程序是否結束
5)記錄結束標志R。
三、設備管理
設備管理包括:緩沖管理,設備分配和設備處理三個內容。
進程I/O一共有四種方式:程序查詢方式,程序中斷方式,DMA方式,通道控制方式。通道處理器也是一個處理機,但是與CPU相比,它指令較為單一,沒有獨立的存儲空間(使用內存空間)。通道分為字節多路通道,數組多路通道和數組選擇通道。
(一)緩沖管理
緩沖管理包括單緩沖,雙緩沖,循環緩沖和緩沖池。這里需要注意的是緩沖池。它包括輸入隊列,輸出隊列和空閑隊列,有四種工作方式:
1.收容輸入方式:進程請求向緩沖區輸入,從空閑緩沖隊列中申請一個緩沖區輸入,將之鏈接在輸入隊列尾;
2.提取輸入方式:進程要從緩沖區中提取輸入,則從輸入隊列尾部緩沖區中拷貝信息,同時釋放空間,將之重新鏈入空閑隊列中;
3.收入輸出方式:進程要想緩沖區輸出,從空閑緩沖區隊列中申請一個緩沖區輸出,將之鏈接在輸出隊列尾;
4.提取輸出方式:進程要想緩沖區提取輸出,則從輸出隊列尾部緩沖區中拷貝信息,同時釋放空間,將之重新鏈入空閑隊列中。
?。ǘ┰O備分配
操作系統為實現設備分配需要配備的數據結構有:設備使用表,控制器使用表,通道使用表,系統設備表。利用設備獨立性的思想分配設備。所謂設備獨立性,是指使用邏輯設備名稱來請求某種設備,而系統通過某種名稱轉換方式將其轉換成物理設備名稱進行分配。實現設備獨立性需要再驅動程序之上再增加一層設備獨立性軟件,負責實現名稱和地址的轉換,這種轉換信息使用邏輯設備表LUT實現,每一個表項存儲邏輯設備名,物理設備名,驅動程序入口地址。使用設備獨立性方法實現設備分配,具有靈活性和易于設備重定向。
SPOOLing是設備分配的一個重要例子。它實現了獨占設備的共享。SPOOLing系統包括輸入井,輸出井,輸入緩沖,輸出緩沖,輸入進程和輸出進程。進程在請求獨占設備輸出時,OS要求它先把要輸出的內容輸入到輸入緩沖,之后有輸入進程將其輸入到輸入井中,此時如果處理機要處理這些數據,則從輸入井中取數據;獨占設備要輸出時,由輸出進程將輸出井中的信息送至輸出緩沖,由輸出設備輸出。這種方式實現了獨占設備的共享,如網絡打印機。
(三)設備處理
設備處理指的是一系列驅動程序。它們是OS與外設的接口,把OS進程發來的抽象的要求轉化為對硬件的具體的控制命令,如設置命令控制字,讀取設備狀態信息,啟動設備等。它們對操作系統提供統一的接口,方便用戶調用。