操作系統(tǒng)學(xué)習(xí)(二)—— 進(jìn)程

第二部分 進(jìn)程概念

引入進(jìn)程的概念

一個(gè)操作系統(tǒng)必然是CPU和I/O設(shè)備協(xié)同工作的一個(gè)過程,如下圖:

CPU和I/O工作示意圖.png

圖上表明铛楣,當(dāng)I/O閑置時(shí)刀荒,CPU高速工作弱左,而當(dāng)I/O變?yōu)楦唠娖絾?dòng)時(shí)窄陡,CPU先等待然后等I/O設(shè)備啟動(dòng)后,CPU繼續(xù)完成其他的工作拆火。這一定程度上造成CPU的使用效率達(dá)不到100%跳夭。

最理想的多任務(wù)模型

示意圖.png

一個(gè)理想情況:

現(xiàn)在內(nèi)存里有兩個(gè)程序A和B。由電平上看们镜,A币叹,B程序也是一會(huì)執(zhí)行CPU指令,一會(huì)執(zhí)行I/O指令模狭。但如果搭配得當(dāng)颈抚,使得A程序執(zhí)行CPU指令時(shí),B程序執(zhí)行I/O指令嚼鹉,協(xié)同搭配贩汉,就可以提高CPU的使用效率九妈,使得其不再等待。

進(jìn)程

進(jìn)程概念

An operating system executes(執(zhí)行) a variety of programs:

  • Batch system - jobs
  • Time-shared systems - user programs or tasks

為什么不能把程序稱之為進(jìn)程

  • different data with same program
  • different program with same data
    上面兩種實(shí)際上都是兩個(gè)進(jìn)程雾鬼。

進(jìn)程定義

Process - a program in execution;process execution must progress in sequential fashion

進(jìn)程有三個(gè)維度的要素:

1.是正在執(zhí)行的程序
2.進(jìn)程執(zhí)行的程序正在處理數(shù)據(jù)
3.進(jìn)程的狀態(tài)。靜止的程序是不運(yùn)行的程序宴树,但它不是一個(gè)進(jìn)程策菜。

進(jìn)程狀態(tài)遷移實(shí)例:

進(jìn)程狀態(tài)遷移實(shí)例.png
  • 有五個(gè)基本狀態(tài):new,ready(一切準(zhǔn)備就緒,只要CPU給指令就可以執(zhí)行),waiting(進(jìn)程還未準(zhǔn)備好),running,terminated(進(jìn)程結(jié)束執(zhí)行).

PCB(進(jìn)程控制塊)

每一個(gè)進(jìn)程都有一個(gè)PCB酒贬,是在內(nèi)存里面駐留的一對(duì)一的又憨,反映相應(yīng)進(jìn)程信息。

進(jìn)程通常與下列信息關(guān)聯(lián):

  • Process state
  • Process number锭吨,進(jìn)程號(hào)蠢莺,必須嚴(yán)格控制每個(gè)進(jìn)程號(hào)不同,是一個(gè)正整數(shù)零如。
  • Program counter(計(jì)算機(jī)中提供要從存儲(chǔ)器中取出的下一個(gè)指令地址的寄存器)
  • CPU registers
  • CPU scheduling information
  • Memory-management information
  • Accounting information
  • I/O status information
  • THAT SPECIFIC TO THE PROCESS(不會(huì)放到程序中去)

進(jìn)程管理:

總的來講躏将,一個(gè)進(jìn)程由一個(gè)PCB塊來控制。而進(jìn)程主要有三個(gè)狀態(tài):就緒狀態(tài)考蕾,等待狀態(tài)和執(zhí)行狀態(tài)祸憋。三種狀態(tài)分別拉成鏈表中隊(duì)列的形式,里面分別有head指針和tail指針肖卧。
我們可以把他們看成就緒隊(duì)列蚯窥,等待隊(duì)列和執(zhí)行隊(duì)列。

Paste_Image.png
  • 就緒的進(jìn)程全部放入一個(gè)隊(duì)列中塞帐。這樣的好處是當(dāng)我要執(zhí)行就緒進(jìn)程時(shí)我只需要關(guān)注這個(gè)隊(duì)列里的進(jìn)程就可以了拦赠,其他的進(jìn)程可以一概不管。
  • 執(zhí)行隊(duì)列葵姥。假設(shè)只有單核CPU的狀態(tài)下荷鼠,則只有一個(gè)進(jìn)程或沒有(CPU空閑)在執(zhí)行。
  • 等待隊(duì)列牌里。比較直觀的設(shè)計(jì)是颊咬,在等待同一個(gè)資源進(jìn)程的時(shí)候,這些進(jìn)程組成一個(gè)隊(duì)列牡辽。如圖tape,disk,terminal三種不同資源組成三個(gè)隊(duì)列喳篇。

思考:操作系統(tǒng)的管理實(shí)際就是把PCB從一個(gè)隊(duì)列放入另外一個(gè)隊(duì)列(遷移)。相當(dāng)于是管理不同的進(jìn)程隊(duì)列态辛。

進(jìn)程調(diào)度隊(duì)列麸澜,動(dòng)態(tài)反應(yīng)操作系統(tǒng)全貌
  • Job queue — 等待進(jìn)入計(jì)算機(jī)系統(tǒng)的待處理任務(wù)
  • Ready queue — 駐留內(nèi)存,準(zhǔn)備就緒奏黑,等待CPU
  • Device queues — 等待I/O設(shè)備的進(jìn)程隊(duì)列
進(jìn)程是如何在隊(duì)列中遷移的
Paste_Image.png
  • 這個(gè)圖強(qiáng)調(diào)Ready queue炊邦,當(dāng)進(jìn)程拿到CPU后编矾,進(jìn)程離開Ready queue,進(jìn)入執(zhí)行隊(duì)列馁害。執(zhí)行進(jìn)程不可能一直占用CPU窄俏,因?yàn)槌绦虮旧沓艘獔?zhí)行,還需要執(zhí)行I/O操作碘菜。當(dāng)執(zhí)行I/O操作時(shí)凹蜈,它需要被轉(zhuǎn)移到其他的I/O請(qǐng)求的隊(duì)列里去,從而與外部設(shè)備進(jìn)行連接(如第二行)忍啸,當(dāng)做完I/O操作以后仰坦,繼續(xù)進(jìn)入ready queue。
  • time slice expired為時(shí)間片计雌,它可以強(qiáng)制剝奪進(jìn)程的CPU使用權(quán)(時(shí)間片用完)悄晃。但之后由于它擁有資源,所以還會(huì)立馬轉(zhuǎn)入ready queue等待下一次獲取CPU凿滤。
  • 第四行則為一個(gè)進(jìn)程創(chuàng)建了一個(gè)子進(jìn)程妈橄。等子進(jìn)程做完以后,才可以喚醒進(jìn)程鸭巴。它有一個(gè)等待狀態(tài)眷细。它等待的資源不是I/O資源,而是等待子進(jìn)程結(jié)束鹃祖。
  • 第五行為進(jìn)程需要等待一個(gè)中斷信號(hào)產(chǎn)生溪椎。中斷信號(hào)發(fā)生,則可以進(jìn)入ready queue恬口。

進(jìn)程上下文切換(Context Switch)

  • CPU任何時(shí)候只能為一個(gè)進(jìn)程服務(wù)
  • 當(dāng)CPU轉(zhuǎn)向?yàn)榱硪粋€(gè)進(jìn)程服務(wù)時(shí)校读,由于CPU內(nèi)部資源(內(nèi)部寄存器)有限,它必須保存原有(轉(zhuǎn)換前)進(jìn)程的狀態(tài)祖能,裝入待服務(wù)(轉(zhuǎn)換后)進(jìn)程的狀態(tài)歉秫,也即“進(jìn)程上下文切換”
  • “狀態(tài)”指寄存器、標(biāo)志位养铸、堆棧等當(dāng)前值雁芙。
  • 上下文切換時(shí)間是一種額外開銷(overhead),因?yàn)槠陂gCPU不做對(duì)用戶進(jìn)程直接有益的事钞螟。
  • 上下文切換時(shí)間決定于CPU硬件支持力度兔甘。

進(jìn)程操作

進(jìn)程創(chuàng)建

  • 父進(jìn)程創(chuàng)建若干子進(jìn)程,后者再創(chuàng)建其子進(jìn)程鳞滨,以此類推洞焙,構(gòu)成了反映“傳承”關(guān)系的一顆進(jìn)程樹。進(jìn)程的運(yùn)行實(shí)際上就是進(jìn)程樹的運(yùn)行。
  • 子進(jìn)程的資源分配類型
    1.子進(jìn)程共享父進(jìn)程的所有資源(UNIX)
    2.子進(jìn)程共享父進(jìn)程的部分資源
    3.子進(jìn)程不從父進(jìn)程共享資源澡匪,重新獨(dú)立申請(qǐng)
  • 執(zhí)行代碼的執(zhí)行順序
    1.父進(jìn)程和子進(jìn)程并發(fā)執(zhí)行
    2.父進(jìn)程在子進(jìn)程執(zhí)行期間等待熔任,待子進(jìn)程執(zhí)行完畢后才恢復(fù)執(zhí)行余下代碼

創(chuàng)建進(jìn)程分三步:
1.申請(qǐng)PCB空間,分配一個(gè)指向PCB的指針唁情。
2.申請(qǐng)一個(gè)唯一的PID號(hào)即進(jìn)程號(hào)疑苔。
3.對(duì)PCB空間每一個(gè)單元賦值。

以UNIX為例進(jìn)行進(jìn)程創(chuàng)建

地址空間中的image
  • 子進(jìn)程Duplicate父進(jìn)程的image甸鸟。
    解釋一下Duplicate:創(chuàng)建一個(gè)與原來進(jìn)程幾乎完全相同的進(jìn)程夯巷,也就是兩個(gè)進(jìn)程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同哀墓,兩個(gè)進(jìn)程也可以做不同的事。
    也即Linux中的fork()函數(shù)喷兼。
  • UNIX的進(jìn)程創(chuàng)建中篮绰,fork系統(tǒng)首先先創(chuàng)建一個(gè)新的(子)進(jìn)程,fork之后季惯,exec系統(tǒng)調(diào)用裝入一個(gè)新程序吠各。
UNIX環(huán)境里創(chuàng)建子進(jìn)程.png
  • 父進(jìn)程fork()一個(gè)子進(jìn)程,子進(jìn)程繼承了父進(jìn)程所有的資源勉抓。
  • 但往往子進(jìn)程不想要父進(jìn)程的資源贾漏,所以調(diào)用system call函數(shù)exec()裝進(jìn)自己新的程序。
  • 當(dāng)子進(jìn)程發(fā)送了exit()藕筋,即中止信號(hào)返回給父進(jìn)程纵散,父進(jìn)程結(jié)束wait狀態(tài),進(jìn)入就緒隊(duì)列隐圾。

一個(gè)具體代碼:

操作系統(tǒng)代碼.png
  • 代碼首先定義Pid類型伍掀,此時(shí)只有一個(gè)進(jìn)程,定義了一個(gè)Pid的局部變量暇藏。
  • 調(diào)用fork()創(chuàng)建子進(jìn)程蜜笤。按照Linux的做法,子進(jìn)程完全繼承父進(jìn)程的一切盐碱。子進(jìn)程和父進(jìn)程唯一不同的是PID號(hào)把兔,同時(shí)兩個(gè)進(jìn)程相互獨(dú)立,子進(jìn)程獨(dú)立執(zhí)行execlp()瓮顽。
  • fork()在返回過程中县好,父進(jìn)程返回值是一個(gè)非0正整數(shù),而這個(gè)正整數(shù)為子進(jìn)程的PID號(hào)趣倾。而子進(jìn)程的返回值為0聘惦,如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值。
  • Pid_t pid在子進(jìn)程不執(zhí)行善绎。因?yàn)楦高M(jìn)程已經(jīng)定義過PID號(hào)黔漂,子進(jìn)程無需重新定義。
  • 最后一個(gè)else父進(jìn)程調(diào)用wait之后會(huì)一直阻塞禀酱,等待子進(jìn)程結(jié)束炬守,父進(jìn)程wait一旦返回則表示子進(jìn)程所有資源已經(jīng)被回收。

進(jìn)程終止

進(jìn)程終止語(yǔ)義之一:

子進(jìn)程執(zhí)行完最后一條指令后剂跟,要求操作系統(tǒng)將自己彈出(exit)减途。語(yǔ)義動(dòng)作含:

  • 子進(jìn)程傳遞數(shù)據(jù)給父進(jìn)程(通過父進(jìn)程的wait操作)。
  • 子進(jìn)程的資源被操作系統(tǒng)收回曹洽。

進(jìn)程終止語(yǔ)義之二:

父進(jìn)程終止子進(jìn)程的執(zhí)行鳍置。有很多原因,一般情況下是子進(jìn)程沒有執(zhí)行完畢就被終止了送淆。
問題:如果父進(jìn)程終止了税产,它的子進(jìn)程怎么辦?
結(jié)論:有些操作系統(tǒng)把這些子進(jìn)程也全部終止(All children terminated - cascading)偷崩。

進(jìn)程間合作

  • 獨(dú)立進(jìn)程不會(huì)影響其它進(jìn)程的執(zhí)行辟拷,也不被影響。
  • 合作進(jìn)程影響其它進(jìn)程阐斜,或者受其影響衫冻。
  • 進(jìn)程間合作是必須的。如共享信息谒出,加速執(zhí)行任務(wù)隅俘,模塊化,方便調(diào)用等笤喳。

經(jīng)典案例:生產(chǎn)者-消費(fèi)者問題

  • 生產(chǎn)者進(jìn)程“生產(chǎn)”出信息考赛,存儲(chǔ)在緩沖區(qū),供消費(fèi)者進(jìn)程“消費(fèi)”莉测。即生產(chǎn)者消費(fèi)者共享緩沖區(qū)颜骤。
Paste_Image.png

我們討論bounded buffer情況,即緩沖區(qū)數(shù)量有限的情況捣卤。此時(shí)考慮:

  • 如果緩沖區(qū)為空忍抽,那么消費(fèi)者無法消費(fèi),無法從緩沖區(qū)取東西董朝。必須等待鸠项。
  • 如果緩沖區(qū)滿了,那么生產(chǎn)者無法生產(chǎn)子姜。生產(chǎn)的東西放不進(jìn)緩沖區(qū)祟绊。

故兩者需要相互關(guān)聯(lián)。

Interprocess Communication(IPC)

進(jìn)程間通信IPC,提供一套進(jìn)程通信牧抽、進(jìn)程同步的機(jī)制嘉熊。
消息系統(tǒng) — 進(jìn)程間相互通信的途徑,不需要有共享變量的介入扬舒。

IPC機(jī)制有2個(gè)最基本的進(jìn)程操作:

  • send(message)
  • receive(message)

變種:

  • send(P,message)— 直接發(fā)給進(jìn)程P
  • receive(Q阐肤,message)— 直接接受來自進(jìn)程Q的消息。

變種:Indirect Communication

  • send(A,message)讲坎,A是郵件服務(wù)器孕惜。
  • receive (A,message)。

★★同步通信VS異步通信

同步通信:

  • 發(fā)送操作send:發(fā)送進(jìn)程等待晨炕,直至接受進(jìn)程確認(rèn)收到消息衫画。
  • 接受操作receive:接受進(jìn)程等待,直至有個(gè)消息到達(dá)瓮栗。

異步通信:

  • 發(fā)送操作send:發(fā)送進(jìn)程發(fā)出消息后立即返回碧磅,該干什么干什么,不理會(huì)消息是否送達(dá)遵馆。
  • 接受操作receive:接受進(jìn)程執(zhí)行一次接受動(dòng)作,要么收到一條有效信息丰榴,要么收到空消息货邓。

舉例:TCP/IP

  • TCP一個(gè)數(shù)據(jù)包發(fā)送以后必須等待接受進(jìn)程確認(rèn)收到消息,因此它較為可靠四濒。
  • IP包發(fā)出去后换况,立即返回。因此其通信性能好盗蟆,速度快戈二。

進(jìn)程之間相互通信表明這些進(jìn)程為協(xié)同進(jìn)程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喳资,一起剝皮案震驚了整個(gè)濱河市觉吭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仆邓,老刑警劉巖鲜滩,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異节值,居然都是意外死亡徙硅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門搞疗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗓蘑,“玉大人,你說我怎么就攤上這事∽螅” “怎么了豌汇?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)业簿。 經(jīng)常有香客問我瘤礁,道長(zhǎng),這世上最難降的妖魔是什么梅尤? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任柜思,我火速辦了婚禮,結(jié)果婚禮上巷燥,老公的妹妹穿的比我還像新娘赡盘。我一直安慰自己,他們只是感情好缰揪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布陨享。 她就那樣靜靜地躺著,像睡著了一般钝腺。 火紅的嫁衣襯著肌膚如雪抛姑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天艳狐,我揣著相機(jī)與錄音定硝,去河邊找鬼。 笑死毫目,一個(gè)胖子當(dāng)著我的面吹牛蔬啡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镀虐,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼箱蟆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了刮便?” 一聲冷哼從身側(cè)響起空猜,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恨旱,沒想到半個(gè)月后抄肖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窖杀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年漓摩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片入客。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡管毙,死狀恐怖腿椎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夭咬,我是刑警寧澤啃炸,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站卓舵,受9級(jí)特大地震影響南用,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掏湾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一裹虫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧融击,春花似錦筑公、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拇涤,卻和暖如春捣作,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹅士。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工券躁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人如绸。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旭贬,于是被迫代替她去往敵國(guó)和親怔接。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容