日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux进程基本知识详解

發(fā)布時間:2024/3/12 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程基本知识详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

前言

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

1、描述進(jìn)程

2、task_struct

2.1概念

2.2內(nèi)容分類

3、組織進(jìn)程

二、查看進(jìn)程

三、通過系統(tǒng)調(diào)用創(chuàng)建進(jìn)程

1、fork函數(shù)

2、父子進(jìn)程分流執(zhí)行

?四、進(jìn)程狀態(tài)

1、Linux內(nèi)核源碼

2、Linux狀態(tài)的說明

2.1 R運(yùn)行狀態(tài)

2.2 S睡眠狀態(tài)

2.3 D磁盤休眠狀態(tài)

2.4 T停止?fàn)顟B(tài)

2.5 Z僵尸狀態(tài)?

2.6 X死亡狀態(tài)

3、僵尸進(jìn)程的危害

五、進(jìn)程優(yōu)先級?

1、基本概念

2、優(yōu)先級的查看與調(diào)整

2.1查看系統(tǒng)進(jìn)程

2.2 PRI and NI?

2.3調(diào)整優(yōu)先級

六、環(huán)境變量?

1、常見環(huán)境變量

1.1 PATH

1.2 HOME

?1.3 SHELL

2、環(huán)境變量的組織方式?

2.1主函數(shù)的參數(shù)

?2.2通過代碼獲取環(huán)境變量

七、進(jìn)程地址空間

1、虛擬地址

2、映射關(guān)系

3、mm_struct

4、地址空間的作用

?總結(jié)


前言

哈嘍,小伙伴們大家好,進(jìn)程是操作系統(tǒng)中非常重要的一個概念,可以說我們與操作系統(tǒng)的唯一交互方式就是進(jìn)程。今天我將在linux系統(tǒng)下帶大家了解進(jìn)程的一些基本知識。事不宜遲,拿好小本本,我們趕緊開始吧~


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

1、描述進(jìn)程

進(jìn)程概念:運(yùn)行起來程序就是進(jìn)程。

描述進(jìn)程過程:?由于馮諾依曼體系要求,我們在執(zhí)行一個程序的時候,需要先把程序加載到內(nèi)存中去,CPU在從內(nèi)存中依次提取代碼。那么,我們運(yùn)行的程序都總只有一個嗎?顯示不是。大多數(shù)情況下,都是很多程序一起運(yùn)行的,這時候就需要操作系統(tǒng)作進(jìn)程管理。操作系統(tǒng)不會直接管理可執(zhí)行程序,而是會管理可執(zhí)行程序的數(shù)據(jù)。他會根據(jù)每一個可執(zhí)行程序進(jìn)行描述,形成一個結(jié)構(gòu)體,這個結(jié)構(gòu)體叫做進(jìn)程控制塊,也叫做PCB(process control block)。然后操作系統(tǒng)再把所有的進(jìn)程控制塊組織到一起,一起加載到內(nèi)存中去。可以理解成進(jìn)程是可執(zhí)行程序和進(jìn)程控制塊的集合,操作系統(tǒng)通過管理進(jìn)程控制塊就可以起到管理進(jìn)程的作用。

2、task_struct

2.1概念

概念:PCB是一個統(tǒng)稱,在Linux下控制進(jìn)程的結(jié)構(gòu)體叫做task_struct。下面我將介紹一下這個結(jié)構(gòu)體中都包含哪些內(nèi)容。

2.2內(nèi)容分類

(1)標(biāo)識符:標(biāo)識符是描述一個進(jìn)程的唯一標(biāo)識,用來區(qū)別其它進(jìn)程。相當(dāng)于人的身份證。我們先運(yùn)行一個進(jìn)程,然后使用相關(guān)命令把進(jìn)程的信息調(diào)出來。

查看系統(tǒng)中所有進(jìn)程信息:? ?ps aux / ps axj 命令

?PID為運(yùn)行進(jìn)程的標(biāo)識符,PPID為父進(jìn)程的標(biāo)識符。

用kil -9 ID號可以結(jié)束一個進(jìn)程。

(2)狀態(tài)

?STAY下面對應(yīng)的是這個進(jìn)程的狀態(tài),R代表正在運(yùn)行,而加號代表這個進(jìn)程是前臺進(jìn)程。在同一時間,后臺進(jìn)程有多個,而前臺進(jìn)程只能由一個。在前臺進(jìn)程運(yùn)行時,我們在終端中輸入命令是無效的。如果想要進(jìn)程在后臺運(yùn)行,則在運(yùn)行命令的后面加一個&即可。

?可以看到進(jìn)程后臺運(yùn)行依舊可以輸入命令行,并且進(jìn)程狀態(tài)后面沒了加號。

(3)優(yōu)先級

進(jìn)程往往有很多個同時進(jìn)行,但CPU資源是有限的,所以需要對進(jìn)程進(jìn)行優(yōu)先級設(shè)置,需要排出放入CPU的先后順序。對進(jìn)程的排序本質(zhì)上是對PCB進(jìn)行排隊(duì)。

(4)程序計(jì)數(shù)器

?概念:程序即將指向的下一條指令的地址。

在我們看書看到一半的時候,往往會夾一個書簽,方便下次找到整這個位置。進(jìn)程執(zhí)行時也同樣需要一個標(biāo)簽,方便進(jìn)程切換出去回來的時候能找到這個位置,所以需要程序計(jì)數(shù)器(PC指針)把這個位置記下來。

(5)內(nèi)存指針

task_struct想要找到對應(yīng)的執(zhí)行程序,需要一個指針來保存地址,這稱為內(nèi)存指針

(6)上下文數(shù)據(jù)

我們先來舉一個例子來解釋什么叫上下文數(shù)據(jù)。想必大家在上大學(xué)的時候都有同學(xué)在大一結(jié)束的時候去當(dāng)兵吧,如果拿到了征兵和招募通知不在學(xué)校辦理相關(guān)手續(xù)就直接走,那大概率過兩年回來的時候已經(jīng)被學(xué)校開除了。在走之前辦理相關(guān)手續(xù)是為了進(jìn)行信息保留,把學(xué)籍、學(xué)分、考試成績等信息都保留下來,這樣等當(dāng)兵回來之后可以繼續(xù)上大二。這些保留的信息在計(jì)算機(jī)中就叫做上下文數(shù)據(jù)。

CPU做的工作有三步:取指令,分析指令,執(zhí)行指令。一個進(jìn)程運(yùn)行的時候會加載到內(nèi)存中,CPU從內(nèi)存中按順序取代碼進(jìn)行計(jì)算,假設(shè)CPU是單核的,那么在某一時間它只能進(jìn)行一個進(jìn)程的計(jì)算。既然這樣,如果我們也一個死循環(huán),CPU是否會卡死呢?答案是當(dāng)然不會。 每個進(jìn)程都有一個時間片,時間片實(shí)際就是一個時間段,時間片一到或者是有更高優(yōu)先級的進(jìn)程來了,CPU就會進(jìn)行進(jìn)程切換。在幾個進(jìn)程之間循環(huán)切換就可以實(shí)現(xiàn)多個進(jìn)程并行。

而CPU中只有一套寄存器,用來存放取到的指令和計(jì)算過程中的數(shù)據(jù)。那么如果計(jì)算進(jìn)行到一半時,比如a=b+c;d=a+b;這個指令剛剛計(jì)算到一半,恰好需要進(jìn)行進(jìn)程切換怎么辦呢?難道下次切換回來的時候要進(jìn)行重新計(jì)算嗎?答案是當(dāng)然不會,剛剛計(jì)算過程中產(chǎn)生的數(shù)據(jù)叫做上下文數(shù)據(jù),發(fā)生進(jìn)程切換時CPU會把它們保存到task_struct中(不太準(zhǔn)確,先簡單這么理解),等切換回來的時候再直接把上下文數(shù)據(jù)提取出來繼續(xù)運(yùn)算就可以了。程序計(jì)數(shù)器也是存在CPU的寄存器中的,也可以理解成是一種上下文數(shù)據(jù)。

(7)I/O狀態(tài)信息

?包括顯示的I/O請求,分配給進(jìn)程的I/O設(shè)備和被進(jìn)程使用的文件列表。

(8)記賬信息

可能包括處理器時間總和,使用的時鐘數(shù)總和,時間限制,記賬號等。

3、組織進(jìn)程

運(yùn)行在系統(tǒng)里的進(jìn)程數(shù)據(jù)以task_struct鏈表的形式儲存起來。

二、查看進(jìn)程

在根目錄中,有proc(process)目錄是專門存放進(jìn)程信息的。可以用/proc查看。

后面跟具體進(jìn)程的PID可以查看對應(yīng)進(jìn)程的信息。

這里的cwd中存放的是進(jìn)程的工作目錄,也就是說進(jìn)程是知道自己在哪個目錄下工作的。所以我們之前進(jìn)行文件操作時在能在對應(yīng)的文件夾下完成讀寫。?

三、通過系統(tǒng)調(diào)用創(chuàng)建進(jìn)程

我們之前創(chuàng)建進(jìn)程的方式都是通過運(yùn)行可執(zhí)行程序形成進(jìn)程。現(xiàn)在我們來講一下如何通過系統(tǒng)調(diào)用創(chuàng)建進(jìn)程。

1、fork函數(shù)

我們可以通過fork函數(shù)來創(chuàng)建一個進(jìn)程。

特點(diǎn):

  • fork()函數(shù)在進(jìn)程中創(chuàng)建了一個子進(jìn)程,父進(jìn)程的代碼和數(shù)據(jù)可能是來自磁盤的,而子進(jìn)程的代碼和數(shù)據(jù)是來自父進(jìn)程的。
  • fork()創(chuàng)建子進(jìn)程,fork之前的代碼被父進(jìn)程執(zhí)行,fork之后的代碼父子都可以執(zhí)行。也就是說fork之后父子共享代碼(那數(shù)據(jù)呢?之后再說)
  • fork之后就有了父子兩個進(jìn)程,這兩個進(jìn)程誰先被調(diào)度是不確定的,完全取決于操作系統(tǒng)的調(diào)度算法。

2、父子進(jìn)程分流執(zhí)行

父子進(jìn)程執(zhí)行的指令往往是不同的,否則子進(jìn)程就沒有存在的必要。

和我們以往接觸到的函數(shù)不同,fork()函數(shù)有兩個返回值,它會返回給子進(jìn)程0,把子進(jìn)程的PID返回給父進(jìn)程。

看如下代碼,父進(jìn)程和子進(jìn)程會同時進(jìn)行:

?

?四、進(jìn)程狀態(tài)

進(jìn)程包括幾個不同狀態(tài),一般我們在學(xué)校學(xué)到的或者書中看到的都會說進(jìn)程有五個狀態(tài),分別是:創(chuàng)建,就緒,執(zhí)行,阻塞,終止。但對這種敘述很多小伙伴都感覺似懂非懂,原因是這種描述是描述的所有操作系統(tǒng)的共性,所以感覺起來會有點(diǎn)抽象。今天我將以具體的一款操作系統(tǒng)為例,帶大家看看Linux的進(jìn)程狀態(tài)是怎樣的。

1、Linux內(nèi)核源碼

首先我想問大家一個問題,狀態(tài)可數(shù)據(jù)化嗎?答案是可以的,我們可以把每一個狀態(tài)和一個數(shù)字或字母對應(yīng)起來,用數(shù)字或字母表示處于的狀態(tài),就可以實(shí)現(xiàn)狀態(tài)的數(shù)據(jù)化。數(shù)據(jù)化后的狀態(tài)會保存到task_struct中。

下面是一段Linux的源碼,說明了Linux下的狀態(tài)定義:

static const char * const task_state_array[] = { "R (running)", /* 0 */ "S (sleeping)", /* 1 */ "D (disk sleep)", /* 2 */ "T (stopped)", /* 4 */ "t (tracing stop)", /* 8 */ "X (dead)", /* 16 */ "Z (zombie)", /* 32 */ };

2、Linux狀態(tài)的說明

2.1 R運(yùn)行狀態(tài)

運(yùn)行狀態(tài)并不一定表示進(jìn)程在運(yùn)行中,也可以是在運(yùn)行隊(duì)列中。

2.2 S睡眠狀態(tài)

意味著進(jìn)程在等待某件事情完成(這里的睡眠有時候也可以叫做可中斷睡眠)。

2.3 D磁盤休眠狀態(tài)

也叫不可中斷睡眠,在這個狀態(tài)的進(jìn)程通常會等待IO的結(jié)束。

S狀態(tài)和D狀態(tài)有什么區(qū)別呢?舉個例子,有一個進(jìn)程叫張三,它負(fù)責(zé)取硬盤中拿東西,硬盤中和它對接的程序叫李四,李四說讓張三等一會,它需要把數(shù)據(jù)收集一下再給它,于是張三進(jìn)入了S睡眠狀態(tài)等待李四。可這時候操作系統(tǒng)來了,操作系統(tǒng)感覺空間已經(jīng)嚴(yán)重不足了,又看到張三在睡覺,于是就直接把張三殺掉了。過了一會李四收集好數(shù)據(jù)了開始找張三,結(jié)果張三已經(jīng)掛了,無人應(yīng)答。這種情況就尷尬了,是很容易引發(fā)問題的。于是就有了D狀態(tài),D狀態(tài)和S狀態(tài)的區(qū)別就是D狀態(tài)時深度睡眠,操作系統(tǒng)無權(quán)把它殺掉或喚醒,所以張三只要進(jìn)入D狀態(tài)就可以避免上面的問題。

2.4 T停止?fàn)顟B(tài)

可以通過發(fā)送 SIGSTOP 信號給進(jìn)程來停止(T)進(jìn)程。這個被暫停的進(jìn)程可
以通過發(fā)送 SIGCONT 信號讓進(jìn)程繼續(xù)運(yùn)行。

kill? ?-l? 可以列出所有命令:

2.5 Z僵尸狀態(tài)?

為了方便大家理解僵尸狀態(tài),我來舉一個例子。假設(shè)馬路上出現(xiàn)一具尸體,尸體不會被馬上抬走,而是要等警察來清理現(xiàn)場,采集尸體上的有效信息,來確認(rèn)是意外還是他殺,等著一系列的事情都辦完之后才會把人拉走。在這個例子里面,死人就好比進(jìn)程,警察好比操作系統(tǒng)(父進(jìn)程),等待警察采集尸體上有效信息這個過程就是僵尸狀態(tài)。

僵尸進(jìn)程概念:一個進(jìn)程已經(jīng)退出了,但它的相關(guān)資源沒有被回收,這樣的進(jìn)程叫做僵尸進(jìn)程。

為什么要有僵尸狀態(tài)呢?

首先我們要清楚,一個進(jìn)程創(chuàng)造出來是為了完成某個任務(wù),為了判斷這個任務(wù)有沒有完成,進(jìn)程退出時會釋放內(nèi)存后,然后把退出的相關(guān)信息(退出碼等)保存到task_struct中,等待操作系統(tǒng)或父進(jìn)程來讀取,如果沒有人來讀取,該進(jìn)程的資源就不能被釋放。等待父進(jìn)程取信息時的這個狀態(tài)就叫做僵尸狀態(tài)。僵尸進(jìn)程本身并不占內(nèi)存,但是用來保存信息的task_struct會占內(nèi)存。僵尸狀態(tài)其實(shí)已經(jīng)近似于一具尸體了,沒有人能夠再殺死它,kill? -9 也不行。只有等待父進(jìn)程讀取信息才會釋放。

2.6 X死亡狀態(tài)

死亡狀態(tài)往往是一瞬間的事,在進(jìn)程退出后相關(guān)信息被父進(jìn)程讀取后立刻進(jìn)入死亡狀態(tài)然后被釋放。死亡狀態(tài)很難觀測到。

3、僵尸進(jìn)程的危害

  • 如果子進(jìn)程的退出信息一直不被讀取,就會一直處在僵尸狀態(tài),信息儲存在task_struct中,需要PCB一直維護(hù)。
  • 如果一個父進(jìn)程創(chuàng)建了很多子進(jìn)程,但就是不回收,就會造成內(nèi)存資源的浪費(fèi)。
  • 如果在子進(jìn)程還沒退出的時候父進(jìn)程提前退出,子進(jìn)程就會變成孤兒進(jìn)程。孤兒進(jìn)程很容易造成內(nèi)存泄漏,所以會被操作系統(tǒng)領(lǐng)養(yǎng),由操作系統(tǒng)來回收。?

五、進(jìn)程優(yōu)先級?

1、基本概念

進(jìn)程優(yōu)先級概念:由于CPU的資源是有限的,各個進(jìn)程需要對CPU資源進(jìn)行競爭,CPU資源分配的先后順序稱為進(jìn)程優(yōu)先級。

其它概念:

競爭性:cpu資源有限,所以進(jìn)程之間是存在競爭性的。

獨(dú)立性:多進(jìn)程運(yùn)行時,進(jìn)程與進(jìn)程保持獨(dú)立,互不干擾。

并行:多個進(jìn)程在多個cpu下分別同時進(jìn)行運(yùn)行,叫做并行。

并發(fā):多個進(jìn)程在一個cpu采用進(jìn)程切換的方式,使多個進(jìn)程同時推進(jìn),叫做并發(fā)。

2、優(yōu)先級的查看與調(diào)整

2.1查看系統(tǒng)進(jìn)程

查看當(dāng)前shell產(chǎn)生的進(jìn)程:ps? ?l

其中的信息含義如下:

  • UID:執(zhí)行者的身份
  • PID:當(dāng)前進(jìn)程的標(biāo)號
  • PPID:父進(jìn)程的標(biāo)號
  • PRI:代表這個進(jìn)程可被執(zhí)行的優(yōu)先級,數(shù)字越小越先被執(zhí)行
  • NI:代表這個進(jìn)程的nice值?

2.2 PRI and NI?

PRI很好理解,代表這個進(jìn)程的優(yōu)先級。NI代表nice值,那么什么是nice值呢?

nice值是一個修正優(yōu)先級的數(shù)值,我們無法直接改變PRI,但可以通過改變nice值來改變PRI。? PRI(new)=PRI(old)+nice值。只要把nice值設(shè)為負(fù)數(shù),PRI就會減小,優(yōu)先級變高。nice值設(shè)為證書,PRI增大,優(yōu)先級減小。nice的取值范圍是-20-19。

2.3調(diào)整優(yōu)先級

調(diào)整優(yōu)先級的本質(zhì)是調(diào)整nice值。我們可以用top命令來更改nice值。

  • top
  • 進(jìn)入top后按“r”–>輸入進(jìn)程PID–>輸入nice值

?我們觀察myproc的進(jìn)程信息

通過top命令把nice值調(diào)整為10,發(fā)現(xiàn)PRI和NI都發(fā)生了變化。

?

六、環(huán)境變量?

概念:環(huán)境變量一般是指操作系統(tǒng)中用來指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù)。在系統(tǒng)中通常具有全局特性。

1、常見環(huán)境變量

命令:env查看所有環(huán)境變量

1.1 PATH

含義:命令的默認(rèn)搜索路徑

通過之前的學(xué)習(xí),我們了解到,我們輸入的命令行本質(zhì)上也是一個進(jìn)程。那為什么輸入命令行的時候可以直接輸入指令名,而運(yùn)行其它進(jìn)程的時候必須指定路徑,否則就會找不到呢?

?這是因?yàn)镻ATH這個環(huán)境變量中存了一系列的路徑,每個路徑之間用冒號隔開。我們輸入指令時如果不指明路徑操作系統(tǒng)會默認(rèn)去這些路徑中搜索,而我們平常使用的命令行指令都存在這些路徑中,所以可以直接使用。代碼如下(用echo輸出環(huán)境變量的時候記得前面加$,否則會被當(dāng)成字符串處理):

?如果我們想要一個進(jìn)程不需要指明路徑就可以直接運(yùn)行應(yīng)該怎樣做呢?很簡單,只要把它也添加到默認(rèn)搜索路徑中就可以了。例如我們用yum安裝軟件之后可以使用相應(yīng)軟件的命令或者winodws下點(diǎn)一下快捷方式程序就能啟動,本質(zhì)上都是因?yàn)檫@些軟件的路徑被安裝到了環(huán)境變量標(biāo)定的路徑下。但我們自己寫的程序一般不建議添加到環(huán)境變量標(biāo)定的路徑下,因?yàn)槲覀冏约簩懙某绦蛸|(zhì)量和用途都參差不齊,容易污染系統(tǒng)中的工具集。

如果想要我們自己寫的程序可以直接運(yùn)行,可以把當(dāng)前程序所在路徑添加到環(huán)境變量中。

注意:環(huán)境變量只是一個變量,我們對它的改變是不會保存的。退出后再登陸系統(tǒng)會重新生成環(huán)境變量。

1.2 HOME

含義:用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)的下默認(rèn)工作目錄)

下面分別是普通用戶和root用戶中HOME的值,可以發(fā)現(xiàn)是不同的。

?1.3 SHELL

含義:當(dāng)前操作系統(tǒng)中具體的shell。

2、環(huán)境變量的組織方式?

2.1主函數(shù)的參數(shù)

首先我們要先了解一個概念,main函數(shù)是可以有參數(shù)的。main函數(shù)是被操作系統(tǒng)調(diào)用的,當(dāng)我們使用ls? -l這種指令時,實(shí)際上-l就是在給main函數(shù)傳參。

c語言規(guī)定main函數(shù)有兩個參數(shù)(也可以說是三個,這里我們先說前兩個),第一個是整型變量,代表傳入?yún)?shù)的個數(shù),第二個是指向字符串的指針數(shù)組,里面保存?zhèn)魅胫噶畹牡刂贰S辛诉@兩個參數(shù),我們就可以像命令行指令那樣,通過改變后綴來產(chǎn)生不同的效果。

?

?2.2通過代碼獲取環(huán)境變量

環(huán)境變量的獲取方式有兩種,一種是通過主函數(shù)的第三個參數(shù),另一種是通過第三方變量environ。下面主要演示第二種。

每個程序都會收到一張環(huán)境表,環(huán)境表是字符指針數(shù)組,由二級指針environ調(diào)用。

環(huán)境變量具有全局屬性,我們可以在程序中把他們打印出來。

?這樣打印出來的是所有的環(huán)境變量,我們也可以用函數(shù)getenv根據(jù)環(huán)境變量名調(diào)出具體的環(huán)境變量。

#include <stdio.h> #include <stdlib.h> int main() { printf("%s\n", getenv("PATH")); return 0; }

七、進(jìn)程地址空間

1、虛擬地址

在c語言中,我們學(xué)過地址的概念,也了解過內(nèi)存的空間分布,如下圖所示。但是我們對這些概念的理解可能并不準(zhǔn)確,實(shí)際情況可我們想象的往往會有一些出入,今天我將從系統(tǒng)的角度對這些概念進(jìn)行修正。

?我們先來看一個例子,代碼如下:

運(yùn)行這個進(jìn)程,發(fā)現(xiàn)在子進(jìn)程對全局變量進(jìn)行修改后,父進(jìn)程和子進(jìn)程打印出來的值并不一樣,但地址卻相同。

?從上面這個例子我們可以得到以下結(jié)論:

  • 父子進(jìn)程的的變量內(nèi)容不一樣,所以父子進(jìn)程輸出的絕對不是同一個變量。
  • 但是他們的地址又相同,說明地址絕對不是真正意義上的物理地址,在linux下,我們把這種地址稱為虛擬地址。
  • 我們在c/c++下看到的都是虛擬地址,物理地址一概看不到,由操作系統(tǒng)統(tǒng)一管理。

2、映射關(guān)系

?實(shí)際上我們之前提到的分區(qū)都不是真正意義上的數(shù)據(jù)內(nèi)存分區(qū),而是虛擬地址對應(yīng)的分區(qū)。虛擬地址和內(nèi)存中的實(shí)際物理地址都存在一張頁表中,并且是一一映射關(guān)系,可以根據(jù)虛擬地址找到物理地址。每個進(jìn)程創(chuàng)建時,都會形成一個進(jìn)程地址空間(也就是虛擬地址)和它的task_struct關(guān)聯(lián)起來。剛開始子進(jìn)程和父進(jìn)程的映射關(guān)系是完全一樣的,虛擬地址都指向相同的物理地址,但子進(jìn)程改變了全局變量的值,由于進(jìn)程之間具有獨(dú)立性,父進(jìn)程中全局變量的值不能隨子進(jìn)程的改變而改變,所以它會在內(nèi)存中開辟一個新變量來保存改變后的值,并改變頁表中的映射關(guān)系,使虛擬地址能夠找到它。

3、mm_struct

進(jìn)程地址空間實(shí)際上就是一個結(jié)構(gòu)體,稱為mm_struct,mm_struct是對實(shí)際物理空間的數(shù)據(jù)化。舉個例子,我們上學(xué)的時候可能都劃過三八線,在畫三八線時要保證公平,需要用到尺子來量一下課桌的長度。實(shí)際上測量長度這一行為就是數(shù)據(jù)化的體現(xiàn),假設(shè)量出來桌子長100厘米,那么規(guī)定0到50厘米歸左邊的小明,51到100厘米歸右邊的小紅,僅僅用一個長度區(qū)間就很好的描述了課桌的分區(qū)。

和劃分課桌相同,對一塊區(qū)域數(shù)據(jù)化的最好方法就是把他的起始位置和結(jié)束位置用數(shù)據(jù)表示出來,所以mm_struct中保存的是各個分區(qū)的始末位置。類似于下圖:

實(shí)際上不光進(jìn)程是分段的,保存在磁盤中的可執(zhí)行程序也是分段的。?

注意:mm_struct和task_struct一樣,都是保存在內(nèi)存中的,并且task_struct中存了一個指針,用來指向mm_struct。

4、地址空間的作用

(1)保護(hù)內(nèi)存

有了地址空間,就再也不會有系統(tǒng)層面的越界訪問了。我們平常說的指針越界其實(shí)都是地址空間的越界,并不會影響到系統(tǒng)。

(2)統(tǒng)一性

每個進(jìn)程都認(rèn)為看到的是相同的空間范圍(順序,構(gòu)成)。

(3)更好的完成進(jìn)程獨(dú)立性和合理使用空間

使用虛擬地址的話,每個進(jìn)程都感覺自己在獨(dú)占內(nèi)存,有助于系統(tǒng)更好的分配空間。舉個例子,我們每個人都往銀行存五萬塊錢,每個人都覺得自己擁有五萬塊錢,但大家又不可能同時取這五萬塊錢,所以銀行握著一大筆存款可以隨意支配,創(chuàng)造更大的價值。將內(nèi)存集中到一起由操作系統(tǒng)統(tǒng)一調(diào)配更加高效,實(shí)現(xiàn)了進(jìn)程調(diào)度和內(nèi)存管理的解耦。


?總結(jié)

以上就是本文要講的全部內(nèi)容。本文主要介紹了進(jìn)程的相關(guān)概念,希望能給大家?guī)韼椭T谙乱徽挛覍⒔榻B進(jìn)程控制的相關(guān)知識,對進(jìn)程進(jìn)行進(jìn)一步的講解。本篇文章就到這里啦,山高路遠(yuǎn),來日方長,期待下次見面~

總結(jié)

以上是生活随笔為你收集整理的Linux进程基本知识详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。