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