




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理1 第05講 進(jìn)程調(diào)度及進(jìn)程管理 5.1 作業(yè) 5.2 進(jìn)程 5.3 線程 5.4 小結(jié) 5.5 習(xí)題 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理2 提高處理機(jī)(CPU)的使用率,使它盡可能處于工 作狀態(tài),是操作系統(tǒng)管理功能的主要目標(biāo)之一。 在Linux系統(tǒng)中,提高處理機(jī)使用率的技術(shù)措施主 要是多道和分時(shí),處理機(jī)在進(jìn)程之間切換,按照一定 的規(guī)則輪流執(zhí)行每個(gè)進(jìn)程。對(duì)于單個(gè)處理機(jī)的系統(tǒng), 這些進(jìn)程宏觀上看似并行執(zhí)行,而微觀上來(lái)看仍然是 串行執(zhí)行的,這種執(zhí)行方式被稱(chēng)為并發(fā)執(zhí)行。操作系 統(tǒng)通過(guò)并發(fā)控制機(jī)制,對(duì)處理機(jī)進(jìn)行分配、調(diào)度,在 保證每個(gè)進(jìn)程都得到公平合理執(zhí)行的同時(shí),使系統(tǒng)中 的各種
2、資源得到充分的使用。 本講主要圍繞處理機(jī)管理展開(kāi),著重介紹進(jìn)程的概 念,同時(shí)也包括相關(guān)的兩個(gè)基本概念:作業(yè)和線程。 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理3 作業(yè)是用戶向計(jì)算機(jī)系統(tǒng)提交一項(xiàng)工作的基本單 位,是用戶在一次事務(wù)處理或計(jì)算過(guò)程中要求計(jì)算機(jī) 所做工作的總和。 作業(yè)和程序是兩個(gè)相互聯(lián)系而又不同的概念。如 果一次業(yè)務(wù)處理可以由某一個(gè)程序完成,就是說(shuō)這個(gè) 業(yè)務(wù)處理只要提交這一個(gè)程序就夠了,這種情況下, 這個(gè)程序就是一個(gè)作業(yè)。通常,完成一次業(yè)務(wù)需要由 多個(gè)程序協(xié)同完成,這時(shí),多個(gè)程序、這些程序需要 的數(shù)據(jù)以及必要的作業(yè)說(shuō)明一起構(gòu)成一個(gè)作業(yè)。系統(tǒng) 通過(guò)作業(yè)說(shuō)明書(shū)(JCB)或者作業(yè)控制語(yǔ)句(JCL)控制程
3、序和相應(yīng)的數(shù)據(jù)執(zhí)行,完成整個(gè)業(yè)務(wù)處理。 5.1 作業(yè) 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理4 按照對(duì)作業(yè)的處理方式,可以分為聯(lián)機(jī)、批處理 等作業(yè)。Linux系統(tǒng)中的shell提供了操作系統(tǒng)和用戶之 間的聯(lián)機(jī)命令接口。 Linux的shell同時(shí)提供了程序級(jí)接口。用戶通過(guò)提 交一個(gè)命令或一個(gè)命令序列以批處理方式執(zhí)行特定的 操作。 在Linux分時(shí)批處理系統(tǒng)中,也可以根據(jù)對(duì)作業(yè)執(zhí) 行時(shí)的響應(yīng)特征分為前臺(tái)作業(yè)和后臺(tái)作業(yè)。 在多用戶系統(tǒng)中,多個(gè)用戶、不同類(lèi)型的作業(yè)可 能同時(shí)請(qǐng)求執(zhí)行,控制和管理這些作業(yè),協(xié)調(diào)它們之 間的關(guān)系,就是作業(yè)調(diào)度,作業(yè)調(diào)度是處理機(jī)調(diào)度的 一部分。 5.1 作業(yè) 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)
4、管理5 計(jì)算機(jī)內(nèi)存中同時(shí)存放多個(gè)相互獨(dú)立的已經(jīng)開(kāi) 始運(yùn)行的程序?qū)嶓w,大家按照某種規(guī)則輪流使用處 理器,這是現(xiàn)代多道操作系統(tǒng)實(shí)現(xiàn)資源共享,提高 系統(tǒng)資源利用率的主要方式。描述這些程序?qū)嶓w的 概念就是進(jìn)程。 在多道情況下,每個(gè)進(jìn)程獨(dú)立地?fù)碛懈鞣N必要 的資源,占有處理機(jī),獨(dú)立地運(yùn)行。在多道系統(tǒng)中, 同時(shí)存在多個(gè)進(jìn)程,所以當(dāng)某個(gè)進(jìn)程進(jìn)入等待狀態(tài) 時(shí),操作系統(tǒng)將把處理機(jī)控制權(quán)拿過(guò)來(lái)并交給其他 可以運(yùn)行的進(jìn)程。進(jìn)程之間存在著相互制約、相互 依賴(lài)的約束關(guān)系。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理6 一種最糟糕的情況是所有進(jìn)程都擁有部分資源, 同時(shí)在等待其他進(jìn)程擁有的資源,這樣,大家都無(wú)法 運(yùn)行,進(jìn)入一
5、種永久等待的狀態(tài),這種情況稱(chēng)為死鎖, 死鎖是對(duì)系統(tǒng)資源極大的浪費(fèi),必須設(shè)法避免。 本節(jié)著重討論現(xiàn)代多道操作系統(tǒng)中的核心概念 進(jìn)程,這是理解操作系統(tǒng)工作原理的基礎(chǔ)和關(guān)鍵。 首先介紹單個(gè)進(jìn)程的狀態(tài)、狀態(tài)轉(zhuǎn)換的條件和控制原 語(yǔ)、進(jìn)程在系統(tǒng)中的靜態(tài)描述等,接著介紹多個(gè)進(jìn)程 之間的約束關(guān)系,由此引出進(jìn)程間通信的概念,通信 是協(xié)調(diào)、解決進(jìn)程間約束關(guān)系的惟一手段,這種約束 關(guān)系處理不當(dāng)造成的最嚴(yán)重的后果就是死鎖。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理7 5.2.1 進(jìn)程的概念 進(jìn)程的概念最早出現(xiàn)在60年代中期,用于多道系 統(tǒng),在Linux系統(tǒng)中,進(jìn)程也稱(chēng)為任務(wù)(task)。簡(jiǎn)單講, 進(jìn)程就是正在運(yùn)行的
6、程序,更為嚴(yán)謹(jǐn)?shù)谋磉_(dá)是,進(jìn)程 是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的 一次運(yùn)行活動(dòng)。 進(jìn)程的概念對(duì)于理解操作系統(tǒng)有決定性的意義, 而真正理解進(jìn)程,必須了解它的基本性質(zhì)。 進(jìn)程是操作系統(tǒng)分配資源和進(jìn)行調(diào)度的獨(dú)立單位, 具有獨(dú)立性、動(dòng)態(tài)性。多道系統(tǒng)中同時(shí)存在多個(gè)進(jìn)程, 這些進(jìn)程擁有各自的資源,各自獨(dú)立地執(zhí)行,對(duì)于單 處理機(jī)系統(tǒng),進(jìn)程宏觀上同時(shí)運(yùn)行而微觀上是依次執(zhí) 行,這種情況稱(chēng)為并發(fā)執(zhí)行。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理8 1. 進(jìn)程和程序 進(jìn)程和程序是一對(duì)相互聯(lián)系的概念。程序是指令 的有序集合,是一個(gè)靜態(tài)的概念,描述完成某個(gè)功能 的一個(gè)具體操作過(guò)程,而進(jìn)程是程序針對(duì)某一組數(shù)據(jù)
7、 的一次執(zhí)行過(guò)程,更強(qiáng)調(diào)動(dòng)態(tài)特征。一個(gè)完整的進(jìn)程, 包括程序、執(zhí)行程序所需要的數(shù)據(jù),同時(shí)還必須包括 記錄進(jìn)程狀態(tài)的數(shù)據(jù)資料。 在多道分時(shí)操作系統(tǒng)中,按照時(shí)間片輪流在各個(gè) 進(jìn)程間切換。對(duì)于單處理器系統(tǒng),每一個(gè)時(shí)刻只能有 一個(gè)進(jìn)程在執(zhí)行,當(dāng)分配給該進(jìn)程的時(shí)間片用完之后, 不管該進(jìn)程運(yùn)行到什么程度,都必須立即停止,然后 讓出處理器資源,下一個(gè)進(jìn)程進(jìn)入執(zhí)行狀態(tài)。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理9 讓出處理器的進(jìn)程必須記錄好正在運(yùn)行的狀態(tài), 包括寄存器、堆棧等各種信息,這些信息保證當(dāng)處理 器下次切換到這個(gè)進(jìn)程的時(shí)候,進(jìn)程能夠正確地從上 次執(zhí)行到的位置繼續(xù)往下執(zhí)行。 一個(gè)程序在處理相同或不同的
8、操作數(shù)據(jù)時(shí)可以同 時(shí)對(duì)應(yīng)于多個(gè)進(jìn)程。一個(gè)進(jìn)程也可以包含多個(gè)程序, 某個(gè)程序在運(yùn)行過(guò)程中,可能同時(shí)會(huì)調(diào)用到多個(gè)其他 程序,這些具有調(diào)用關(guān)系的多個(gè)程序共同構(gòu)成一次完 整的運(yùn)行活動(dòng),即一個(gè)完整的進(jìn)程。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理10 舉一個(gè)直觀的例子。我們?cè)贚inux系統(tǒng)下使用編 輯器vi進(jìn)行編輯,同時(shí)打開(kāi)多個(gè)窗口,編輯多個(gè)不同 名稱(chēng)的文件,vi編輯器是一個(gè)可執(zhí)行程序,不同的文 件就是不同的操作數(shù)據(jù),而對(duì)應(yīng)于這些文件同時(shí)打開(kāi) 的每一個(gè)編輯窗口就對(duì)應(yīng)著一個(gè)進(jìn)程,每一個(gè)進(jìn)程都 處于不同的狀態(tài)。 如果說(shuō)程序是提供計(jì)算機(jī)操作的一組工作流程的 話,進(jìn)程就是具體的工作過(guò)程,按照同樣的工作流程,
9、針對(duì)不同的原料,可以同時(shí)開(kāi)始多個(gè)工作過(guò)程,得到 多種不同的成品。這種工作流程和工作過(guò)程的關(guān)系就 可以類(lèi)比為程序和進(jìn)程的關(guān)系。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理11 2. 進(jìn)程和作業(yè) 作業(yè)是用戶向計(jì)算機(jī)系統(tǒng)提交一項(xiàng)工作的基本單 位,是用戶在一次事務(wù)處理或計(jì)算過(guò)程中要求計(jì)算機(jī) 所做工作的總和。進(jìn)程是一個(gè)具有一定獨(dú)立功能的程 序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng),是操作系統(tǒng)分 配資源和進(jìn)行調(diào)度的基本單位。 作業(yè)是描述用戶向系統(tǒng)提交工作任務(wù)的實(shí)體單位, 而進(jìn)程是系統(tǒng)完成工作任務(wù)時(shí)程序執(zhí)行的實(shí)體單位。 從這個(gè)角度講,他們處于不同的層次,作業(yè)描述用戶 和操作系統(tǒng)之間的任務(wù)委托關(guān)系,而進(jìn)程描述操作系
10、統(tǒng)內(nèi)部任務(wù)的具體執(zhí)行過(guò)程。一個(gè)用戶的任務(wù),即作 業(yè),由用戶提交給系統(tǒng),必須以進(jìn)程的形式具體完成。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理12 對(duì)于批處理系統(tǒng),通常,作業(yè)放在外存中專(zhuān)門(mén) 的作業(yè)隊(duì)列中等待進(jìn)入內(nèi)存執(zhí)行,要經(jīng)過(guò)一次宏觀 調(diào)度,由外存進(jìn)入內(nèi)存,以進(jìn)程的形式運(yùn)行。而對(duì) 于Linux這樣的分時(shí)系統(tǒng),沒(méi)有宏觀調(diào)度,作業(yè)不經(jīng) 過(guò)調(diào)度,直接進(jìn)入內(nèi)存,以進(jìn)程的形式開(kāi)始運(yùn)行。 任何一個(gè)進(jìn)程,都存在于內(nèi)存中,并且是已經(jīng)開(kāi)始 運(yùn)行的動(dòng)態(tài)實(shí)體。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理13 5.2.2 進(jìn)程描述 進(jìn)程是一個(gè)動(dòng)態(tài)的概念,描述程序的一次運(yùn)行活 動(dòng)。它存在于系統(tǒng)的內(nèi)存中,是操作系統(tǒng)可感知、
11、可 控制的動(dòng)態(tài)實(shí)體,是系統(tǒng)分配各種資源、進(jìn)行調(diào)度的 基本單位。 1. 進(jìn)程控制塊 現(xiàn)在我們來(lái)討論進(jìn)程在內(nèi)存中的靜態(tài)存在方式。 在多道系統(tǒng)中,處理機(jī)在多個(gè)進(jìn)程之間來(lái)回切換,每 個(gè)進(jìn)程都會(huì)在暫停、運(yùn)行這兩種狀態(tài)之間來(lái)回轉(zhuǎn)換。 當(dāng)一個(gè)進(jìn)程在處理機(jī)切換過(guò)來(lái)重新進(jìn)入運(yùn)行狀態(tài)時(shí), 它必須嚴(yán)格精確地接著上次運(yùn)行的位置繼續(xù)進(jìn)行,進(jìn) 程的靜態(tài)描述可以保持切換現(xiàn)場(chǎng),確保準(zhǔn)確銜接,保 證進(jìn)程調(diào)度的實(shí)現(xiàn),順利完成程序所規(guī)定任務(wù)。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理14 進(jìn)程切換現(xiàn)場(chǎng)稱(chēng)為進(jìn)程上下文(context),包含了 一個(gè)進(jìn)程所具有的全部信息,一般包括:進(jìn)程控制塊 (Process Control Blo
12、ck,PCB)、有關(guān)程序段和相應(yīng)的 數(shù)據(jù)集,具體組成見(jiàn)圖2.1。程序段是某個(gè)進(jìn)程執(zhí)行的 相關(guān)指令集合,和靜態(tài)的程序段有明確的對(duì)應(yīng)關(guān)系, 相應(yīng)數(shù)據(jù)集是這個(gè)程序段正在操作的那部分?jǐn)?shù)據(jù), PCB是記錄進(jìn)程各種狀態(tài)的數(shù)據(jù)體,PCB是操作系統(tǒng) 管理感知、控制進(jìn)程的數(shù)據(jù)實(shí)體,通過(guò)它,就可以找 到進(jìn)程的程序段和數(shù)據(jù)集,系統(tǒng)正是通過(guò)PCB來(lái)控制 進(jìn)程的。一般來(lái)講,PCB記錄著進(jìn)程的所有資料,是 全部或部分常駐內(nèi)存的,PCB記錄著程序段和數(shù)據(jù)集 的地址指針,通過(guò)這些指針,就可以得到具體的指令 和數(shù)據(jù)。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理15 PCB記錄了進(jìn)程的全部控制信息,一般較龐 大而復(fù)雜,它可以按照
13、功能大概分成四個(gè)組成部 分:進(jìn)程描述信息、進(jìn)程控制信息、進(jìn)程相關(guān)的 資源信息和CPU現(xiàn)場(chǎng)保護(hù)結(jié)構(gòu)(如圖2.1)。 5.2 進(jìn)程 圖2.1 進(jìn)程描述數(shù)據(jù)關(guān)系示意圖(進(jìn)程上下文) 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理16 2. Linux的PCB Linux系統(tǒng)的進(jìn)程控制塊PCB用一個(gè)稱(chēng)為task- struct的結(jié)構(gòu)體來(lái)描述。 (1) 進(jìn)程描述信息 通過(guò)進(jìn)程描述信息,Linux系統(tǒng)可以惟一地確定 某一個(gè)進(jìn)程的基本情況,可以了解該進(jìn)程所屬的用戶 及用戶組等信息,同時(shí)還能確定這個(gè)進(jìn)程與所有其他 進(jìn)程之間的關(guān)系。這些描述信息包括:進(jìn)程號(hào)、用戶 和組標(biāo)識(shí)以及描述進(jìn)程家族關(guān)系的連接信息。 5.2 進(jìn)程 進(jìn)程調(diào)度及
14、進(jìn)程管理處理機(jī)管理17 進(jìn)程號(hào)(pid,process identifier) Linux系統(tǒng)為每一個(gè)進(jìn)程分配一個(gè)標(biāo)識(shí)號(hào),通過(guò)這 個(gè)標(biāo)識(shí)號(hào)識(shí)別、控制、調(diào)度這個(gè)進(jìn)程,別的進(jìn)程也通 過(guò)這個(gè)標(biāo)識(shí)號(hào)來(lái)識(shí)別這個(gè)進(jìn)程并與之通信,用戶也可 以使用操作命令或系統(tǒng)調(diào)用通過(guò)標(biāo)識(shí)號(hào)來(lái)控制該進(jìn)程。 用戶和組標(biāo)識(shí)(user and group identifier) Linux系統(tǒng)中有四類(lèi)不同的用戶和組標(biāo)識(shí),主要用 來(lái)控制進(jìn)程對(duì)系統(tǒng)文件的訪問(wèn)權(quán)限,實(shí)現(xiàn)系統(tǒng)資源的 安全訪問(wèn)。 Linux使用組將文件和目錄的訪問(wèn)特權(quán)授 予一組用戶,一個(gè)進(jìn)程可以同時(shí)屬于多個(gè)組,這些組 都被放在進(jìn)程的task-struct中的group數(shù)組中
15、。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理18 連接信息(Links) Linux系統(tǒng)中的進(jìn)程之間形成樹(shù)狀的家族關(guān)系, 連接信息記錄某個(gè)進(jìn)程的父進(jìn)程、兄弟進(jìn)程(具有相同 父進(jìn)程的進(jìn)程)以及子進(jìn)程的信息,描述一個(gè)進(jìn)程在整 個(gè)家族系統(tǒng)中的具體位置。 (2) 進(jìn)程控制信息 進(jìn)程控制信息記錄了進(jìn)程的當(dāng)前狀態(tài)、調(diào)度信息、 記時(shí)和時(shí)間信息以及進(jìn)程間通信信息,是系統(tǒng)確定進(jìn) 程的狀態(tài)、了解進(jìn)程之間的關(guān)系、進(jìn)行進(jìn)程調(diào)度的主 要依據(jù)。 進(jìn)程當(dāng)前狀態(tài) 進(jìn)程的生命周期中,總是不停地在各種狀態(tài)之間 轉(zhuǎn)換,有關(guān)進(jìn)程的狀態(tài)及轉(zhuǎn)換規(guī)則,在下節(jié)討論。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理19 調(diào)度信息 系統(tǒng)的調(diào)度程序
16、利用這部分信息決定哪一個(gè)進(jìn)程 應(yīng)該運(yùn)行,包括優(yōu)先級(jí)、實(shí)時(shí)優(yōu)先級(jí)、計(jì)數(shù)器和調(diào)度 策略。 記時(shí)信息 包括時(shí)間和定時(shí)器,給出進(jìn)程占有和利用CPU的 情況,是調(diào)度的依據(jù),也是進(jìn)行統(tǒng)計(jì)、分析以及記費(fèi) 的依據(jù)。 通信信息 多個(gè)進(jìn)程之間通信的各種信息也記錄在PCB中。 Linux支持典型的UNIX進(jìn)程間通信機(jī)制信號(hào)、管 道,也支持System通信機(jī)制共享內(nèi)存、信號(hào)量 和消息隊(duì)列。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理20 (3) 進(jìn)程資源信息 Linux的PCB中包含大量的系統(tǒng)資源信息,這些 信息記錄了與該進(jìn)程有關(guān)的存儲(chǔ)器的各種地址和資料、 文件系統(tǒng)以及打開(kāi)文件的信息等等。通過(guò)這些資料, 進(jìn)程就可以得
17、到運(yùn)行需要的相關(guān)程序段以及必要的數(shù) 據(jù)。 (4) CPU現(xiàn)場(chǎng)信息 進(jìn)程的靜態(tài)描述必須保證一個(gè)進(jìn)程在獲得處理機(jī) 并重新進(jìn)入運(yùn)行狀態(tài)時(shí),能夠精確地接著上次運(yùn)行的 位置繼續(xù)進(jìn)行。相關(guān)程序段和數(shù)據(jù)集以及處理機(jī)現(xiàn)場(chǎng) (或處理機(jī)狀態(tài))都必須保存。處理機(jī)(CPU)現(xiàn)場(chǎng)信息 一般包括處理機(jī)的內(nèi)部寄存器和堆棧等基本數(shù)據(jù)。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理21 task-struct是Linux系統(tǒng)的進(jìn)程控制塊(PCB), 通過(guò)對(duì)PCB的操作,系統(tǒng)為進(jìn)程分配資源并進(jìn)行調(diào) 度,最終完成進(jìn)程的創(chuàng)建和撤銷(xiāo)。系統(tǒng)利用PCB中 的描述信息來(lái)標(biāo)識(shí)一個(gè)進(jìn)程,根據(jù)PCB中的調(diào)度信 息決定該進(jìn)程是否應(yīng)該運(yùn)行。如果這個(gè)進(jìn)程
18、要進(jìn)入 運(yùn)行,首先根據(jù)其中的CPU現(xiàn)場(chǎng)信息來(lái)恢復(fù)運(yùn)行現(xiàn) 場(chǎng),然后根據(jù)資源信息獲取對(duì)應(yīng)的程序段和數(shù)據(jù)集, 接著上次的位置開(kāi)始執(zhí)行,同時(shí)通過(guò)PCB中的通信 信息和其他進(jìn)程協(xié)同工作。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理22 5.2.3 進(jìn)程狀態(tài)及轉(zhuǎn)換 系統(tǒng)通過(guò)PCB對(duì)進(jìn)程進(jìn)行控制,進(jìn)程不斷地在不 同的狀態(tài)之間轉(zhuǎn)換。 1. 進(jìn)程的基本狀態(tài) 在分時(shí)系統(tǒng)中,一個(gè)進(jìn)程擁有了所需要的全部資 源,就可以開(kāi)始執(zhí)行,當(dāng)分配的時(shí)間片結(jié)束,讓出 CPU資源,這種只要能夠占有CPU就能進(jìn)入執(zhí)行的狀 態(tài)稱(chēng)為就緒狀態(tài)。有時(shí),多個(gè)進(jìn)程之間互相制約,某 個(gè)進(jìn)程必須等到某個(gè)事件發(fā)生才能夠競(jìng)爭(zhēng)CPU資源, 這是等待狀態(tài),當(dāng)?shù)?/p>
19、待的事件發(fā)生之后,這個(gè)進(jìn)程被 喚醒,由等待狀態(tài)進(jìn)入就緒狀態(tài),直到獲得CPU才開(kāi) 始執(zhí)行。等待狀態(tài)、就緒狀態(tài)和執(zhí)行狀態(tài)是一個(gè)進(jìn)程 所具有的最基本的三種狀態(tài),見(jiàn)圖2.2。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理23 圖2.2 進(jìn)程基本狀態(tài)及轉(zhuǎn)換示意圖 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理24 2. Linux系統(tǒng)進(jìn)程狀態(tài) Linux系統(tǒng)的2.2.16版本進(jìn)程共有六種狀態(tài),包 括運(yùn)行狀態(tài)、可中斷等待狀態(tài)、不可中斷等待狀態(tài)、 僵死狀態(tài)、暫停狀態(tài)和交換狀態(tài),而在2.4.0版本中 取消了交換狀態(tài),加入獨(dú)占狀態(tài)。 進(jìn)程狀態(tài)值說(shuō)明 TASK-RUNNING0運(yùn)行態(tài) TASK-INTERRUPTIBL
20、E1等待態(tài),可中斷 TASK-UNINTERRUPTIBLE2等待態(tài),不可中斷 TASK-ZOMBIE4僵死態(tài) TASK-STOPPED8暫停態(tài) TASK-S16交換態(tài)(2.4.X版本已取消) TASK-EXCLUSIVE32獨(dú)占態(tài) 5.2 進(jìn)程 表2.1 Linux系統(tǒng)(2.2.X2.4.X版本)進(jìn)程狀態(tài)表 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理25 (1) 運(yùn)行狀態(tài)(running) 系統(tǒng)中的運(yùn)行狀態(tài)實(shí)際包含上述基本狀態(tài)中的執(zhí) 行和就緒兩種狀態(tài),進(jìn)程是正在運(yùn)行還是處于就緒狀 態(tài)準(zhǔn)備運(yùn)行,要靠當(dāng)前是否占有CPU資源來(lái)區(qū)分。 (2) 等待狀態(tài) 系統(tǒng)把基本的等待狀態(tài)進(jìn)一步細(xì)化為可中斷的等 待態(tài)和不可中斷的
21、等待態(tài)兩種。處于這種狀態(tài)的進(jìn)程 都在等待某個(gè)事件或某個(gè)資源,可中斷等待狀態(tài)的進(jìn) 程可以被信號(hào)喚醒而進(jìn)入就緒狀態(tài)等待調(diào)度,而不可 中斷等待狀態(tài)的進(jìn)程是因?yàn)橛布Y源無(wú)法滿足,不能 被信號(hào)喚醒,必須等到所等待的資源得到之后由特定 的方式喚醒。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理26 5.2 進(jìn)程 (3) 僵死狀態(tài)(zombie) 由于某些原因進(jìn)程被終止,這個(gè)進(jìn)程所擁有的內(nèi)存、 文件等資源全部釋放之后,還保存著PCB信息,這種占 有PCB但已經(jīng)無(wú)法運(yùn)行的進(jìn)程就處于僵死狀態(tài)。 (4) 暫停狀態(tài) 處于暫停狀態(tài)的進(jìn)程,一般都是由運(yùn)行狀態(tài)轉(zhuǎn)換而 來(lái),等待某種特殊處理。比如處于調(diào)試跟蹤的程序,每 執(zhí)行到
22、一個(gè)斷點(diǎn),就轉(zhuǎn)入暫停狀態(tài),等待新的輸入信號(hào)。 (5) 交換狀態(tài) 處于交換狀態(tài)的進(jìn)程正在執(zhí)行內(nèi)存、外存的交換工 作。這個(gè)狀態(tài)在2.2.X版本的內(nèi)核中基本已經(jīng)不使用, 在2.4.X版本中沒(méi)有這種狀態(tài)。 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理27 5.2 進(jìn)程 (6) 獨(dú)占狀態(tài) 它應(yīng)該是等待狀態(tài)的一種,處于獨(dú)占狀態(tài)的進(jìn)程 位于等待隊(duì)列中,當(dāng)?shù)却氖录l(fā)生時(shí),只有處于這 種狀態(tài)的進(jìn)程被喚醒,其他處于可中斷和不可中斷等 待狀態(tài)的進(jìn)程則繼續(xù)等待。Linux 2.4引入獨(dú)占狀態(tài)后, 如果事件發(fā)生,只喚醒處于獨(dú)占狀態(tài)的那一個(gè)進(jìn)程, 這就可以大大提高Apache這類(lèi)Web應(yīng)用的效率,使 Linux更適合網(wǎng)絡(luò)服務(wù)器的角色。
23、 Linux系統(tǒng)進(jìn)程的狀態(tài)轉(zhuǎn)換情況。采取一定的簡(jiǎn)化 措施:按照進(jìn)程是否占有處理機(jī)為依據(jù),把進(jìn)程的運(yùn) 行狀態(tài)分為執(zhí)行和就緒兩種狀態(tài);等待狀態(tài)統(tǒng)一考慮, 不再區(qū)分是否可中斷,獨(dú)占狀態(tài)也作為一種等待狀態(tài) 處理;不涉及交換狀態(tài)。見(jiàn)圖2.3。 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理28 圖2.3同時(shí)也記錄了一個(gè)進(jìn)程在整個(gè)生命周期的變化過(guò) 程。從圖的左下方開(kāi)始看,系統(tǒng)在某種特定的情況下, 響應(yīng)某個(gè)要求,首先分配各種資源,創(chuàng)建一個(gè)新的進(jìn) 程,進(jìn)程進(jìn)入就緒隊(duì)列。 圖2.3 Linux系統(tǒng)進(jìn)程狀態(tài)及轉(zhuǎn)換示意圖 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理29 所有的進(jìn)程必須在就緒之后,才有資格競(jìng)爭(zhēng)CPU,進(jìn) 入運(yùn)行狀態(tài)。這
24、樣,進(jìn)程的整個(gè)生命周期中,大致的轉(zhuǎn)換 路徑總是沿著三個(gè)閉合回路進(jìn)行。 就緒狀態(tài)和執(zhí)行狀態(tài)形成第一個(gè)回路。進(jìn)程進(jìn)入就緒 態(tài),放入可執(zhí)行隊(duì)列等待,一旦被調(diào)度函數(shù)選中,就切換 現(xiàn)場(chǎng),進(jìn)入運(yùn)行狀態(tài),等自己的時(shí)間片耗盡之后,馬上保 護(hù)現(xiàn)場(chǎng),讓出CPU,轉(zhuǎn)入就緒狀態(tài),等待新的調(diào)度。 執(zhí)行狀態(tài)、等待狀態(tài)和就緒狀態(tài)形成第二個(gè)回路。處 于執(zhí)行狀態(tài)的進(jìn)程,有時(shí)需要等待某個(gè)事件或某種資源的 發(fā)生,這時(shí),繼續(xù)占有CPU也無(wú)法開(kāi)展工作,就轉(zhuǎn)入等待 狀態(tài),CPU由下一個(gè)被調(diào)度的進(jìn)程占有。當(dāng)?shù)却M(jìn)程所等 待的事件發(fā)生后,等待進(jìn)程被喚醒,進(jìn)入就緒狀態(tài)。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理30 執(zhí)行狀態(tài)、暫停狀態(tài)和就緒
25、狀態(tài)構(gòu)成第三個(gè)回路。 當(dāng)接收到某種特殊的信號(hào),比如SIGSTOP(Linux的停 止信號(hào))時(shí),處于執(zhí)行狀態(tài)的進(jìn)程放棄CPU,保護(hù)現(xiàn)場(chǎng) 之后,進(jìn)入暫停狀態(tài),直到獲得另外一個(gè)特殊的信號(hào)才 進(jìn)入就緒狀態(tài)。 一個(gè)處于執(zhí)行狀態(tài)的進(jìn)程調(diào)用退出函數(shù)exit之后, 進(jìn)程就會(huì)進(jìn)入僵死狀態(tài),這種狀態(tài)下,進(jìn)程釋放了PCB 之外的所有系統(tǒng)資源。也就是說(shuō),它在系統(tǒng)中只留下這 個(gè)進(jìn)程的一個(gè)PCB。 僵死進(jìn)程的父進(jìn)程通過(guò)PCB了解到該進(jìn)程所處的狀 態(tài)后,采取相應(yīng)的處理措施,回收PCB,這個(gè)進(jìn)程就完 成了它的使命,從僵死走向徹底消亡,上圖右上方的虛 箭頭表示了這種結(jié)局。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理31 5.2
26、.4 進(jìn)程控制 進(jìn)程控制,是指對(duì)系統(tǒng)中的全部進(jìn)程實(shí)施有效的 管理,使得進(jìn)程能夠及時(shí)創(chuàng)建、撤銷(xiāo),正確地完成進(jìn) 程各狀態(tài)之間的轉(zhuǎn)換,使得多個(gè)進(jìn)程高效率并發(fā)執(zhí)行, 達(dá)到系統(tǒng)資源高度共享的目的。 進(jìn)程狀態(tài)之間的轉(zhuǎn)換轉(zhuǎn)換通常由三種不同的方式 控制:進(jìn)程控制原語(yǔ)、系統(tǒng)核心函數(shù)(比如調(diào)度)、 和外部事件發(fā)生(比如中斷)。 這里說(shuō)的所謂原語(yǔ), 指系統(tǒng)狀態(tài)下執(zhí)行的一些具 有特定功能的程序段, 這些程序段具有“原子性” , 是執(zhí)行過(guò)程中不可分割的最小單位。用于進(jìn)程控制的 原語(yǔ)有:創(chuàng)建原語(yǔ)、撤銷(xiāo)原語(yǔ)、阻塞原語(yǔ)、喚醒原語(yǔ) 等。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理32 (1) 創(chuàng)建原語(yǔ) 進(jìn)程創(chuàng)建原語(yǔ)用于建立一個(gè)
27、新的進(jìn)程,這個(gè)新進(jìn)程 可以由內(nèi)核調(diào)用進(jìn)程創(chuàng)建原語(yǔ)建立,也可以由父進(jìn)程執(zhí) 行進(jìn)程創(chuàng)建原語(yǔ)生成一個(gè)子進(jìn)程,子進(jìn)程還可以生成子 進(jìn)程,以形成樹(shù)形進(jìn)程家族結(jié)構(gòu)。進(jìn)程創(chuàng)建原語(yǔ)的主要 任務(wù)是形成進(jìn)程的PCB, 因此,調(diào)用者必須提供有關(guān) 的參數(shù),例如進(jìn)程名、進(jìn)程優(yōu)先級(jí)、進(jìn)程正文段起始地 址、資源清單等。 (2) 撤銷(xiāo)原語(yǔ) 當(dāng)一個(gè)進(jìn)程完成了指定的任務(wù)或由于某種錯(cuò)誤導(dǎo)致 異常終止時(shí),要撤銷(xiāo)這個(gè)進(jìn)程以便釋放進(jìn)程占用的資源。 進(jìn)程撤銷(xiāo)原語(yǔ)根據(jù)調(diào)用者提供的信息,找到指定的進(jìn)程, 回收其占用的資源和PCB。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理33 (3) 阻塞原語(yǔ) 當(dāng)正在運(yùn)行的進(jìn)程需要等待某一事件,由自己調(diào)用
28、阻塞原語(yǔ)把自己阻塞起來(lái)成為等待狀態(tài)。阻塞原語(yǔ)主要完 成保護(hù)CPU現(xiàn)場(chǎng)的工作, 即首先中斷處理機(jī)保存該進(jìn)程 的CPU現(xiàn)場(chǎng),然后把被阻塞的進(jìn)程置為等待狀態(tài),插入到 相應(yīng)的等待隊(duì)列,最后轉(zhuǎn)入進(jìn)程調(diào)度程序,從就緒隊(duì)列中 選擇一個(gè)進(jìn)程投入運(yùn)行。 (4) 喚醒原語(yǔ) 當(dāng)處于等待狀態(tài)的進(jìn)程所等待的事件出現(xiàn)時(shí),由發(fā)現(xiàn) 者進(jìn)程調(diào)用喚醒原語(yǔ)喚醒被阻塞的進(jìn)程。 進(jìn)程控制原語(yǔ)由系統(tǒng)執(zhí)行。同時(shí),操作系統(tǒng)還提供了一些 用于進(jìn)程控制的系統(tǒng)調(diào)用和操作命令,用戶可以通過(guò)程序 或者命令的方式控制進(jìn)程。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理34 5.2.5 進(jìn)程約束 現(xiàn)代操作系統(tǒng)中,程序并發(fā)執(zhí)行,多個(gè)進(jìn)程各自獨(dú) 立地運(yùn)行,同時(shí)
29、競(jìng)爭(zhēng)和共享系統(tǒng)中有限的資源,這種競(jìng) 爭(zhēng)與合作構(gòu)成了系統(tǒng)進(jìn)程之間的約束關(guān)系。每個(gè)進(jìn)程獨(dú) 立地申請(qǐng)和釋放系統(tǒng)資源,把申請(qǐng)某一類(lèi)資源的進(jìn)程稱(chēng) 為該類(lèi)資源的消費(fèi)者,把釋放同類(lèi)資源的進(jìn)程稱(chēng)為該類(lèi) 資源的生產(chǎn)者,就得到描述進(jìn)程約束關(guān)系的一般模型: 生產(chǎn)者消費(fèi)者問(wèn)題,也稱(chēng)為有界緩沖區(qū)問(wèn)題。 比較簡(jiǎn)單的情況,兩進(jìn)程共享一個(gè)長(zhǎng)度為N(N0) 的有界緩沖區(qū),一個(gè)進(jìn)程Pp往緩沖區(qū)中送數(shù)據(jù),是生產(chǎn) 者,另一個(gè)進(jìn)程Pc從緩沖區(qū)中讀取數(shù)據(jù),是消費(fèi)者,如 圖2.4,下面來(lái)討論它們間的約束關(guān)系。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理35 圖2.4 簡(jiǎn)單的生產(chǎn)者消費(fèi)者問(wèn)題 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理36
30、首先,生產(chǎn)者進(jìn)程Pp和消費(fèi)者進(jìn)程Pc共享同一個(gè) 有界緩沖區(qū),對(duì)這個(gè)緩沖區(qū)的操作必須是獨(dú)占的。這 種不允許多個(gè)并發(fā)進(jìn)程交叉執(zhí)行的資源稱(chēng)為臨界資源, 臨界的程序段資源稱(chēng)為臨界部分或臨界區(qū)。臨界資源 是由于不同并發(fā)進(jìn)程共享某個(gè)資源造成的,不可能通 過(guò)增加資源的方法解決。這種因?yàn)楣蚕砟骋还匈Y源 而引起的在臨界資源內(nèi)不允許并發(fā)進(jìn)程交叉執(zhí)行的現(xiàn) 象,稱(chēng)為進(jìn)程間的間接約束。 由于對(duì)臨界資源的共享,而產(chǎn)生了臨界區(qū)問(wèn)題。 對(duì)于有著臨界區(qū)問(wèn)題的并行進(jìn)程之間必須互斥,以保 證不會(huì)同時(shí)進(jìn)入臨界區(qū)。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理37 其次,對(duì)生產(chǎn)者進(jìn)程Pp和消費(fèi)者進(jìn)程Pc訪問(wèn)共享有界 緩沖區(qū)的順序有嚴(yán)格
31、的要求。具體來(lái)講,這種限制為: (1) 消費(fèi)者進(jìn)程Pc要接收數(shù)據(jù)時(shí),有界緩沖區(qū)必須至 少有一個(gè)單元是滿的; (2) 生產(chǎn)者進(jìn)程Pp要發(fā)送數(shù)據(jù)時(shí),有界緩沖區(qū)必須至 少有一個(gè)單元是空的。 這樣存在一組相互獨(dú)立的并發(fā)進(jìn)程,各自的執(zhí)行結(jié)果 互為對(duì)方的執(zhí)行條件,從而限制各進(jìn)程執(zhí)行速度的過(guò) 程,稱(chēng)為進(jìn)程間的直接制約。存在直接制約關(guān)系,相 互發(fā)送消息進(jìn)行互相合作、互相等待,各自按照一定 的速度向前推進(jìn)的過(guò)程稱(chēng)為同步。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理38 消費(fèi)者進(jìn)程和生產(chǎn)者進(jìn)程之間因?yàn)楣蚕砭彌_區(qū), 相互競(jìng)爭(zhēng)而間接制約,具有互斥關(guān)系,同時(shí)相互以 對(duì)方的運(yùn)行結(jié)果為條件而直接制約,也具有同步的 關(guān)系,是
32、一對(duì)同時(shí)具有競(jìng)爭(zhēng)和合作的進(jìn)程。 在并發(fā)系統(tǒng)中,進(jìn)程之間相互制約,具有同步 和互斥是相當(dāng)普遍的現(xiàn)象。這種進(jìn)程之間的相互關(guān) 系,依靠單個(gè)進(jìn)程自身的力量是無(wú)法解決的,必須 以進(jìn)程間的相互通信為基礎(chǔ),互相發(fā)送信息,才能 協(xié)調(diào)解決。具體的同步、互斥實(shí)現(xiàn)方案有很多種, 分別基于不同的通信方式。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理39 5.2.6 進(jìn)程通信 進(jìn)程間通信是協(xié)調(diào)解決多個(gè)進(jìn)程之間的約束關(guān)系,實(shí)現(xiàn) 進(jìn)程共同進(jìn)展的關(guān)鍵技術(shù),是多道系統(tǒng)中控制進(jìn)程并發(fā) 執(zhí)行必不可少的機(jī)制。進(jìn)程間的通信有兩種方式:一是 互相發(fā)送少量的控制信息,一般只傳遞一個(gè)或者幾個(gè)字 節(jié)的數(shù)據(jù),進(jìn)程利用這些簡(jiǎn)單的信息,實(shí)現(xiàn)互斥和同
33、步, 控制運(yùn)行速度,這種簡(jiǎn)單的通信方式被稱(chēng)為進(jìn)程間的低 級(jí)通信;另外一種方式稱(chēng)為進(jìn)程間的高級(jí)通信,基本不 涉及進(jìn)程執(zhí)行速度控制,用來(lái)在進(jìn)程之間傳遞大量的信 息,由于這種通信方式主要用于交換信息, 因此,在開(kāi) 發(fā)本地進(jìn)程間通信的同時(shí),也為遠(yuǎn)程進(jìn)程間的通信,和 計(jì)算機(jī)網(wǎng)絡(luò)的開(kāi)發(fā)及控制奠定了基礎(chǔ)。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理40 1. 進(jìn)程通信類(lèi)型 按照通信進(jìn)程雙方的地位,可以把進(jìn)程通信分為:主 從式、會(huì)話式、消息或郵箱機(jī)制以及共享存儲(chǔ)區(qū)四種類(lèi)型。 (1) 主從式 主進(jìn)程一方在整個(gè)通信過(guò)程中處于絕對(duì)的控制地位, 它可以直接控制從進(jìn)程的動(dòng)作,自由地使用從進(jìn)程的資源 和數(shù)據(jù)。 (2) 會(huì)
34、話式 一方進(jìn)程提供服務(wù),另外一方進(jìn)程在得到服務(wù)方的許 可之后,可以使用其提供的服務(wù)。在通信過(guò)程中,雙方的 連接關(guān)系固定,客戶進(jìn)程提出服務(wù)請(qǐng)求,服務(wù)進(jìn)程根據(jù)情 況控制服務(wù)的狀態(tài)和內(nèi)容。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理41 (3) 消息或郵箱機(jī)制 通信雙方具有平等的地位,和現(xiàn)實(shí)生活中的郵件類(lèi) 似。通信雙方通過(guò)緩沖區(qū)或郵箱存放被傳送的數(shù)據(jù), 不 需要建立雙方直接的連接關(guān)系。申請(qǐng)通信的發(fā)起方進(jìn)程 不管接收方進(jìn)程的狀態(tài),把信息直接送入雙方共享的緩 沖區(qū)(或者郵箱)中,接收進(jìn)程在合適的時(shí)機(jī)去讀取緩沖 區(qū)(或者郵箱)以接收信息。 (4) 共享存儲(chǔ)區(qū) 共享存儲(chǔ)區(qū)通信方式中,通信雙方進(jìn)程共享內(nèi)存中
35、的一段存儲(chǔ)空間,共同操作這個(gè)存儲(chǔ)區(qū),達(dá)到數(shù)據(jù)共享 的目的。通信過(guò)程中,數(shù)據(jù)一直存放在共享存儲(chǔ)區(qū)中, 不需要移動(dòng),因此特別適用于大量數(shù)據(jù)的傳遞。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理42 2. Linux系統(tǒng)的進(jìn)程通信 Linux系統(tǒng)提供了多種通信機(jī)制,利用這些機(jī)制, 可以方便地進(jìn)行進(jìn)程之間的相互協(xié)調(diào),實(shí)現(xiàn)進(jìn)程的互 斥和同步。 (1) 信號(hào)(signal) 信號(hào)屬于Linux系統(tǒng)的低級(jí)通信,主要用于在進(jìn)程 之間傳遞控制信號(hào)。 信號(hào)可以發(fā)給一個(gè)或多個(gè)進(jìn)程,可以是由某個(gè)進(jìn) 程發(fā)出,也可以由鍵盤(pán)中斷產(chǎn)生,還可以是由shell程 序向其子進(jìn)程發(fā)送任務(wù)控制命令時(shí)產(chǎn)生。進(jìn)程在某些 系統(tǒng)錯(cuò)誤環(huán)境下也會(huì)有
36、信號(hào)產(chǎn)生。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理43 除了兩個(gè)信號(hào)外,進(jìn)程可以忽略這些信號(hào)中的絕大 部分,這兩個(gè)信號(hào)是引起進(jìn)程終止執(zhí)行的SIGSTOP信 號(hào)和引起進(jìn)程退出的SIGKILL信號(hào)。至于其他信號(hào),進(jìn) 程可以選擇處理它們的具體方式。信號(hào)沒(méi)有固有的相對(duì) 優(yōu)先級(jí)。 并不是系統(tǒng)中每個(gè)進(jìn)程都可以向所有其他進(jìn)程發(fā)送 信號(hào),只有核心和超級(jí)用戶具有此權(quán)限。普通進(jìn)程只能 向具有相同uid和gid的進(jìn)程或者在同一進(jìn)程組中的進(jìn)程 發(fā)送信號(hào)。信號(hào)是通過(guò)設(shè)置task-struct結(jié)構(gòu)中signal域里 的某一位來(lái)產(chǎn)生的。如果進(jìn)程沒(méi)有阻塞信號(hào)并且處于可 中斷的等待狀態(tài),則可以將其狀態(tài)改成running,若
37、確 認(rèn)進(jìn)程還處在運(yùn)行隊(duì)列中,就可以通過(guò)信號(hào)喚醒它。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理44 (2) 管道(pipe) 管道是UNIX操作系統(tǒng)傳統(tǒng)的進(jìn)程通信技術(shù)。 Linux管道通信包括無(wú)名管道和有名管道兩種,通過(guò)文 件系統(tǒng)來(lái)實(shí)現(xiàn)。管道也是一種特殊的文件類(lèi)型,實(shí)際 上是通過(guò)文件系統(tǒng)的高速緩沖實(shí)現(xiàn)的。 兩個(gè)進(jìn)程通過(guò)管道進(jìn)行通信時(shí),兩個(gè)進(jìn)程分別進(jìn) 行讀和寫(xiě)操作,都指向緩沖區(qū)中同樣的物理單元,一 個(gè)進(jìn)程寫(xiě)入數(shù)據(jù),另一個(gè)進(jìn)程從緩沖區(qū)中讀取數(shù)據(jù), 從而實(shí)現(xiàn)信息傳遞。管道方式只能按照先進(jìn)先出方式 單向傳遞信息。管道方式可以用來(lái)進(jìn)行大規(guī)模的數(shù)據(jù) 傳遞。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理45
38、(3) SYSTEM 進(jìn)程間通信 信號(hào)量、消息隊(duì)列和共享內(nèi)存是UNIX/Linux系統(tǒng) 常用的通信方式。 消息隊(duì)列用來(lái)在進(jìn)程之間傳遞分類(lèi)的格式化數(shù)據(jù), 共享內(nèi)存方式可以使不同進(jìn)程共同訪問(wèn)一塊虛擬存儲(chǔ) 空間,通過(guò)對(duì)該存儲(chǔ)區(qū)的共同操作來(lái)實(shí)現(xiàn)數(shù)據(jù)傳遞, 信號(hào)量主要用于進(jìn)程之間的同步控制,通常和共享內(nèi) 存共同使用。 這三種方式在系統(tǒng)中是作為一個(gè)整體實(shí)現(xiàn)的。共 享內(nèi)存是這三種方式中通信效率最高的,它在進(jìn)程的 虛擬空間中進(jìn)行,而且不需要數(shù)據(jù)的移動(dòng)也可以實(shí)現(xiàn) 大規(guī)模的數(shù)據(jù)傳遞。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理46 (4) 套接字(socket) 套接字是用來(lái)通過(guò)網(wǎng)絡(luò)實(shí)現(xiàn)運(yùn)行于不同計(jì)算機(jī)上的進(jìn) 程
39、之間通信的機(jī)制。它可以實(shí)現(xiàn)數(shù)據(jù)的雙向規(guī)模傳遞, 是整個(gè)網(wǎng)絡(luò)通信的基礎(chǔ)。具體的原理和實(shí)現(xiàn)與網(wǎng)絡(luò)協(xié) 議等有關(guān),不做具體的介紹。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理47 5.2.7 死鎖 死鎖,是指所有并發(fā)進(jìn)程都擁有部分資源,同時(shí)都在等 待其他進(jìn)程擁有的資源,而且在得到對(duì)方資源之前不會(huì)釋放 自己占有的資源,所有進(jìn)程都進(jìn)入永久等待狀態(tài)而無(wú)法運(yùn)行 的情況。死鎖是并發(fā)進(jìn)程約束關(guān)系處理不當(dāng)造成的最嚴(yán)重的 后果,是對(duì)系統(tǒng)資源極大的浪費(fèi),必須設(shè)法避免。 死鎖出現(xiàn)的根本原因是系統(tǒng)資源的有限性。并發(fā)進(jìn)程競(jìng) 爭(zhēng)資源,調(diào)度不當(dāng),就可能出現(xiàn)死鎖的情況,因此必須采取 適當(dāng)?shù)拇胧﹣?lái)消除死鎖。 產(chǎn)生死鎖的必要條件有四個(gè)
40、:并發(fā)進(jìn)程之間是互斥關(guān)系, 每個(gè)進(jìn)程必須獨(dú)占某個(gè)系統(tǒng)資源;進(jìn)程占有的資源在未結(jié)束 使用之前,不能被強(qiáng)行剝奪,只能由該進(jìn)程自己釋放;進(jìn)程 需要的資源采用部分分配的方式,在等待新資源的 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理48 同時(shí),繼續(xù)占有已分配的資源;各占有資源的進(jìn)程形成環(huán)路, 每一個(gè)進(jìn)程已獲得的資源同時(shí)被下一個(gè)進(jìn)程請(qǐng)求。 解決死鎖的方案就是破壞死鎖產(chǎn)生的必要條件。方法分 為預(yù)防、回避、檢測(cè)恢復(fù)三種。預(yù)防指采取某種策略,控制 并發(fā)進(jìn)程對(duì)資源的請(qǐng)求,保證死鎖的四個(gè)必要條件在系統(tǒng)運(yùn) 行的任何時(shí)刻都無(wú)法滿足。避免指系統(tǒng)采取某種算法,對(duì)資 源使用情況進(jìn)行預(yù)測(cè),使資源分配盡可能合理,避免死鎖的 發(fā)
41、生。這兩種方法需要大量的系統(tǒng)開(kāi)銷(xiāo),而且系統(tǒng)的資源也 無(wú)法得到充分的利用。因此,一般系統(tǒng)都采取檢測(cè)恢復(fù)的方 法,這種方法是在死鎖發(fā)生之后,根據(jù)系統(tǒng)情況,檢測(cè)死鎖 發(fā)生的位置和原因,使用外力,重新分配資源,破壞死鎖發(fā) 生的條件,系統(tǒng)就可以從死鎖狀態(tài)恢復(fù)正常運(yùn)行,這樣的方 法只要使用少量的系統(tǒng)資源,尤其是CPU時(shí)間就可以排除死 鎖。 5.2 進(jìn)程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理49 多道處理系統(tǒng)中,進(jìn)程是系統(tǒng)調(diào)度和資源分配 的基本單位,計(jì)算機(jī)的CPU不停地在不同進(jìn)程 之間切換,進(jìn)程切換現(xiàn)場(chǎng)稱(chēng)為進(jìn)程上下文,每 一次切換過(guò)程,系統(tǒng)都要對(duì)換出進(jìn)程的上下文 做詳細(xì)記錄,然后恢復(fù)換入進(jìn)程的上下文。因 此,系統(tǒng)的
42、進(jìn)程管理過(guò)程要耗費(fèi)相當(dāng)多的系統(tǒng) 資源和CPU時(shí)間,尤其是對(duì)于需要頻繁進(jìn)程切 換的任務(wù)。 針對(duì)進(jìn)程切換的時(shí)間和資源耗費(fèi)問(wèn)題,為 了減少系統(tǒng)進(jìn)程切換的時(shí)間,提高整個(gè)系統(tǒng)的 效率,引入了線程的概念。 5.3 線程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理50 5.3.1 線程的概念 線程是在一個(gè)進(jìn)程內(nèi)的基本調(diào)度單位。線程可以 看作是一個(gè)執(zhí)行流,擁有記錄自己狀態(tài)和運(yùn)行現(xiàn)場(chǎng)的 少量數(shù)據(jù)(棧段和上下文),但沒(méi)有單獨(dú)的代碼段和數(shù) 據(jù)段,而是與其他線程共享。 多個(gè)線程共享一個(gè)進(jìn)程內(nèi)部的各種資源,分別按 照不同的路徑執(zhí)行,同時(shí)線程也是一個(gè)基本調(diào)度單位, 可以在一個(gè)進(jìn)程內(nèi)部進(jìn)行線程切換,現(xiàn)場(chǎng)保護(hù)工作量 小。一方面通過(guò)共享進(jìn)程
43、的基本資源而減輕系統(tǒng)開(kāi)銷(xiāo), 另一方面提高了現(xiàn)場(chǎng)切換的效率,因此,線程也被稱(chēng) 為輕權(quán)進(jìn)程或輕量級(jí)進(jìn)程。許多流行的多任務(wù)操作系 統(tǒng)基本都支持線程。 5.3 線程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理51 按照系統(tǒng)的管理策略,線程可以分為用戶級(jí)線程和系 統(tǒng)級(jí)線程(內(nèi)核級(jí)線程)兩種基本類(lèi)型。用戶級(jí)線程指不 需要內(nèi)核支持,在用戶程序中實(shí)現(xiàn)的線程都需要用戶程序 自己完成。系統(tǒng)級(jí)線程由內(nèi)核完成線程的調(diào)度并提供相應(yīng) 的系統(tǒng)調(diào)用,用戶程序可以通過(guò)這些接口函數(shù)對(duì)線程進(jìn)行 一定的控制和管理。 用戶級(jí)線程不需要額外的內(nèi)核開(kāi)銷(xiāo),一般只要提供一 個(gè)線程庫(kù)即可,剩下的工作就主要由用戶自己負(fù)責(zé)了。但 是由于用戶級(jí)線程與系統(tǒng)內(nèi)核無(wú)關(guān),
44、當(dāng)一個(gè)進(jìn)程因I/O而 被調(diào)度程序切換為等待狀態(tài)時(shí),屬于該進(jìn)程的某個(gè)執(zhí)行線 程可能仍然處于執(zhí)行狀態(tài)。 系統(tǒng)級(jí)線程的調(diào)度由內(nèi)核完成,不需要更多用戶干預(yù), 但要占用更多的系統(tǒng)開(kāi)銷(xiāo),效率相對(duì)低一些。 5.3 線程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理52 線程也是系統(tǒng)中動(dòng)態(tài)變化的實(shí)體,它描述程序的 運(yùn)行活動(dòng),在內(nèi)存中需要記錄。線程的記錄信息要保 證系統(tǒng)能夠準(zhǔn)確地進(jìn)行線程切換。 在線程的生命周期里,線程作為一個(gè)基本的執(zhí)行 單位而存在,不斷地在執(zhí)行和停止的狀態(tài)之間轉(zhuǎn)換。 線程的基本狀態(tài)是執(zhí)行、就緒和等待。 線程的同步是一個(gè)相當(dāng)關(guān)鍵的問(wèn)題。線程之間的 通信相對(duì)容易,而線程間的同步問(wèn)題需要更仔細(xì)地對(duì) 待,特別是用戶級(jí)
45、線程,這個(gè)問(wèn)題相當(dāng)突出。 5.3 線程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理53 5.3.2線程和進(jìn)程 進(jìn)程是操作系統(tǒng)資源分配和系統(tǒng)調(diào)度的基本單位, 每一個(gè)進(jìn)程都有自己獨(dú)立的地址空間和各種資源,線 程也是一種系統(tǒng)調(diào)度的基本單位,多個(gè)線程可以共享 一個(gè)進(jìn)程的資源,在存儲(chǔ)方面,線程占用的資源更少。 進(jìn)程的調(diào)度主要由操作系統(tǒng)完成,而線程根據(jù)其類(lèi)型 的不同,可以由系統(tǒng)調(diào)度(內(nèi)核級(jí)線程),也可以由用 戶進(jìn)行調(diào)度(用戶級(jí)線程)。 5.3 線程 進(jìn)程調(diào)度及進(jìn)程管理處理機(jī)管理54 進(jìn)程調(diào)度的過(guò)程中要進(jìn)行切換,切換現(xiàn)場(chǎng)的保護(hù)與恢 復(fù)要求對(duì)進(jìn)程上下文做完整的記錄,要消耗一定的存儲(chǔ)資 源和處理機(jī)時(shí)間;線程共享進(jìn)程的資源,可以在進(jìn)程內(nèi)部 切換,不涉及資源保存和內(nèi)存地址變換等操作,可以節(jié)約 大量的空間和時(shí)間資源。因此,對(duì)于切換頻繁的工作任務(wù), 多線程方式比多進(jìn)程方式可以提供更高的響應(yīng)速度。多個(gè) 線程共享同一進(jìn)程的資源,線程相互間通訊容易。而進(jìn)程 間通訊一般必須要通過(guò)系統(tǒng)提供的進(jìn)程間通訊機(jī)制。 進(jìn)程和線程都是用來(lái)描述程序的運(yùn)行活動(dòng),是存在于系統(tǒng) 存儲(chǔ)區(qū)中的動(dòng)態(tài)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 線條燈橋梁施工方案
- 第10課 金與南宋對(duì)峙 教案2024-2025學(xué)年七年級(jí)歷史下冊(cè)新課標(biāo)
- 清水混凝土施工方案總結(jié)
- 2025年低空雷達(dá)行業(yè)政策分析:低空雷達(dá)行業(yè)標(biāo)準(zhǔn)提供有力支持
- 雨水管安裝施工方案
- 混凝土和基礎(chǔ)施工方案
- 大石橋消防施工方案
- 2025年大二財(cái)務(wù)會(huì)計(jì)試題及答案
- 豪邦物業(yè)考試試題及答案
- 常用量具使用方法課件
- 騰訊云人工智能工程師認(rèn)證考試題(附答案)
- 專(zhuān)題03 透鏡及其應(yīng)用(5大模塊知識(shí)清單+5個(gè)易混易錯(cuò)+6種方法技巧+典例真題解析)
- 班級(jí)管理案例與應(yīng)用知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋哈爾濱師范大學(xué)
- ECMO技術(shù)操作規(guī)范試題
- 噴漆工崗位能力培訓(xùn)試題含答案
- 江南大學(xué)《互換性與技術(shù)測(cè)量》2021-2022學(xué)年第一學(xué)期期末試卷
- ECharts數(shù)據(jù)可視化課件 第5章 儀表盤(pán)、漏斗圖和折線樹(shù)圖
- 特殊作業(yè)安全管理監(jiān)護(hù)人專(zhuān)項(xiàng)培訓(xùn)課件
- 農(nóng)行競(jìng)聘高級(jí)專(zhuān)員述職報(bào)告范本
- 2024屆全國(guó)新高考英語(yǔ)復(fù)習(xí)-讀后續(xù)寫(xiě)微寫(xiě)作
評(píng)論
0/150
提交評(píng)論