欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux之進程的虛擬地址空間,邏輯地址和物理地址,進程管理命令

 更新時間:2023年03月23日 10:48:56   作者:Dutkig  
這篇文章主要介紹了Linux之進程的虛擬地址空間,邏輯地址和物理地址,進程管理命令,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

進程的虛擬地址空間

進程有自己的獨立地址空間,每啟動一個進程,系統(tǒng)就會為它分配地址空間,虛擬地址空間的大小由計算機的硬件平臺決定,比如32位的平臺決定了虛擬地址空間為4G(因為32位系統(tǒng)上指針能夠?qū)ぶ返姆秶?32

這4G空間的分配如下:

  • 由上圖可知,進程的虛擬內(nèi)存被分為若干個“段”;
  • 每個段其實還被分成了若干個“塊”,我們將這個“塊”稱為“頁”;
  • 內(nèi)存的映射(虛擬地址和物理地址之間的轉(zhuǎn)換)也是以“頁”為單位的;
  • 一般來說一頁的大小4K;
  • 交換空間(內(nèi)存‘【這里說的是物理內(nèi)存】不夠時使用,把當前不使用的數(shù)據(jù)或者臨時數(shù)據(jù)放入到交換分區(qū)中),在防止數(shù)據(jù)塊到交換分區(qū)時,也是以"頁"為單位的,這個過程我們稱為“換出”,再由交換分區(qū)調(diào)入內(nèi)存,我們稱為“換入”,整個過程即為“換頁”

注意:虛擬地址一般由段號、頁號、頁中偏移量構(gòu)成,從而最終計算出你的物理地址;

缺頁:消除了進程全部載入內(nèi)存中,按需調(diào)頁(也就是換頁);

以上就是Linux的段頁式內(nèi)存管理

1.內(nèi)核空間(1G)

駐留在內(nèi)存內(nèi),是操作系統(tǒng)的一部分,內(nèi)核空間為內(nèi)核保留,不允許應(yīng)用程序讀寫該區(qū)域或調(diào)用內(nèi)核代碼。

2 棧(stack)

包括以下內(nèi)容和用途:

  • 1 函數(shù)的返回值和參數(shù)。
  • 2 臨時變量,包括非靜態(tài)局部變量,以及編譯器自動生成的臨時變量。
  • 3 保存上下文:包括函數(shù)調(diào)用前后需保持不變的寄存器。

3 內(nèi)存映射段(mmap)

該區(qū)域用于映射可執(zhí)行文件用到的動態(tài)鏈接庫。若可執(zhí)行文件依賴共享庫,則系統(tǒng)會為這些動態(tài)庫在從0x40000000開始的地址分配相應(yīng)空間,并在程序裝載時將其載入到該空間。

在Linux 內(nèi)核中,共享庫的起始地址被往上移動至更靠近棧區(qū)的位置。

4 堆(heap)

堆用于存放進程運行時動態(tài)分配的內(nèi)存段,可動態(tài)擴張或縮減。堆中內(nèi)容是匿名的,不能按名字直接訪問,只能通過指針間接訪問。

當進程調(diào)用malloc©/new(C++)等函數(shù)分配內(nèi)存時,新分配的內(nèi)存動態(tài)添加到堆上(擴張);當調(diào)用free©/delete(C++)等函數(shù)釋放內(nèi)存時,被釋放的內(nèi)存從堆中剔除(縮減) 。

5 .BSS段

.BSS(Block Started by Symbol)段中通常存放程序中以下符號:

  • 1 未初始化的全局變量和靜態(tài)局部變量
  • 2 初始值為0的全局變量和靜態(tài)局部變量(依賴于編譯器實現(xiàn))
  • 3 未定義且初值不為0的符號(該初值即common block的大小)

6 數(shù)據(jù)段(.Data)

數(shù)據(jù)段通常用于存放程序中已初始化且初值不為0的全局變量和靜態(tài)局部變量。

數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配(靜態(tài)存儲區(qū)),可讀可寫。

7 代碼段(text)

代碼段也稱正文段或文本段,通常用于存放程序執(zhí)行代碼(即CPU執(zhí)行的機器指令)。一般C語言執(zhí)行語句都編譯成機器代碼保存在代碼段。

通常代碼段是可共享的,因此頻繁執(zhí)行的程序只需要在內(nèi)存中擁有一份拷貝即可。

代碼段通常屬于只讀,以防止其他程序意外地修改其指令(對該段的寫操作將導(dǎo)致段錯誤)。

某些架構(gòu)也允許代碼段為可寫,即允許修改程序。

8 保留區(qū)

位于虛擬地址空間的最低部分,未賦予物理地址。

任何對它的引用都是非法的,用于捕捉使用空指針和小整型值指針引用內(nèi)存的異常情況。

一個頁面的大小為4K(212),

——因此進程可以使用220個頁面

注:絕大多數(shù)處理器上的內(nèi)存頁的默認大小都是 4KB,雖然部分處理器會使用 8KB、16KB 或者 64KB 作為默認的頁面大小,但是 4KB 的頁面仍然是操作系統(tǒng)默認內(nèi)存頁配置的主流

邏輯地址

在某一段程序中,我們輸出的變量內(nèi)存地址,其實是邏輯地址,也就是進程的地址空間。

虛擬地址向物理地址的轉(zhuǎn)換依靠的是內(nèi)存管理單元(MMU)

有些時候,父子進程的某個變量的輸出地址可能相同,只可能是其邏輯地址相同,要想知道它們在內(nèi)存中的物理地址,就必須根據(jù)邏輯地址判斷頁表號,再根據(jù)各自的頁表進行映射,找到其在內(nèi)存中的具體位置,,不同進程的邏輯地址沒有可比性,但是如果在同一個進程中,若地址相同,那就證明其在同一段物理內(nèi)存中。

如圖,在上述圖片中,假設(shè)父子進程的兩個變量的邏輯地址均為4097,那么其就應(yīng)該在頁表號為1的頁面上且偏移量為2(0-4095)的位置,在根據(jù)頁表號映射出其在物理內(nèi)存中的真實地址。

為什么我們在程序中不使用物理地址?

因為在運行程序的目標主機上,我們不知道當前哪些物理頁面是空閑的,如果我們程序?qū)懙亩际俏锢眄撁?,比如說,第一個進程說它要用0,1,2,3號頁面,假設(shè)其子進程也要用0,1,2,3號頁面,就沖突了,然后其他頁面是空閑的。我們在編程途中不知道其他程序會用哪些物理頁面,我們無法預(yù)知將要運行的主機上哪些物理頁面是空閑,而且物理頁面的空閑頁面是變化的,每次開機,空閑的頁面是不一樣的,我們無法確定,所以我們只能看邏輯地址,就像跳舞一樣,每個人有相對其他人的位置,跳舞的隊列是不變的,但是有可能在操場跳舞,或者在廣場跳舞。我們只能記錄相對位置,然后通過頁表映射,頁表的更新,確定哪個物理頁面是空閑的。

進程管理命令

pstree:樹狀結(jié)構(gòu)顯示進程

ps:報告程序狀況

這一命令用來顯示某一時間點的進程信息,這些信息是靜態(tài)的,

若想查看當前系統(tǒng)運行的動態(tài)程序信息 可以使用top命令。

top:

下面列舉一些常用的選項:

ps -ef:顯示所有程序,并以ASCII字符顯示樹狀結(jié)構(gòu),表達程序間的相互關(guān)系

  • -e和-A的意思是一樣的,即顯示有關(guān)其他用戶進程的信息,包括那些沒有控制終端的進程。
  • -f顯示用戶id,進程id,父進程id,最近CPU使用情況,進程開始時間等等

ps -l:長格式輸出

ps -aux:顯示當前終端所有進程(a)

注意與ps aux區(qū)分:列出正在運行的所有進程

用戶名 進程ID %CPU %內(nèi)存 虛擬內(nèi)存 固定內(nèi)存 終端 狀態(tài) 起始時間 CPU時間 程序指令

ps -x:當前用戶在所有終端下的進程

ps -u:以用戶格式輸出

ps -elf:顯示系統(tǒng)內(nèi)的所有進程

列名解釋:

如何殺死一個進程

  • kill  pid:結(jié)束pid進程
  • pkill:結(jié)束進程族
  • kill -9 pid:強制結(jié)束一個進程該,命令行可以使用`-9`參數(shù)來強制殺死進程

pkill sleep:可以結(jié)束后臺掛起的所用名叫sleep的進程

掛起是一種省電模式,系統(tǒng)將機器的硬盤,顯示器等外部設(shè)備停止工作,而CPU,內(nèi)存仍然在工作中,等待用戶隨時喚醒。

  • kill -stop pid:掛起一個進程
  •  jobs:查看被掛起的程序工作號
  • command &:直接在后臺運行程序

用grep命令和kil命令結(jié)合殺死一個目標進程

如何在后臺運行一個進程 

命令+&

eg:

  • sleep 300&
  • sleep 300 &

進程恢復(fù)

  • fg 工作號:將掛起的作業(yè)放回到前臺執(zhí)行
  • bg 工作號:將掛起的作業(yè)放到后臺執(zhí)行

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論