全面剖析《自己动手写操作系统》第六章---进程
轉(zhuǎn)載請標(biāo)注:http://blog.csdn.net/zgh1988/article/details/7371754
在一開始學(xué)習(xí)進(jìn)程的時候,我們大概每個人都會遇到過這樣的問題,下面就讓我們帶著這些問題來認(rèn)識認(rèn)識進(jìn)程。
1、進(jìn)程是什么?
2、什么是多進(jìn)程?
3、執(zhí)行一個進(jìn)程需要什么?
4、多進(jìn)程之間是如何調(diào)度的?
5、進(jìn)程的上下文環(huán)境是什么?
6、如何創(chuàng)建一個新的進(jìn)程?
一、進(jìn)程是什么?
? ? 大家在面試時,有時候會被HR問到這么一道題目:程序與進(jìn)程有什么區(qū)別?
如果讓我們通過生硬的概念來回答HR,往往會令HR失望。下面我想通過一個生活中的場景來回答HR這個問題。
周末,張先生想為他心愛的老婆做一道菜---牛肉排骨湯,他有做這道菜的菜譜,廚房里也有牛肉排骨,味精,香料等,張先生就按著菜譜一步步得為他的老婆做好了這道菜---牛肉排骨湯,他的老婆很高興,感覺很幸福。
在這個比喻中,做牛肉排骨躺的菜譜就是程序,張先生應(yīng)該就算是處理機(jī)(CPU),做這道菜的各種原料(牛肉排骨,大蔥等)就是輸入數(shù)據(jù),一盤香噴噴的牛肉排骨湯則是輸出數(shù)據(jù),進(jìn)程就是張先生按著菜譜做好這道菜的整系列動作的總和。
于是我們知道,程序是一個靜態(tài)的,進(jìn)程是用來描述動態(tài)的過程的。
二、什么是多進(jìn)程?
? ? 大家都知道,現(xiàn)在的操作系統(tǒng)都是支持多進(jìn)程的,即一個CPU可以支持多個進(jìn)程。這個又是什么情況?讓我來修改一下上面的場景。
周末,張先生想為他心愛的老婆做一道菜---牛肉排骨湯,他有做這道菜的菜譜,廚房里也有牛肉排骨,味精,香料等,張先生開始做牛肉排骨湯,做著做著,他的兒子的手被刀子劃破了,哭著跑到爸爸這里來訴苦,這時候,張先生停下手里的活,在菜譜上記下自己做到了哪里,然后拿出一本急救手冊,按著上面的指示,把兒子的手傷包扎好之后,他回到廚房繼續(xù)做自己的牛肉排骨湯。
在這個場景中,就包含了兩個進(jìn)程,進(jìn)程一是做牛肉排骨湯,進(jìn)程二是為兒子包扎傷口。
張先生(CPU)先是執(zhí)行的進(jìn)程一,在進(jìn)程一還米有結(jié)束之前,暫停進(jìn)程一,去執(zhí)行了進(jìn)程二。執(zhí)行完進(jìn)程二,回到繼續(xù)執(zhí)行進(jìn)程一,直至進(jìn)程一結(jié)束。這個過程就成為進(jìn)程之間的"切換"。
下面我們通過一張圖片來介紹多進(jìn)程之間的關(guān)系:
圖(a):一個包含4個進(jìn)程的進(jìn)程表
圖(b):4個進(jìn)程是完全獨(dú)立的
圖(c):4個進(jìn)程進(jìn)行切換,但任意時刻只有一個進(jìn)程在運(yùn)行
由此,我們得知,進(jìn)程,從宏觀上來說,有自己的目標(biāo),又受控于進(jìn)程調(diào)度模塊的控制。從微觀上來說,有自己的代碼和數(shù)據(jù),同時也擁有自己的堆棧。但又利用系統(tǒng)的資源。
三、執(zhí)行一個進(jìn)程需要什么?
每個進(jìn)程包含自己的代碼,數(shù)據(jù),和堆棧,并且都服從進(jìn)程調(diào)度模塊進(jìn)行調(diào)度。
四、多進(jìn)程之間是如何調(diào)度的?
多進(jìn)程之間的調(diào)度是由進(jìn)程調(diào)度模塊來完成的。我們首先需要了解進(jìn)程的狀態(tài),下圖為3種狀態(tài)之間的關(guān)系:
在本書中,作者只介紹的是2、3,即就緒--運(yùn)行--就緒之間的轉(zhuǎn)換關(guān)系。其中條件2是調(diào)度模塊選擇其中某一個進(jìn)程運(yùn)行。
條件3是時鐘中斷發(fā)生,調(diào)度模塊將正在運(yùn)行的進(jìn)程調(diào)入到就緒隊(duì)列。
五、進(jìn)程的上下文環(huán)境是什么?
? ? 在張先生去為兒子包扎傷口時,他需要在菜譜上記錄下自己做牛肉排骨湯做到什么地方,以便回來之后繼續(xù)做。同理,操作系統(tǒng)在進(jìn)行系統(tǒng)切換時,也同樣要記錄下該進(jìn)程的上下文環(huán)境。
于是我們創(chuàng)建了一個數(shù)據(jù)結(jié)構(gòu)--進(jìn)程控制塊(ProcessControl Block),它主要包括以下幾方面信息:
1、進(jìn)程標(biāo)識符 name:每個進(jìn)程都必須有一個唯一的標(biāo)識符,可以是字符串,也可以是一個數(shù)字。
2、進(jìn)程當(dāng)前狀態(tài) status:說明進(jìn)程當(dāng)前所處的狀態(tài)。為了管理的方便,系統(tǒng)設(shè)計時會將相同的狀態(tài)的進(jìn)程組成一個隊(duì)列,如就緒進(jìn)程隊(duì)列,阻塞進(jìn)程則要根據(jù)等待的事件組成多個等待隊(duì)列,如等待打印機(jī)隊(duì)列、等待磁盤I/O完成隊(duì)列等等。
3、進(jìn)程相應(yīng)的程序和數(shù)據(jù)地址,以便把PCB與其程序和數(shù)據(jù)聯(lián)系起來。
4、進(jìn)程資源清單。列出所擁有的除CPU外的資源記錄,如擁有的I/O設(shè)備,打開的文件列表等。
5、進(jìn)程優(yōu)先級 priority:進(jìn)程的優(yōu)先級反映進(jìn)程的緊迫程度,通常由用戶指定和系統(tǒng)設(shè)置。
6、CPU現(xiàn)場保護(hù)區(qū) cpustatus:當(dāng)進(jìn)程因某種原因不能繼續(xù)占用CPU時(如等待打印機(jī)),釋放CPU,這時就要將CPU的各種狀態(tài)信息保護(hù)起來,為將來再次得到處理機(jī)恢復(fù)CPU的各種狀態(tài),繼續(xù)運(yùn)行。
7、進(jìn)程同步與通信機(jī)制 用于實(shí)現(xiàn)進(jìn)程間互斥、同步和通信所需的信號量等。
8、進(jìn)程所在隊(duì)列PCB的鏈接字 根據(jù)進(jìn)程所處的現(xiàn)行狀態(tài),進(jìn)程相應(yīng)的PCB參加到不同隊(duì)列中。PCB鏈接字指出該進(jìn)程所在隊(duì)列中下一個進(jìn)程PCB的首地址。
9、與進(jìn)程有關(guān)的其他信息。 如進(jìn)程記賬信息,進(jìn)程占用CPU的時間等。
每個進(jìn)程有自己的進(jìn)程控制塊,我們將這些進(jìn)程控制塊組織到一起,存儲在一個叫進(jìn)程表(Process Table)的結(jié)構(gòu)數(shù)組中。
在本書中,本著簡單實(shí)用的原則,我們的進(jìn)程控制塊只包含了進(jìn)程標(biāo)識符,CPU現(xiàn)場保護(hù)(即寄存器的內(nèi)容),還有局部描述符。程序內(nèi)容如下:
/* 寄存器 */ typedef struct s_stackframe {t_32 gs; t_32 fs; t_32 es; t_32 ds; t_32 edi; t_32 esi; t_32 ebp; t_32 kernel_esp;t_32 ebx; t_32 edx; t_32 ecx; t_32 eax; t_32 retaddr; t_32 eip; t_32 cs; t_32 eflags; t_32 esp; t_32 ss; }STACK_FRAME;/* PCB進(jìn)程控制塊 */ typedef struct s_proc {STACK_FRAME regs; /* 寄存器 */t_16 ldt_sel; /* LDT選擇子 */DESCRIPTOR ldts[LDT_SIZE]; /* LDTs */t_32 pid; /* 進(jìn)程號 */char p_name[16]; /* 名字 */ }PROCESS;六、如何創(chuàng)建一個新的進(jìn)程?
? ? 首先我們要申請一個進(jìn)程控制塊(PCB),然后為新的進(jìn)程分配資源(本程序內(nèi)為堆棧),繼而初始化進(jìn)程控制塊,最后將隊(duì)列加入就緒隊(duì)列(本程序即進(jìn)程表)。
? ? 在本程序內(nèi),我們是這樣做到的
全面剖析《自己動手寫操作系統(tǒng)》第五章--makefile?http://blog.csdn.net/zgh1988/article/details/7338380
全面剖析《自己動手寫操作系統(tǒng)》第五章---加載內(nèi)核kernel.bin?http://blog.csdn.net/zgh1988/article/details/7329941
全面剖析《自己動手寫操作系統(tǒng)》第五章---Red Hat 9.0 的安裝過程 ?http://blog.csdn.net/zgh1988/article/details/7315676
全面剖析《自己動手寫操作系統(tǒng)》第四章---FAT12文件系統(tǒng)?http://blog.csdn.net/zgh1988/article/details/7284834
全面剖析《自己動手寫操作系統(tǒng)》第四章---加載Loader.bin?http://blog.csdn.net/zgh1988/article/details/7291909
全面剖析《自己動手寫操作系統(tǒng)》第三章---進(jìn)入保護(hù)模式? ?http://blog.csdn.net/zgh1988/article/details/7098981
全面剖析《自己動手寫操作系統(tǒng)》第三章---“實(shí)模式--保護(hù)模式--實(shí)模式”?http://blog.csdn.net/zgh1988/article/details/7255804
全面剖析《自己動手寫操作系統(tǒng)》第三章---堆棧段的工作方式?http://blog.csdn.net/zgh1988/article/details/7256254
全面剖析《自己動手寫操作系統(tǒng)》第三章---特權(quán)級以及不同特權(quán)級代碼段之間的跳轉(zhuǎn)?http://blog.csdn.net/zgh1988/article/details/7262901
全面剖析《自己動手寫操作系統(tǒng)》第三章---分頁機(jī)制?http://blog.csdn.net/zgh1988/article/details/7270748
全面剖析《自己動手寫操作系統(tǒng)》第三章---中斷機(jī)制?http://blog.csdn.net/zgh1988/article/details/7276259
全面剖析《自己動手寫操作系統(tǒng)》第二章http://blog.csdn.net/zgh1988/article/details/7062065
全面剖析《自己動手寫操作系統(tǒng)》第一章http://blog.csdn.net/zgh1988/article/details/7060032
《自己動手寫操作系統(tǒng)》讀后感http://blog.csdn.net/zgh1988/article/details/7059936
?
總結(jié)
以上是生活随笔為你收集整理的全面剖析《自己动手写操作系统》第六章---进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2409):vs code自定
- 下一篇: GY歌谣之读懂每行代码(飞智) 2020