?
? 我們通過對上篇文章馮諾依曼體系結(jié)構(gòu)對硬件進行講解后, 本篇文章會對進程進行深入講解。同時會講解PCB(進程控制塊)。希望本篇文章內(nèi)容會對你有所幫助。
文章目錄
一、再次理解操作系統(tǒng)
1、1 操作系統(tǒng)的作用
1、2 操作系統(tǒng)的管理
二、進程基本的概念
2、1 什么是進程
2、2 進程控制塊 PCB
2、3?查看Linux上的進程
2、4 再次理解進程?
2、5?task_struct內(nèi)容分類
2、5、1 進程標識符 PID
2、5、2 退出碼
三、總結(jié)?
???♂??作者:@Ggggggtm????♂?
???專欄:Linux從入門到精通???
???標題:進程的基本概念 ??
????寄語:與其忙著訴苦,不如低頭趕路,奮路前行,終將遇到一番好風景???
一、再次理解操作系統(tǒng)
? 在學習進程之前,我們先來理解一下操作系統(tǒng)。我們學習完馮諾依曼體系結(jié)構(gòu)后,知道計算機是由一個個硬件組成的。只有一堆硬件,計算機可以運行起來嗎?答案是不可能的。還需要結(jié)合軟件才能運行起來。例如最重要的軟件:操作系統(tǒng)。
? 前面的文章中我們提到,操作系統(tǒng)是一款管理軟硬件的軟件。我們這里就有很多問題:操作系統(tǒng)是管理哪些軟硬件呢?操作系統(tǒng)為什么要管理呢?操作系統(tǒng)是怎么進行管理的呢?我們接著往下看。
1、1 操作系統(tǒng)的作用
? 我們先來看一張圖:
? 我們用戶是不會直接跟底層的硬件打交道的。首先,新手用戶不懂底層硬件的使用。其次,底層硬件學習起來成本太高。我們所使用的都是可視化界面,一個個軟件。而軟件是怎么跟底層的硬件打交道的呢?原因是中間有一個操作系統(tǒng)。
? 通過上圖我們看到,我們作為用戶都是在向計算機使用簡單操作或發(fā)送許多指令,達到我們使用計算機的目的。而我們的每個操作是要貫穿操作系統(tǒng),操作系統(tǒng)經(jīng)過一系列操作將我們的指令“翻譯”成底層硬件認識的指令,進而送達硬件部分。從這里我們了解到,操作系統(tǒng)有連接上層用戶軟件和下層驅(qū)動和硬件的作用。
? 一個個硬件放在那里是不能運行起來的,他們之間需要產(chǎn)生聯(lián)系。操作系統(tǒng)就是對下要管理好各種驅(qū)動程序和各個硬件資源,為上層的軟件提供一個良好的運行環(huán)境。
1、2 操作系統(tǒng)的管理
? 在上節(jié)圖片中看到,操作系統(tǒng)的主要的四個功能:內(nèi)存管理、進程管理、文件管理、驅(qū)動管理。我們發(fā)現(xiàn),操作系統(tǒng)主要就是進行管理的。那到底是怎么管理的呢?
? 在這里舉一個例子:學校管理學生。當一個學校只有幾個學生時,那這個學校管理起來就很容易,并且可以很容易的記住這幾個學生的所有信息。當學校有幾千名甚至上萬名學生時,管理起來似乎就并沒有那么容易。為了更好的管理學生呢,學校會將所有學生的各種信息、屬性統(tǒng)計起來,放在一張表格中。當需要看某個學生的成績時,直接通過該同學的信息屬性直接篩查出來即可。我們發(fā)現(xiàn)這樣管理似乎就簡單起來了。
? 操作系統(tǒng)的管理也正是如此。對比上述的例子,我們知道操作系統(tǒng)中軟硬件資源多而復(fù)雜(學生很多),為了更好的管理這些軟硬件資源,可以先將這些軟硬件資源進行描述(學生入學填寫各種屬性、信息),再通過各種高效的數(shù)據(jù)結(jié)構(gòu)將他們組織起來(放到一張表格中,需要時可通過篩查直接找到)。
? 通過上面的描述,我們總結(jié)管理其實就是先描述,后組織。這里我們再引入進程。那操作系統(tǒng)是怎么對進程進行管理的呢?我們可以直接理解操作系統(tǒng)是對進程先進行描述,再把進程組織起來。我們接下來進入我們主題:進程。
二、進程基本的概念
2、1 什么是進程
? 我們在自己電腦上任務(wù)管理器下就可以查看進程,如下圖:
? 那到底什么是進程呢?
? 我們在很多地方可能看到:加載到內(nèi)存中的程序,就是進程。這種概念是正確的嗎?我們不妨先接著往下探索一下。
2、2 進程控制塊 PCB
? 在學習進程中,我們都知道每個進程都會有一個PCB。為什么呢?PCB又是什么呢?
? 我們上述提到了,操作系統(tǒng)對進程的管理就是先描述,后組織。怎么對進程進行描述的呢?答案就是:進程控制塊PCB是對進程描述的一個結(jié)構(gòu)體。這里我們知道了PCB是用來描述進程的一個結(jié)構(gòu)體。是為了我們后面對進程更好的組織和管理。
? 在Linux下描述進程的PCB是task_struct。有很多同學會在這里有點搞不清楚了。PCB和task_struct到底是什么關(guān)系呢?這里給大家舉一個例子:在現(xiàn)實生活中,我們都知道相親都靠媒婆。你可能也認識幾個媒婆,例如你的鄰居王阿姨就是媒婆,我們也叫她為王婆。媒婆是一個統(tǒng)稱,王婆就是媒婆中的一個具體的人。同樣,PCB是進程控制塊的統(tǒng)稱,task_struct就是PCB中的具體的一種進程控制塊。我們知道PCB是描述進程的一個結(jié)構(gòu)體,
那么這個結(jié)構(gòu)體中都有進程的哪些屬性呢?我們接著往下看。
2、3?查看Linux上的進程
? 我們在上面了解到進程后,我們不妨在Linux下查看一下進程。我們先在Linxu下寫一個C語言代碼,代碼如下:
#include<stdio.h> int main() { while(1) { sleep(1); printf("hello OS,pid"; } return 0; }
? 我們寫的是一段無限循環(huán)的代碼。是為了我們后面可以更好的觀察進程。我們編譯生成 myporc 的可執(zhí)行程序。查看進程的指令是:ps axj | head -1 && ps axj | grep "proc"。我們可看下圖一起理解:
?當我們結(jié)束程序后,我們就會發(fā)現(xiàn)進程中就不再有該程序,如下圖:
? ?我們曾經(jīng)所有運行創(chuàng)建的程序,本質(zhì)上都是在內(nèi)村上創(chuàng)建進程。
2、4 再次理解進程?
? 問題回溯:加載到內(nèi)存中的程序,就是進程嗎?
? 這里舉個例子:在清華大學里面的學生就算是清華大學的學生嗎?你可能會說是的。那么問題來了。我現(xiàn)在確實是一個河北省的大學生,我現(xiàn)在坐個火車來到清華了,我就是清華的學生了嗎?想得美ovo!是清華的學生就應(yīng)該有清華的學生證。
? 加載到內(nèi)存中的程序也是一樣,程序確實是程序,但不能稱它為進程。我們上面學到了為更好的控制進程,我們還有PCB來描述進程。加載到內(nèi)存中的程序,就是進程這個說法并不準確。我們目前可理解進程=程序文件內(nèi)容+維護進程相關(guān)的數(shù)據(jù)結(jié)構(gòu)。我們可結(jié)合下圖理解:
? PCB就是操作系統(tǒng)給每個進程提供的。在Linux上就會自動創(chuàng)建出struct task_struct{} 結(jié)構(gòu)體。task_struct就會包含了進程的所有屬性和信息。
? 有同學就會有所疑惑:操作系統(tǒng)到底在哪里呢?注意:操作系統(tǒng)也是一款軟件。當我們開機時,我們相當于就是啟動了操作系統(tǒng)這款軟件,相關(guān)內(nèi)容數(shù)據(jù)就會加載到了內(nèi)存中。當然,操作系統(tǒng)也會有其對應(yīng)的PCB。只不過操作系統(tǒng)這款軟件的功能較為強大。
? 當有多個進程時,操作系統(tǒng)就會用搞笑的數(shù)據(jù)結(jié)構(gòu)將它們組織起來,以便后續(xù)的更好的管理。
? 當我們知道進程中還包含了task_struct后,CPU拿數(shù)據(jù)時,是直接找程序的內(nèi)容數(shù)據(jù),還是找task_struct呢??答案是找task_struct。我們看下圖:
?
? 如上,假如內(nèi)存中有6個進程。其中每個進程的PCB都有特殊的聯(lián)系,也就是操作系統(tǒng)見他們組織起來了。CPU拿數(shù)據(jù)時,會直接找對應(yīng)進程task_struct,這樣會更加高效。為什么呢?因為task_struct中包含了指向內(nèi)容數(shù)據(jù)的指針,找到了進程對應(yīng)的task_struct就可以找到對應(yīng)的內(nèi)容數(shù)據(jù)!到這里我們知道了PCB中包含了對應(yīng)的內(nèi)容數(shù)據(jù)指針。還有呢?
2、5?task_struct內(nèi)容分類
? task_struct中包含的內(nèi)容很多,在這里給大家列出主要的內(nèi)容:
- 標示符: 描述本進程的唯一標示符,用來區(qū)別其他進程。
- 狀態(tài): 任務(wù)狀態(tài),退出代碼,退出信號等。
優(yōu)先級: 相對于其他進程的優(yōu)先級。 程序計數(shù)器: 程序中即將被執(zhí)行的下一條指令的地址。 內(nèi)存指針: 包括程序代碼和進程相關(guān)數(shù)據(jù)的指針,還有和其他進程共享的內(nèi)存塊的指針。 上下文數(shù)據(jù): 進程執(zhí)行時處理器的寄存器中的數(shù)據(jù)。 I/O狀態(tài)信息: 包括顯示的I/O請求,分配給進程的I/O設(shè)備和被進程使用的文件列表。 記賬信息: 可能包括處理器時間總和,使用的時鐘數(shù)總和,時間限制,記賬號等。 其他信息。? 這里標識符下面會對齊詳解。狀態(tài)有運行狀態(tài),阻塞狀態(tài)等等。退出碼也會在下發(fā)進行詳解。程序計數(shù)器也就是PC指針,該指針存儲的是下條指令的地址。內(nèi)存指針我們上面提到了。上下文數(shù)據(jù)和記賬信息會另寫一篇文章對其進行詳解,因為上下文數(shù)據(jù)相對復(fù)雜,也比較重要。I/O狀態(tài)信息我們可簡單理解為輸入輸出信息狀態(tài)及請求。注意:并不是你在控制I/O,也不是你所寫的代碼在控制I/O,而是進程在控制I/O。
2、5、1 進程標識符 PID
? 進程標識符PID就是唯一標示一個進程。我們這里有一個函數(shù)getpid()可以直接返回進程的PID,如下圖:
? 我們可結(jié)合下面例子一起理解一下。代碼如下:
#include<stdio.h> #include<sys/types.h> #include<unistd.h> int main() { while(1) { sleep(1); printf("hello OS,pid:%d\n",getpid()); } return 0; }
? 運行結(jié)果如下圖:
? 當然,我們也可通過此PID找到該進程,指令為:ps ajx | grep 16940。結(jié)果如下:
? 我們也可通過 kill 指令來終止該進程,指令:kill -9 16940。結(jié)果如下圖:
? 一個進程也是有父進程的,可通過getppid()函數(shù)獲得父進程的PPID。一般在命令行上運行的命令,其父進程基本上都為bash。
2、5、2 退出碼
? 你有沒有想過,在我們所寫的代碼中,為什么最后都會有一句 return 0呢?return 100 可以嗎?這里的 return 的數(shù)據(jù)就是我們程序結(jié)束的結(jié)束碼,查看結(jié)束嗎的指令為:echo $?。具體如下圖:
? ?注意,echo $? 是指的最近一次的退出碼。又如下圖:
文章來源:http://www.zghlxwxcb.cn/news/detail-445507.html
三、總結(jié)?
? 本篇文章的內(nèi)容就講解到這里。我們來稍微總結(jié)一下:我們在講述進程之前,是學習了馮諾依曼體系結(jié)構(gòu)和操作系統(tǒng)管理,是我們理解起來進程更加容易。而不是突然蹦出來一個概念,顯得枯燥難理解。當然,進程中還有很多細節(jié),包括我們還沒有講解上下文數(shù)據(jù),后面都會給大家解釋。進程是一個十分重要的概念,對我們后面的學習也很重要,我們需要反復(fù)閱讀,查閱資料去理解進程概念。也希望本篇文章會對你有所幫助,讓你有所收獲。?文章來源地址http://www.zghlxwxcb.cn/news/detail-445507.html
到了這里,關(guān)于【Linux從入門到精通】進程的基本概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!