第二章?進(jìn)程管理
2.1?進(jìn)程概念
2.1.1?程序順序執(zhí)行及其特征
早期的單道程序工作環(huán)境中,內(nèi)存中只有一個(gè)作業(yè)的程序秽荤,機(jī)器執(zhí)行程序的過程就嚴(yán)格按順序方式進(jìn)行,這種程序設(shè)計(jì)方式就叫做順序程序設(shè)計(jì),這種程序活動(dòng)具有三個(gè)主要特點(diǎn):
①:順序性:程序所規(guī)定的每個(gè)動(dòng)作都在上個(gè)動(dòng)作結(jié)束后才開始
②:封閉性:只有程序本身的動(dòng)作才能改變程序的運(yùn)行環(huán)境
③:可再現(xiàn)性:程序的執(zhí)行結(jié)果與程序執(zhí)行的速度無關(guān)
2.1.2?程序并發(fā)執(zhí)行及其特征
1.?程序并發(fā)執(zhí)行概念
多道程序設(shè)計(jì)是指在內(nèi)存中同時(shí)存放多道程序,在管理程序的控制下交替地執(zhí)行兆龙。
多道程序設(shè)計(jì)具有提高系統(tǒng)資源利用率和增加作業(yè)吞吐量的優(yōu)點(diǎn)。(作業(yè)吞吐量是指在給定時(shí)間間隔內(nèi)所完成作業(yè)的數(shù)量)
單道程序設(shè)計(jì):
多道程序設(shè)計(jì):
在這個(gè)例子中访雪,每一時(shí)刻只有一個(gè)作業(yè)的程序在CPU上運(yùn)行详瑞。而從一段時(shí)間來看掂林,作業(yè)A和B都得到運(yùn)行臣缀,這種執(zhí)行方式就稱作程序的并發(fā)執(zhí)行,即在多道程序環(huán)境下泻帮,邏輯上互相獨(dú)立的多個(gè)程序在一段時(shí)間內(nèi)同時(shí)進(jìn)行精置,而在每一時(shí)刻(微觀上)卻僅有一道程序執(zhí)行。單CPU系統(tǒng)中锣杂,程序分時(shí)地交替執(zhí)行脂倦;多CPU系統(tǒng)中,利用每個(gè)CPU來處理一個(gè)可并發(fā)執(zhí)行的程序元莫,實(shí)現(xiàn)并行執(zhí)行赖阻。
2.?程序并發(fā)執(zhí)行的特征
①:失去封閉性:資源的使用狀態(tài)不再僅由某個(gè)程序決定,而是受到并發(fā)程序的共同影響
②:程序與計(jì)算不再一一對(duì)應(yīng):在并發(fā)執(zhí)行過程中踱蠢,一個(gè)共享程序可被多個(gè)用戶作業(yè)調(diào)用火欧,從而形成多個(gè)“計(jì)算”
③:并發(fā)程序在執(zhí)行期間相互制約
2.1.3?進(jìn)程概念的引入和定義
1.進(jìn)程概念定義
進(jìn)程是具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位
程序和進(jìn)程的4個(gè)重要區(qū)別:
①:動(dòng)態(tài)性:程序是靜態(tài)茎截、被動(dòng)的概念苇侵,本身可作為一種軟件資源長(zhǎng)期保存;而進(jìn)程是程序的一次執(zhí)行過程企锌,是動(dòng)態(tài)榆浓、主動(dòng)的概念,有一定的生命期撕攒,會(huì)動(dòng)態(tài)地產(chǎn)生和消亡
②:并發(fā)性:傳統(tǒng)的進(jìn)程是一個(gè)獨(dú)立運(yùn)行的單位陡鹃,能與其他進(jìn)程并發(fā)執(zhí)行烘浦。進(jìn)程是作為資源申請(qǐng)和調(diào)度單位存在的;而通常的程序不能作為一個(gè)獨(dú)立運(yùn)行的單位來并發(fā)執(zhí)行杉适。
③:非對(duì)應(yīng)性
④:異步性:各個(gè)進(jìn)程在并發(fā)執(zhí)行過程中會(huì)產(chǎn)生相互制約關(guān)系谎倔,造成各自前進(jìn)速度的不可預(yù)測(cè)性。而程序本身是靜態(tài)的猿推,不存在這種異步特征
3.?進(jìn)程的特征
①:動(dòng)態(tài)性
②:并發(fā)性:多個(gè)進(jìn)程的實(shí)體能存在于同一內(nèi)存中片习,在一段時(shí)間內(nèi)都能得到運(yùn)行,這樣就使得一個(gè)進(jìn)程的程序與其他進(jìn)程的程序并發(fā)執(zhí)行了
③:調(diào)度性:進(jìn)程是系統(tǒng)中申請(qǐng)資源的單位蹬叭,也是被調(diào)度的單位藕咏。操作系統(tǒng)中有很多調(diào)度程序,它們根據(jù)各自的策略調(diào)度合適的進(jìn)程秽五,為其運(yùn)行提高條件
④:異步性:各個(gè)進(jìn)程向前推進(jìn)的速度是不可預(yù)知的沛厨,即異步方式運(yùn)行
⑤:結(jié)構(gòu)性:進(jìn)程有一定的結(jié)構(gòu),它由程序段辩昆、數(shù)據(jù)段和控制結(jié)構(gòu)(如進(jìn)程控制塊)等組成
2.2?進(jìn)程狀態(tài)描述及組織方式
2.2.1?進(jìn)程的狀態(tài)及其轉(zhuǎn)換
1.?進(jìn)程的狀態(tài)
①:運(yùn)行狀態(tài):指當(dāng)前進(jìn)程已分配到CPU蛋济,它的程序正在處理機(jī)上執(zhí)行時(shí)的狀態(tài)
②:就緒狀態(tài):指當(dāng)前進(jìn)程已具備運(yùn)行條件,但因?yàn)槠渌M(jìn)程正占用CPU瓣铣,所以暫時(shí)不能運(yùn)行而等待分配CPU的狀態(tài)
③:阻塞狀態(tài):指進(jìn)程因等待某種事件發(fā)生(如等待輸入答朋,輸出操作完成,等待其他進(jìn)程發(fā)來的信號(hào)等)而暫時(shí)不能運(yùn)行的狀態(tài)棠笑。處于阻塞狀態(tài)的進(jìn)程尚不具備運(yùn)行條件梦碗,即使CPU空閑,它也無法運(yùn)行蓖救。該狀態(tài)或稱為封鎖狀態(tài)或等待狀態(tài)
④:新建狀態(tài):指進(jìn)程剛被創(chuàng)建洪规,尚未放入就緒隊(duì)列時(shí)的狀態(tài)。處于該狀態(tài)的進(jìn)程還是不完全的循捺。當(dāng)創(chuàng)建新進(jìn)程的所有工作(包括分配一個(gè)進(jìn)程控制塊斩例、分配內(nèi)存空間、對(duì)進(jìn)程控制塊初始化等)完成后从橘,操作系統(tǒng)就把該進(jìn)程送入刀就緒隊(duì)列中
⑤:終止?fàn)顟B(tài):指進(jìn)程完成自己的任務(wù)而正常終止時(shí)或在運(yùn)行期間由于出現(xiàn)某些錯(cuò)誤和故障而被迫終止時(shí)所處的狀態(tài)念赶。處于終止?fàn)顟B(tài)的進(jìn)程不能再被調(diào)度運(yùn)行,下一步必然的結(jié)局是被系統(tǒng)撤銷洋满,進(jìn)而從系統(tǒng)中永久消失
⑥:掛起狀態(tài):使處于基本狀態(tài)(就緒晶乔、運(yùn)行、阻塞)的進(jìn)程處于靜止?fàn)顟B(tài)牺勾,此時(shí)系統(tǒng)回收被這些進(jìn)程占用的內(nèi)存資源正罢,將其實(shí)體復(fù)制到外存的進(jìn)程交換區(qū)。掛起不等于撤銷驻民,可通過解掛重新分配內(nèi)存翻具。被掛起的進(jìn)程處于靜止?fàn)顟B(tài)履怯,并且不能直接被處理機(jī)調(diào)度。
添加掛起狀態(tài)的原因:終端用戶的請(qǐng)求裆泳,父進(jìn)程請(qǐng)求叹洲,負(fù)荷調(diào)節(jié)的需要以及操作系統(tǒng)的需要。
2.?進(jìn)程狀態(tài)的轉(zhuǎn)換
①:就緒→運(yùn)行工禾;②:運(yùn)行→阻塞运提;③:阻塞→就緒;
④:運(yùn)行→就緒(正在運(yùn)行的進(jìn)程如用完了本次分配給它的CPU時(shí)間片闻葵,它就得從CPU上退下來民泵,暫停運(yùn)行)
2.2.2?進(jìn)程的組成
1.?進(jìn)程映像
程序和數(shù)據(jù)組成進(jìn)程的實(shí)體,二者皆是靜態(tài)文本槽畔,還需有一個(gè)數(shù)據(jù)結(jié)構(gòu)描述進(jìn)程當(dāng)前的狀態(tài)栈妆、本身的特性、對(duì)資源的占用及調(diào)度信息等厢钧。這種數(shù)據(jù)結(jié)構(gòu)稱為進(jìn)程控制塊(Process Control Block鳞尔,PCB)。此外早直,程序的執(zhí)行過程必須包含一個(gè)或多個(gè)棧寥假,用來保存過程調(diào)用和相互傳送參數(shù)的蹤跡。進(jìn)程映像通常由程序莽鸿、數(shù)據(jù)集合昧旨、棧和PCB組成拾给。
2.?進(jìn)程控制塊的組成
PCB含有進(jìn)程的描述信息和控制信息祥得,是進(jìn)程動(dòng)態(tài)特性的集中反映,是系統(tǒng)對(duì)進(jìn)程施行識(shí)別和控制的依據(jù)蒋得。PCB組成包含以下內(nèi)容:
①:進(jìn)程名:它是唯一的標(biāo)志對(duì)應(yīng)進(jìn)程的一個(gè)標(biāo)識(shí)符或數(shù)字级及。有的系統(tǒng)利用進(jìn)程標(biāo)識(shí)符作為進(jìn)程的外部標(biāo)志,用進(jìn)程標(biāo)志數(shù)作為進(jìn)程的內(nèi)部標(biāo)志额衙;
②:特征信息:包含是系統(tǒng)進(jìn)程還是用戶進(jìn)程饮焦、進(jìn)程實(shí)體是否常駐內(nèi)存等信息;
③:進(jìn)程狀態(tài)信息:表明該進(jìn)程的執(zhí)行狀態(tài)是運(yùn)行態(tài)窍侧、就緒態(tài)還是阻塞態(tài)县踢;
④:調(diào)度優(yōu)先權(quán):表示進(jìn)程獲取CPU的優(yōu)先級(jí)別
⑤:通信信息:反映該進(jìn)程與哪些進(jìn)程有什么樣的通信關(guān)系,如等待哪個(gè)進(jìn)程的信號(hào)等伟件;
⑥:現(xiàn)場(chǎng)保護(hù)區(qū):當(dāng)對(duì)應(yīng)進(jìn)程由于某個(gè)原因放棄使用CPU時(shí)硼啤,需要將它的一部分與運(yùn)行環(huán)境有關(guān)的信息保存起來,以便在重新獲得CPU后能恢復(fù)正常運(yùn)行斧账。通常被保護(hù)的信息有程序計(jì)數(shù)器谴返、程序狀態(tài)字煞肾、各工作寄存器的內(nèi)容等;
⑦:資源需求嗓袱、分配和控制方面的信息籍救;如進(jìn)程所需要或占有的I/O設(shè)備、磁盤空間渠抹、數(shù)據(jù)區(qū)等蝙昙;
⑧:進(jìn)程實(shí)體信息:指出該進(jìn)程的程序和數(shù)據(jù)的存儲(chǔ)情況,如在內(nèi)存或外存的地址梧却、大小等耸黑;
⑨:族系關(guān)系:反映父子進(jìn)程的隸屬關(guān)系;
⑩:其他信息:如文件信息篮幢、工作單元等大刊;
3.?進(jìn)程控制塊的作用
進(jìn)程的動(dòng)態(tài)、并發(fā)等特征是利用PCB表現(xiàn)出來的三椿。若沒有進(jìn)程控制塊缺菌,則多道程序環(huán)境中的程序(和數(shù)據(jù))是無法實(shí)現(xiàn)并發(fā)的。PCB是進(jìn)程存在的唯一標(biāo)志搜锰。
2.2.3?進(jìn)程組織方式
1.?線性方式
操作系統(tǒng)預(yù)先確定整個(gè)系統(tǒng)中同時(shí)存在的進(jìn)程的最大數(shù)目伴郁,然后靜態(tài)分配空間,把所有進(jìn)程的PCB都放在這個(gè)表中蛋叼。當(dāng)很多用戶同時(shí)上機(jī)時(shí)焊傅,會(huì)造成無法為用戶創(chuàng)建新進(jìn)程的情況。在執(zhí)行CPU調(diào)度時(shí)狈涮,為選擇合理的進(jìn)程投入運(yùn)行狐胎,經(jīng)常需要對(duì)整個(gè)表進(jìn)行掃描,降低了調(diào)度效率歌馍。
2.?鏈接方式
鏈接方式是經(jīng)常采用的方式握巢,按照進(jìn)程的不同狀態(tài)將其放在不同的隊(duì)列中。
3.?索引方式
索引方式是利用索引表記載相應(yīng)狀態(tài)進(jìn)程的PCB地址松却,狀態(tài)相同的進(jìn)程的PCB組織在同一索引表中暴浦,每個(gè)索引表的表目中存放該P(yáng)CB的地址。各索引表在內(nèi)存的起始地址放在專用的指針單元中晓锻。
2.3?進(jìn)程管理和有關(guān)命令
2.3.1?進(jìn)程圖和進(jìn)程管理
1.?進(jìn)程圖
開機(jī)后歌焦,首先引導(dǎo)操作系統(tǒng),把它裝入內(nèi)存砚哆,之后生成第一個(gè)進(jìn)程(在UNIX中稱為0進(jìn)程)独撇,由它創(chuàng)建1進(jìn)程及其他核心進(jìn)程;然后1進(jìn)程又為每個(gè)終端創(chuàng)建命令解釋進(jìn)程(shell進(jìn)程);用戶輸入命令后又創(chuàng)建若干進(jìn)程券勺。
2.?進(jìn)程創(chuàng)建
創(chuàng)建新進(jìn)程要執(zhí)行創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用绪钥,主要操作過程如下:
①:申請(qǐng)一個(gè)空閑的PCB,從系統(tǒng)的PCB表中找出一個(gè)空閑的PCB項(xiàng)关炼,并指定唯一的進(jìn)程標(biāo)識(shí)號(hào)PID(即進(jìn)程內(nèi)部名)
②:為新進(jìn)程分配資源
③:將新進(jìn)程的PCB初始化程腹,一般將新進(jìn)程狀態(tài)設(shè)置為就緒狀態(tài)
④:將新進(jìn)程加入就緒隊(duì)列中,一個(gè)進(jìn)程派生新進(jìn)程后儒拂,有兩種可能的執(zhí)行方式:
(1)?父進(jìn)程和子進(jìn)程同時(shí)(并發(fā))執(zhí)行寸潦;(2)?父進(jìn)程等待它的某個(gè)或全部子進(jìn)程終止
建立子進(jìn)程的地址空間也有兩種可能的方式:
(1)子進(jìn)程復(fù)制父進(jìn)程的地址空間;(2)?把程序裝入子進(jìn)程的地址空間
子進(jìn)程被創(chuàng)建后社痛,一般使用execlp系統(tǒng)調(diào)用——用一個(gè)程序(可執(zhí)行文件)取代原來內(nèi)存空間中的內(nèi)容见转,然后開始執(zhí)行。當(dāng)子進(jìn)程運(yùn)行時(shí)蒜哀,如果父進(jìn)程無事可做斩箫,就執(zhí)行wait系統(tǒng)調(diào)用,把自己插入阻塞隊(duì)列中撵儿,等待子進(jìn)程的終止
3.?進(jìn)程終止
終止進(jìn)程的主要操作過程:
①:從系統(tǒng)的PCB表中找到指定進(jìn)程的PCB乘客。若它處于運(yùn)行態(tài),則立即終止該進(jìn)程的運(yùn)行
②:回收該進(jìn)程所占用的全部資源
③:若該進(jìn)程還有子孫進(jìn)程淀歇,則還要終止其所有子孫進(jìn)程易核,回收它們所占用的全部資源
④:釋放被終止進(jìn)程的PCB,并從原來的隊(duì)列中摘走
4.?進(jìn)程阻塞
①:立即停止當(dāng)前進(jìn)程的執(zhí)行浪默;
②:將現(xiàn)行進(jìn)程的CPU現(xiàn)場(chǎng)送到該進(jìn)程的PCB現(xiàn)場(chǎng)保護(hù)區(qū)保存起來牡直,以便將來重新運(yùn)行時(shí)恢復(fù)此時(shí)的現(xiàn)場(chǎng);
③:把該進(jìn)程PCB中的現(xiàn)行狀態(tài)由“運(yùn)行”改為“阻塞”纳决,把它插入具有相同事件的阻塞隊(duì)列中碰逸;
④:然后轉(zhuǎn)到進(jìn)程調(diào)度程序,重新從就緒隊(duì)列中挑選一個(gè)合適進(jìn)程投入運(yùn)行
5.?進(jìn)程喚醒
執(zhí)行過程:
①:首先把阻塞進(jìn)程從相應(yīng)的阻塞隊(duì)列中摘下岳链;
②:將現(xiàn)行狀態(tài)改為就緒態(tài)花竞,然后將該進(jìn)程插入就緒隊(duì)列中劲件;
③:如果被喚醒進(jìn)程比運(yùn)行進(jìn)程有更高的優(yōu)先級(jí)掸哑,則設(shè)置重新調(diào)度標(biāo)志
6.?進(jìn)程映像的更換
在有些系統(tǒng)中,由于創(chuàng)建子進(jìn)程時(shí)是把父進(jìn)程的映像復(fù)制給子進(jìn)程零远,所有父子進(jìn)程的映像基本相同苗分。如果子進(jìn)程不改變自己的映像,就必然重復(fù)父進(jìn)程的過程牵辣。
改變進(jìn)程映像的主要過程:
①:釋放子進(jìn)程原來的程序和數(shù)據(jù)所占用的內(nèi)存空間摔癣;(釋放掉父進(jìn)程映像內(nèi)容)
②:從磁盤上找出子進(jìn)程所要執(zhí)行的程序和數(shù)據(jù)
③:分配內(nèi)存空間,裝入新的程序和數(shù)據(jù)
④:為子進(jìn)程建立初始的運(yùn)行環(huán)境——主要是對(duì)各個(gè)寄存器初始化,返回到用戶態(tài)择浊,運(yùn)行該進(jìn)程的程序
2.3.2 Linux進(jìn)程管理
1. Linux進(jìn)程狀態(tài)
①:運(yùn)行態(tài):進(jìn)程正在運(yùn)行或準(zhǔn)備運(yùn)行(就緒態(tài))戴卜,當(dāng)前進(jìn)程由運(yùn)行指針?biāo)赶颍?/p>
②:可中斷等待態(tài):此時(shí)進(jìn)程處于“淺度”睡眠——等待一個(gè)時(shí)間的發(fā)生或某種系統(tǒng)資源,它能夠被信號(hào)或中斷喚醒琢岩。當(dāng)所等待的資源得到滿足時(shí)投剥,它也被喚醒;
③:不可中斷等待態(tài):進(jìn)程處于“深度”睡眠的等待隊(duì)列中担孔,不能被信號(hào)或中斷喚醒江锨,只有所等待的資源得到滿足時(shí)才能被喚醒;
④:停止態(tài):通常由于接收一個(gè)信號(hào)糕篇,致使進(jìn)程停止啄育;
⑤:僵死態(tài):由于某些原因,進(jìn)程被終止了拌消,但是該進(jìn)程的控制結(jié)構(gòu)task_struct仍然保留著挑豌。
2.?進(jìn)程的運(yùn)行模式和類型
在Linux系統(tǒng)中,進(jìn)程的運(yùn)行模式劃分為用戶模式和內(nèi)核模式
Linux進(jìn)程分為兩大類型:一類是系統(tǒng)進(jìn)程墩崩,其只運(yùn)行在內(nèi)核模式浮毯,執(zhí)行操作系統(tǒng)代碼,完成一些管理性的工作泰鸡,如內(nèi)存分配和進(jìn)程切換等债蓝。另一類是用戶進(jìn)程,通常在用戶模式下執(zhí)行盛龄,并通過系統(tǒng)調(diào)用或在出現(xiàn)中斷饰迹、異常時(shí)進(jìn)入內(nèi)核模式
3. Linux進(jìn)程結(jié)構(gòu)
①:task_struct結(jié)構(gòu):Linux系統(tǒng)中的每個(gè)進(jìn)程都有一個(gè)名為task_struct的數(shù)據(jù)結(jié)構(gòu),它相當(dāng)于“進(jìn)程控制塊”余舶。系統(tǒng)中有一個(gè)進(jìn)程向量數(shù)組task啊鸭,其長(zhǎng)度默認(rèn)值是512B,數(shù)組的元素是指向task_struct結(jié)構(gòu)的指針匿值。在創(chuàng)建新進(jìn)程時(shí)赠制,Linux就從系統(tǒng)內(nèi)存中分配一個(gè)task_struct結(jié)構(gòu),并把它的首地址加入task數(shù)組挟憔。當(dāng)前正在運(yùn)行的進(jìn)程的task_struct結(jié)構(gòu)用current指針指示
②:進(jìn)程系統(tǒng)堆棧:在Linux系統(tǒng)中钟些,每個(gè)進(jìn)程都有一個(gè)系統(tǒng)堆棧,用來保存中斷現(xiàn)場(chǎng)信息和進(jìn)程進(jìn)入內(nèi)核模式后執(zhí)行子程序(函數(shù))嵌套調(diào)用的返回現(xiàn)場(chǎng)信息绊谭。每個(gè)進(jìn)程的系統(tǒng)堆棧和task_struct數(shù)據(jù)結(jié)構(gòu)之間存在緊密聯(lián)系政恍,二者物理存儲(chǔ)空間也連在一起。
2.3.3?有關(guān)進(jìn)程操作的命令
①:ps命令:查看進(jìn)程狀態(tài)最常用的命令达传,可提供關(guān)于進(jìn)程的許多信息
②:kill命令:終止一個(gè)進(jìn)程的運(yùn)行
③:sleep命令:使進(jìn)程暫停執(zhí)行一段時(shí)間
④:pstree命令:每一個(gè)進(jìn)程都是由其父進(jìn)程創(chuàng)建的(0進(jìn)程除外)篙耗。pstree命令可將系統(tǒng)中各進(jìn)程間的關(guān)系以進(jìn)程的樹狀圖展示出來
⑤:top命令:實(shí)時(shí)監(jiān)視系統(tǒng)不同進(jìn)程所使用的資源
⑥:nice命令:通常用于降低一個(gè)進(jìn)程的優(yōu)先級(jí)
⑦:fg命令和bg命令:使用bg命令迫筑,將任務(wù)放在后臺(tái)執(zhí)行;使用fg命令宗弯,將后臺(tái)運(yùn)行的進(jìn)程調(diào)度到前臺(tái)運(yùn)行
2.4?線程概念
2.4.1?什么是線程
1.?線程概念
線程是進(jìn)程中執(zhí)行運(yùn)算的最小單位脯燃,亦即執(zhí)行處理機(jī)調(diào)度的基本單位。
引入線程概念的原因主要有:
①:使并行實(shí)體獲得共享同一地址空間和所有可用數(shù)據(jù)的能力蒙保;
②:易于切換曲伊,代價(jià)低;
③:可以改善系統(tǒng)的性能
2.?線程的組成
每個(gè)線程有一個(gè)thread結(jié)構(gòu)追他,即線程控制塊坟募,用于保存自己私有的信息,其主要由以下4個(gè)基本部分組成:
①:一個(gè)唯一的線程標(biāo)識(shí)符邑狸;
②:描述處理器工作情況的一組寄存器(如程序計(jì)數(shù)器懈糯、狀態(tài)寄存器、通用寄存器等)的內(nèi)容单雾;
③:每個(gè)thread結(jié)構(gòu)有兩個(gè)棧指針赚哗。一個(gè)指向核心棧,一個(gè)指向用戶棧硅堆;
④:一個(gè)私有存儲(chǔ)區(qū)屿储,存放現(xiàn)場(chǎng)保護(hù)信息和其他與該線程相關(guān)的統(tǒng)計(jì)信息等。
一個(gè)進(jìn)程可以包含一個(gè)線程或多個(gè)線程渐逃。
3.?線程的狀態(tài)
線程也有若干種狀態(tài)够掠,如運(yùn)行狀態(tài)、阻塞狀態(tài)茄菊、就緒狀態(tài)和終止?fàn)顟B(tài)
線程是一個(gè)動(dòng)態(tài)過程疯潭。它的狀態(tài)轉(zhuǎn)換是在一定的條件下實(shí)現(xiàn)的。通常面殖,當(dāng)一個(gè)新進(jìn)程創(chuàng)建時(shí)竖哩,該進(jìn)程的一個(gè)線程也被創(chuàng)建。以后脊僚,這個(gè)線程還可以在它所屬的進(jìn)程內(nèi)部創(chuàng)建另外的線程相叁,為新線程提供指令指針和參數(shù),同時(shí)為新線程提供私有的寄存器內(nèi)容和椓苫希空間
4.?線程和進(jìn)程的關(guān)系
①:一個(gè)進(jìn)程可以有多個(gè)線程增淹,但至少要有一個(gè)線程;而一個(gè)線程只能在一個(gè)進(jìn)程的地址空間內(nèi)活動(dòng)舶衬;
②:資源分配給進(jìn)程埠通,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源;
③:CPU分配給線程逛犹,即真正在CPU上運(yùn)行的是線程;
④:線程在執(zhí)行過程中需要協(xié)作同步。
2.4.2?線程的實(shí)現(xiàn)方式
1.?用戶級(jí)線程
優(yōu)點(diǎn):①:線程切換速度很快虽画,無須進(jìn)行系統(tǒng)調(diào)度舞蔽;②:調(diào)度算法可以是應(yīng)用程序?qū)S玫摹T试S不同的應(yīng)用程序采用適合自己要求的不同的調(diào)度算法码撰,并且不干擾底層操作系統(tǒng)的調(diào)度程序渗柿;③:用戶級(jí)線程可以運(yùn)行在任何操作系統(tǒng)上,包括不支持線程機(jī)制的操作系統(tǒng)脖岛。
缺點(diǎn):①:系統(tǒng)調(diào)用的阻塞問題朵栖;②:在單純用戶級(jí)線程方式中,多線程應(yīng)用程序不具有多處理器的優(yōu)點(diǎn)
2.?核心級(jí)線程
優(yōu)點(diǎn):①:在多處理器系統(tǒng)中柴梆,核心可以同時(shí)調(diào)度同一進(jìn)程的多個(gè)線程陨溅,真正實(shí)現(xiàn)并行操作;②:如果一個(gè)進(jìn)程的某個(gè)線程阻塞了绍在,核心可以調(diào)度同一個(gè)進(jìn)程的另一個(gè)線程门扇;③:核心線程本身也可以是多線程的
缺點(diǎn):①:控制轉(zhuǎn)移開銷大;②:調(diào)度算法由核心確定偿渡,應(yīng)用進(jìn)程無法影響到線程的切換
2.5?進(jìn)程間的同步與互斥
2.5.1?進(jìn)程間的關(guān)系
1.?同步
邏輯上相關(guān)的兩個(gè)或多個(gè)進(jìn)程為完成一項(xiàng)任務(wù)臼寄,通過協(xié)調(diào)活動(dòng)來使用同一資源,而產(chǎn)生的執(zhí)行時(shí)序的約束關(guān)系溜宽,稱作同步
2.?互斥
邏輯上彼此獨(dú)立的兩個(gè)或多個(gè)進(jìn)程由于爭(zhēng)用同一資源而發(fā)生的相互制約關(guān)系稱作互斥
兩個(gè)或多個(gè)進(jìn)程同時(shí)訪問和操縱相同的數(shù)據(jù)時(shí)吉拳,最后的執(zhí)行結(jié)果取決于進(jìn)程運(yùn)行的精準(zhǔn)時(shí)序,這種情況稱為競(jìng)爭(zhēng)條件
2.5.2?競(jìng)爭(zhēng)條件和臨界區(qū)
一次僅允許一個(gè)進(jìn)程使用的臨界資源适揉,我們把這類共享資源稱為臨界資源合武,在每個(gè)進(jìn)程中訪問臨界資源的那段程序稱為臨界區(qū)(Critical Section),簡(jiǎn)稱CS區(qū)
進(jìn)程互斥進(jìn)入臨界區(qū)都要遵循一種通用模式:進(jìn)入前要申請(qǐng)涡扼,獲準(zhǔn)后方可進(jìn)入稼跳;執(zhí)行后要退出,然后才可以執(zhí)行其他代碼
欲進(jìn)入臨界區(qū)的若干進(jìn)程要滿足如下條件:
①:任何時(shí)候吃沪,處于臨界區(qū)內(nèi)的進(jìn)程不可多于一個(gè)汤善;②:如果若干進(jìn)程要求進(jìn)入空閑的臨界區(qū),則一次僅允許一個(gè)進(jìn)程進(jìn)入票彪;③:不能使進(jìn)程無限期等待進(jìn)入臨界區(qū)红淡;④:不應(yīng)對(duì)CPU的速度和數(shù)量進(jìn)行任何假設(shè)
2.5.3?進(jìn)程同步機(jī)制
1.?實(shí)現(xiàn)互斥方式
①:利用硬件方法解決進(jìn)程互斥問題:禁止中斷和設(shè)置專用機(jī)器指令
②:原語操作:所謂原語是機(jī)器指令的延伸,往往是為完成某些特定的功能而編制的一段系統(tǒng)程序降铸,為保證操作的正確性在旱,在許多機(jī)器中規(guī)定,執(zhí)行原語操作時(shí)要屏蔽中斷推掸,以保證其操作的不可分割性
③:利用軟件方法解決進(jìn)程互斥問題:關(guān)鎖桶蝎,執(zhí)行臨界區(qū)程序驻仅,開鎖
2.?信號(hào)量及P、V操作原語
①:整型信號(hào)量
將信號(hào)量定義為一個(gè)特殊的登渣、可共享的整型量噪服,對(duì)信號(hào)量的操作只能有3個(gè):初始化為一個(gè)非負(fù)值,以及由P和V兩個(gè)操作分別對(duì)信號(hào)量減1和加1
②:記錄型信號(hào)量
對(duì)信號(hào)量和P胜茧、V操作的定義進(jìn)行改進(jìn)粘优,一般是由兩個(gè)成員組成的數(shù)據(jù)結(jié)構(gòu):一個(gè)成員是整型變量,表示該信號(hào)量的值呻顽;另一個(gè)是指向PCB的指針
信號(hào)量的值是與相應(yīng)資源的使用情況有關(guān)的雹顺。當(dāng)它的值大于0時(shí),則表示當(dāng)前可用資源的數(shù)量廊遍;當(dāng)它的值小于0時(shí)嬉愧,則其絕對(duì)值表示等待使用該資源的進(jìn)程個(gè)數(shù),即在該信號(hào)量隊(duì)列上排隊(duì)的PCB的個(gè)數(shù)
2.5.4?信號(hào)量的一般應(yīng)用
1.?用信號(hào)量實(shí)現(xiàn)進(jìn)程互斥
利用信號(hào)量實(shí)現(xiàn)互斥的一般模型是:
①:在每個(gè)程序中用于實(shí)現(xiàn)互斥的P(mutex)和V(mutex)必須成對(duì)出現(xiàn)昧碉,即先做P英染,進(jìn)入臨界區(qū);后做V被饿,退出臨界區(qū)四康;②:互斥信號(hào)量mutex的初值一般為1
2.?用信號(hào)量實(shí)現(xiàn)進(jìn)程簡(jiǎn)單同步
2.6?經(jīng)典進(jìn)程同步問題
1.?生產(chǎn)者-消費(fèi)者問題
生產(chǎn)者-消費(fèi)者問題可表述為:一組生產(chǎn)者進(jìn)程和一組消費(fèi)者進(jìn)程(假設(shè)每組有多個(gè)進(jìn)程)通過緩沖區(qū)發(fā)生聯(lián)系
為使這兩類進(jìn)程協(xié)調(diào)工作,防止盲目地生產(chǎn)和消費(fèi)狭握,它們要滿足如下同步條件:
①:任一時(shí)刻所有生產(chǎn)者存放產(chǎn)品的單元數(shù)不能超過緩沖區(qū)的總?cè)萘?N)闪金;
②:所有消費(fèi)者取出產(chǎn)品的總量不能超過所有生產(chǎn)者當(dāng)前生產(chǎn)產(chǎn)品的總量