国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站制作與網(wǎng)頁設(shè)計seo公司軟件

網(wǎng)站制作與網(wǎng)頁設(shè)計,seo公司軟件,網(wǎng)站構(gòu)建的滾動新聞怎么做,去除wordpress 廣告插件這篇文章談?wù)刲inux中的進(jìn)程管理。 一周爆肝,創(chuàng)作不易,望支持! 希望對大家有所幫助!記得收藏! 要理解進(jìn)程管理,重要的是周邊問題,一定要知其然,知其所以然??聪路侥夸浘椭蓝际歉韶洝?article class="baidu_pl">

這篇文章談?wù)?span style="background-color:#dad5e9;">linux中的進(jìn)程管理。

一周爆肝,創(chuàng)作不易,望支持!

希望對大家有所幫助!記得收藏

要理解進(jìn)程管理,重要的是周邊問題,一定要知其然,知其所以然???span style="background-color:#6eaad7;">下方目錄就知道都是干貨!

目錄

1.什么是進(jìn)程管理?

2.為什么要有進(jìn)程管理?

3.如何對進(jìn)程進(jìn)行管理?

(1)描述進(jìn)程

(2)組織進(jìn)程

4.查看系統(tǒng)中的進(jìn)程

(1)命令查看

(2)文件查看

5.創(chuàng)建進(jìn)程的兩種方式

(1)./運行一個程序

(2)通過代碼創(chuàng)建

6.父子進(jìn)程與fork()

(1)父子關(guān)系

(2)系統(tǒng)調(diào)用fork()

(3)fork()原理

1.fork()干了什么事?

2.為什么fork()會有兩個返回值?

3.為什么fork()給父進(jìn)程返回子進(jìn)程pid,給子進(jìn)程返回0?

4.fork()之后,父子進(jìn)程誰先運行?

5.如何理解同一個變量會有不同的值?

6.重新理解fork()

7.進(jìn)程狀態(tài)

(1)一般操作系統(tǒng)的進(jìn)程狀態(tài)

1.運行狀態(tài)

2.阻塞狀態(tài)

3.阻塞掛起和swap分區(qū)

(2)linux的進(jìn)程狀態(tài)

linux進(jìn)程的休眠狀態(tài)

linux僵尸進(jìn)程和孤兒進(jìn)程

8.進(jìn)程狀態(tài)切換

CUP運行隊列中的進(jìn)程如何調(diào)度?

9.進(jìn)程的性質(zhì)

1.進(jìn)程的競爭性

2.進(jìn)程的獨立性

3.進(jìn)程的并行、并發(fā)

10.進(jìn)程的優(yōu)先級和時間片

11.進(jìn)程間切換

12.linux內(nèi)核2.61CPU運行隊列窺視(綜合理解!)


1.什么是進(jìn)程管理?

OS內(nèi)核中有內(nèi)存管理,進(jìn)程管理,文件管理,驅(qū)動管理,OS將這四樣管理起來才基本可以實現(xiàn)硬件和數(shù)據(jù)的自由調(diào)控,才可成為一個優(yōu)質(zhì)內(nèi)核。

2.為什么要有進(jìn)程管理?

要知道為什么要有進(jìn)程管理,首先要知道進(jìn)程是什么東西,這里給出進(jìn)程的定義

進(jìn)程的定義程序的一個執(zhí)行實例,加載到內(nèi)存中的程序,即正在執(zhí)行的程序。進(jìn)程是操作系統(tǒng)執(zhí)行任務(wù)的基本單元,也是分配資源、處理數(shù)據(jù)和被調(diào)度的基本單元。更加通俗的理解:操作系統(tǒng)要做事情,進(jìn)程就是一件又一件的"事情"

3.如何對進(jìn)程進(jìn)行管理?

在哲學(xué)的范疇,管理的本質(zhì)對數(shù)據(jù)的管理,而非對具體對象的管理。管理的策略是先描述,再組織。即先將被管理對象進(jìn)行建模描述為抽象類型,再想好如何將每個被管理對象組織起來。

操作系統(tǒng)對進(jìn)程的管理也是如此:

描述進(jìn)程、組織進(jìn)程

(1)描述進(jìn)程

在操作系統(tǒng)中,經(jīng)常將描述進(jìn)程的類稱為PCB(process?control block)。進(jìn)程的屬性有很多:比如pid,ppid(父進(jìn)程pid),stat(進(jìn)程狀態(tài)),進(jìn)程優(yōu)先級等等。后續(xù)慢慢學(xué)習(xí)······

struct PCB
{int pid;int ppid;int stat;......
};

(2)組織進(jìn)程

進(jìn)程的組織就是用高效的數(shù)據(jù)結(jié)構(gòu)將進(jìn)程對象組織起來,操作系統(tǒng)一般用雙向鏈表將進(jìn)程的PCB對象組織起來。

4.查看系統(tǒng)中的進(jìn)程

(1)命令查看

ps ajx //查看當(dāng)前所有進(jìn)程
ps ajx | head -1 && ps ajx | grep mybin//查看指定進(jìn)程mybin

(2)文件查看

根目錄下的proc目錄中有當(dāng)前存在的所有進(jìn)程,因此這個目錄是動態(tài)的。

這個目錄里的各個數(shù)字目錄,就是以各個進(jìn)程的pid命名的。目錄里面放的就是進(jìn)程PCB對象的各種屬性。?

5.創(chuàng)建進(jìn)程的兩種方式

(1)./運行一個程序

本質(zhì)將磁盤上的可執(zhí)行程序代碼和數(shù)據(jù)拷貝到內(nèi)存當(dāng)中,為這個進(jìn)程創(chuàng)建PCB對象,將PCB對象鏈入內(nèi)存中管理PCB對象的雙鏈表中。(重點)

(2)通過代碼創(chuàng)建

使用fork()函數(shù)創(chuàng)建當(dāng)前進(jìn)程的子進(jìn)程。

6.父子進(jìn)程與fork()

(1)父子關(guān)系

進(jìn)程是有父子關(guān)系的,在一個進(jìn)程中創(chuàng)建出新的進(jìn)程,這個新的進(jìn)程就被叫做那個進(jìn)程的子進(jìn)程。那個進(jìn)程叫做新的進(jìn)程父進(jìn)程。

(2)系統(tǒng)調(diào)用fork()

fork()是一個進(jìn)程通過代碼創(chuàng)建子進(jìn)程的時候,所調(diào)用的系統(tǒng)接口。通過fork()函數(shù),在fork()下一行處會創(chuàng)建一個子進(jìn)程,這個子進(jìn)程和父進(jìn)程共同執(zhí)行接下來的代碼。

如圖:

./mybin運行之后?

體現(xiàn)出了fork()之后,?子進(jìn)程和父進(jìn)程兩個執(zhí)行流分別執(zhí)行接下來的代碼。

fork()函數(shù)

頭文件#include<unistd.h>

返回值:父進(jìn)程返回子進(jìn)程pid,子進(jìn)程返回0。

(3)fork()原理

1.fork()干了什么事?

現(xiàn)象:fork()是系統(tǒng)接口,fork()之后會為父進(jìn)程創(chuàng)建子進(jìn)程,父子進(jìn)程兩個執(zhí)行流共同執(zhí)行fork()之后的代碼。

本質(zhì):進(jìn)程的創(chuàng)建,本質(zhì)是將可執(zhí)行程序代碼和數(shù)據(jù)加載到內(nèi)存中,創(chuàng)建PCB對象,再將PCB對象鏈接到管理PCB對象的雙向鏈表中。父進(jìn)程中使用fork()創(chuàng)建進(jìn)程本質(zhì)是以父進(jìn)程PCB為模板創(chuàng)建子進(jìn)程PCB,由于子進(jìn)程沒有從磁盤中加載代碼和數(shù)據(jù),子進(jìn)程的PCB只能指向父進(jìn)程的代碼和數(shù)據(jù),因此父子進(jìn)程共享代碼子進(jìn)程可以看到父進(jìn)程的全部代碼,由于進(jìn)程的獨立性,數(shù)據(jù)會以寫時拷貝的方式給到子進(jìn)程。

2.為什么fork()會有兩個返回值?

fork()函數(shù)在return x 之前,子進(jìn)程就被創(chuàng)建出來了,所以不要把fork()看成一個整體,return之后父子進(jìn)程兩個執(zhí)行流共同執(zhí)行接下來的代碼,return也被父子進(jìn)程以不同的值返回兩次。

3.為什么fork()給父進(jìn)程返回子進(jìn)程pid,給子進(jìn)程返回0?

給父進(jìn)程返回子進(jìn)程的pid,是為了讓父進(jìn)程較好的控制管理子進(jìn)程,所以返回子進(jìn)程的pid讓父進(jìn)程進(jìn)行控制。子進(jìn)程只需要確認(rèn)自己創(chuàng)建成功與否,所以返回0。

4.fork()之后,父子進(jìn)程誰先運行?

fork()后,父子進(jìn)程都會進(jìn)入CPU的執(zhí)行隊列中被調(diào)度,需要依賴進(jìn)程PCB的調(diào)度優(yōu)先級和調(diào)度器算法。

5.如何理解同一個變量會有不同的值?

父子進(jìn)程共享代碼,但是要保證進(jìn)程的獨立性數(shù)據(jù)不能共享,所以數(shù)據(jù)會以寫時拷貝的方式拷貝給子進(jìn)程,return兩個值本質(zhì)是寫兩次數(shù)據(jù),子進(jìn)程的數(shù)據(jù)就要寫時拷貝。因此父子進(jìn)程都有自己存儲返回值的變量。

6.重新理解fork()

7.進(jìn)程狀態(tài)

(1)一般操作系統(tǒng)的進(jìn)程狀態(tài)

進(jìn)程的狀態(tài)指的是一個進(jìn)程處在內(nèi)存中某個PCB隊列中所體現(xiàn)出來的狀態(tài)。進(jìn)程的狀態(tài)是為了更好的讓操作系統(tǒng)得知每個進(jìn)程的實時情況所設(shè)定的。進(jìn)程可以在很多PCB隊列中進(jìn)行排隊。進(jìn)程狀態(tài)是PCB中的一個屬性,是一個int類型的值,來表示這個進(jìn)程目前的狀態(tài)。

1.運行狀態(tài)

我們把進(jìn)程的PCB在CPU的運行隊列中排隊的狀態(tài)認(rèn)定為運行狀態(tài)。在CPU運行隊列的進(jìn)程準(zhǔn)備被調(diào)度(取決于調(diào)度器算法)。

2.阻塞狀態(tài)

當(dāng)我們的進(jìn)程在CPU的運行隊列中被調(diào)度的時候,這個進(jìn)程開始讓CPU來執(zhí)行它的可執(zhí)行程序,這個可執(zhí)行程序勢必或多或少會訪問到操作系統(tǒng)中的軟硬件資源,如果此時要訪問的軟硬件資源還沒有到位,那么這個進(jìn)程的PCB就會從CPU的運行隊列上剝離,去到軟硬件資源的等待隊列中排隊,此時這個進(jìn)程的狀態(tài)被設(shè)置為阻塞狀態(tài)

3.阻塞掛起和swap分區(qū)

硬件阻塞

當(dāng)我們的進(jìn)程處于阻塞狀態(tài),進(jìn)程的PCB在對應(yīng)軟硬件資源的等待隊列中排隊,此時這個進(jìn)程的代碼數(shù)據(jù)和PCB都在內(nèi)存中占用著資源,但是這個進(jìn)程暫時不需要被調(diào)度,如果此時操作系統(tǒng)的內(nèi)存資源嚴(yán)重不足,就會把這個進(jìn)程的代碼和數(shù)據(jù)交換到磁盤中的swap分區(qū)中,為內(nèi)存騰出空間。此時進(jìn)程就處于阻塞掛起狀態(tài)。當(dāng)軟硬件資源就緒時,操作系統(tǒng)再把這部分代碼和數(shù)據(jù)喚回內(nèi)存中,此時進(jìn)程再從軟硬件資源的等待隊列中剝離到CPU的運行隊列中排隊。

軟件阻塞

用linux調(diào)試代碼工具gdb來解釋一下就是,gdb在調(diào)試程序的過程中要根據(jù)斷點來追蹤、暫停進(jìn)程,要想調(diào)試一個程序的代碼,gdb和這個程序必須都加載到內(nèi)存當(dāng)中成為進(jìn)程,CPU執(zhí)行代碼遇到斷點進(jìn)程就被阻塞了,需要等待gdb這個進(jìn)程的繼續(xù)操作,此時這個進(jìn)程就需要等待軟件資源gdb的響應(yīng),而gdb又要等待諸如鍵盤的響應(yīng),所以進(jìn)程的PCB到gdb這個進(jìn)程的PCB里的等待隊列里排隊,gdb這個進(jìn)程PCB又到鍵盤的等待隊列里排隊。當(dāng)鍵盤響應(yīng)gdb,gdb的PCB又到CPU的運行隊列里排隊,待調(diào)試代碼的進(jìn)程也到CPU的運行隊列里排隊。

(2)linux的進(jìn)程狀態(tài)

linux進(jìn)程狀態(tài)主要有一下幾種:

static const char * const task_state_array[] =
{"R (running)", /* 0 */  //運行狀態(tài)"S (sleeping)", /* 1 */   //休眠狀態(tài)"D (disk sleep)", /* 2 */   //深度休眠狀態(tài)"T (stopped)", /* 4 */    //暫停狀態(tài)"t (tracing stop)", /* 8 */   //追蹤暫停狀態(tài)"X (dead)", /* 16 */    //死亡狀態(tài)"Z (zombie)", /* 32 */   //僵尸狀態(tài)
};
linux進(jìn)程的休眠狀態(tài)

本質(zhì)就是阻塞狀態(tài)(可以隨時被終止)。這里還有一個深度休眠狀態(tài)disk sleep(磁盤休眠)。當(dāng)一個進(jìn)程在向磁盤上寫入數(shù)據(jù)的時候,這個進(jìn)程需要等待磁盤寫入完畢,并把寫入結(jié)果返回給進(jìn)程PCB,由于這個過程中進(jìn)程不可被終止(防止數(shù)據(jù)丟失)此時這個進(jìn)程的狀態(tài)就是深度休眠狀態(tài)。

linux僵尸進(jìn)程和孤兒進(jìn)程

當(dāng)一個進(jìn)程的可執(zhí)行程序已經(jīng)在CPU上跑完了,這個進(jìn)程的生命周期就結(jié)束了,此時操作系統(tǒng)會先將這個進(jìn)程的代碼和數(shù)據(jù)進(jìn)行釋放,暫時不會釋放這個進(jìn)程的PCB。為什么?由于進(jìn)程退出時的退出信息會保存在進(jìn)程的PCB中,而操作性系統(tǒng)或者父進(jìn)程要得知進(jìn)程的退出原因(任務(wù)完成情況),所以要在父進(jìn)程或者操作系統(tǒng)讀取到退出信息之后,進(jìn)程才能完全銷毀,將進(jìn)程PCB也釋放。linux規(guī)定:進(jìn)程在退出后,進(jìn)程的PCB還沒有被父進(jìn)程或者操作系統(tǒng)讀取到,進(jìn)程還沒有完全退出的進(jìn)程狀態(tài)僵尸狀態(tài)。如果進(jìn)程一直處于僵尸狀態(tài),會導(dǎo)致內(nèi)存泄露的問題。

上面所說,進(jìn)程在退出時,PCB是由父進(jìn)程來回收的。那么,如果進(jìn)程退出前,父進(jìn)程就已經(jīng)退出了,那這個進(jìn)程的PCB就沒有相應(yīng)的進(jìn)程來回收了,此時進(jìn)程的狀態(tài)成為孤兒狀態(tài)。

8.進(jìn)程狀態(tài)切換

切換本質(zhì) : 進(jìn)程的狀態(tài)切換,本質(zhì)就是進(jìn)程的PCB不同隊列中做不停的跳轉(zhuǎn)。

CUP運行隊列中的進(jìn)程如何調(diào)度?

9.進(jìn)程的性質(zhì)

1.進(jìn)程的競爭性

系統(tǒng)進(jìn)程眾多,而CPU資源只有少數(shù),甚至一個,所以進(jìn)程之間是具有競爭屬性的。為了高效完成任務(wù),合理競爭相關(guān)資源,便有了進(jìn)程優(yōu)先級和時間片已經(jīng)調(diào)度器算法。

2.進(jìn)程的獨立性

各個進(jìn)程運行期間互不干擾,各自獨立。

3.進(jìn)程的并行、并發(fā)

并行:多個進(jìn)程分別在多個CPU上同時運行。

并發(fā):多個進(jìn)程在單個CPU上采取進(jìn)程切換的方式,在一段時間內(nèi)讓多個進(jìn)程都得以推進(jìn)。

不要用人的感知來感受CPU的處理速度,例如每個進(jìn)程的時間片是0.0001秒,CPU就執(zhí)行每個進(jìn)程0.0001秒,在一秒的時間內(nèi),上百個進(jìn)程,每個都被CPU推進(jìn)了100次!CPU的運行速度之快,決定了進(jìn)程并發(fā)的可行性。

10.進(jìn)程的優(yōu)先級和時間片

linux進(jìn)程的優(yōu)先級范圍是60-99,默認(rèn)優(yōu)先級為80。優(yōu)先級由默認(rèn)優(yōu)先級和nice值共同決定,例如:創(chuàng)建一個進(jìn)程,這個進(jìn)程的默認(rèn)優(yōu)先級為80,同時把nice設(shè)置為10,進(jìn)程的最終優(yōu)先級為80+nice=90。

時間片決定了一個進(jìn)程每次使用CPU資源的最大時間限度。當(dāng)一個進(jìn)程使用CPU資源的時間超過時間片,進(jìn)程就會自動剝離,等待下次被調(diào)度。

11.進(jìn)程間切換

進(jìn)程間切換指的是進(jìn)程PCB在CPU運行隊列中,上、下的反復(fù)過程。下去的進(jìn)程要打包帶走自己的寄存器數(shù)據(jù),上來的進(jìn)程要將自己的寄存器數(shù)據(jù)拷貝給寄存器硬件。

12.linux內(nèi)核2.61CPU運行隊列窺視(綜合理解!)

現(xiàn)在執(zhí)行一個可執(zhí)行程序mybin。

./mybin

?一個進(jìn)程的一生開始了!

1.此時,操作系統(tǒng)在內(nèi)存中創(chuàng)建這個可執(zhí)行程序的PCB,并把磁盤上的代碼和數(shù)據(jù)拷貝到內(nèi)存中。

2.PCB放入CPU運行隊列中的過期隊列中等待被調(diào)度。需要等待活躍隊列中的PCB全部剝離,PCB剝離需要同時帶走自己的寄存器數(shù)據(jù)保存在自己的PCB中。

3.活躍隊列中的PCB全部剝離,swap兩隊列的指針,開始按照優(yōu)先級執(zhí)行活躍隊列(原過期隊列)中的進(jìn)程。每個進(jìn)程讓CPU執(zhí)行,需要把PCB內(nèi)的寄存器數(shù)據(jù)拷貝給寄存器。

4.該你執(zhí)行了,CPU開始執(zhí)行代碼,代碼中要訪問軟硬件資源但沒有就緒,阻塞!PCB進(jìn)入對應(yīng)的等待隊列。(剝離時帶走自己的寄存器數(shù)據(jù))

5.軟硬件資源就緒,PCB被喚回CPU運行隊列中的過期隊列中等待被調(diào)度。

6.又輪到你了,將寄存器數(shù)據(jù)交給寄存器,繼續(xù)從上次阻塞的地方開始執(zhí)行。

7.時間片到了,剝離到過期隊列中。

8.活躍隊列中的PCB全部剝離,再swap兩隊列的指針。CPU開始執(zhí)行過期隊列中的進(jìn)程。

9.又輪到你了,這次CPU在時間片結(jié)束時間內(nèi)把代碼執(zhí)行完了,進(jìn)程將要結(jié)束了。

10.父進(jìn)程把你的代碼和數(shù)據(jù)釋放,將PCB內(nèi)的退出數(shù)據(jù)讀取完畢,把PCB也釋放。進(jìn)程Z狀態(tài)。

本次分享就到這里,如果對大家有用的話,希望程序猿們可以三連支持一下,會繼續(xù)分享知識,加油!

http://aloenet.com.cn/news/38651.html

相關(guān)文章:

  • 一站式服務(wù)理念打廣告推廣怎么做
  • 網(wǎng)站開發(fā) 價格差異百度號碼認(rèn)證平臺官網(wǎng)首頁
  • 自己做soho需要做網(wǎng)站嗎長春網(wǎng)站制作公司
  • 網(wǎng)站建設(shè)公司怎么免費自己做推廣
  • 怎么做自己的網(wǎng)站自建一個頁面友情鏈接圖片
  • 貿(mào)易公司寮步網(wǎng)站建設(shè)哪家好怎么做好網(wǎng)站搜索引擎優(yōu)化
  • 廈門服裝商城網(wǎng)站建設(shè)優(yōu)化網(wǎng)站快速排名軟件
  • cpa單頁網(wǎng)站怎么做谷歌手機版瀏覽器官網(wǎng)
  • php網(wǎng)站開發(fā)是什么嗎廣州百度提升優(yōu)化
  • 鄧州網(wǎng)站制作seo1域名查詢
  • 推廣普通話喜迎二十手抄報seo鏈接優(yōu)化建議
  • 自己這么做網(wǎng)站semir是什么牌子
  • 麻涌公司網(wǎng)站建設(shè)公司百度云電腦網(wǎng)頁版入口
  • 電子商務(wù)網(wǎng)站建設(shè)合同范本外包公司排名
  • 自己在線制作logo免費網(wǎng)站北京seo優(yōu)化廠家
  • 公司網(wǎng)站開發(fā)費用計入什么科目營銷公司
  • vs網(wǎng)站中的輪播怎么做軟文寫作技巧有哪些
  • 圖片1600px做網(wǎng)站武漢網(wǎng)優(yōu)化seo公司
  • 企業(yè)網(wǎng)站的建立主要用于企業(yè)內(nèi)部發(fā)布信息鄭州seo公司哪家好
  • 標(biāo)書制作教程視頻網(wǎng)站3322免費域名注冊
  • 網(wǎng)站網(wǎng)址怎么找電商運營培訓(xùn)班多少錢
  • 彩票代購網(wǎng)站建設(shè)電腦優(yōu)化軟件哪個好用
  • 以個人名義可以做網(wǎng)站嗎蘋果自研搜索引擎或為替代谷歌
  • 如果想看網(wǎng)站的收費電影應(yīng)該怎么做惠州關(guān)鍵詞排名提升
  • 怎么把自己做的網(wǎng)站掛到外網(wǎng)上sem代運營
  • 2018年做返利網(wǎng)站網(wǎng)站功能優(yōu)化
  • 仿牌外貿(mào)網(wǎng)站百度搜索高級搜索
  • 做網(wǎng)站是干嘛廈門人才網(wǎng)最新招聘信息
  • 福州市住房和城鄉(xiāng)建設(shè)部網(wǎng)站seo是什么意思怎么解決
  • 建立英文網(wǎng)站搜索引擎優(yōu)化到底是優(yōu)化什么