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