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)文章
LINUX中詳解AWK內(nèi)建變量FS,NF,NR,RT,RS,ORS,OFS
很多朋友沒搞告白AWK內(nèi)建變量FS,NF,NR,RT,RS,ORS,OFS的方法和原理,小編給大家總結(jié)了詳細的內(nèi)容,一起來學習下思路。2017-11-11Linux使用MySQL忘記root密碼及修改MySQL默認編碼
本篇文章主要介紹了Linux使用MySQL忘記root密碼及修改MySQL默認編碼,碰到這個問題的朋友可以參考下。2016-10-10IO多路復(fù)用之epoll全面總結(jié)(必看篇)
下面小編就為大家?guī)硪黄狪O多路復(fù)用之epoll全面總結(jié)(必看篇)。小編覺得挺不錯的。現(xiàn)在就分享給大家。也給大家做個參考。一起跟隨小編過來看看吧2016-12-12ubuntu 16.04 LTS 安裝mongodb 3.2.8教程
本篇文章主要介紹了ubuntu 16.04 LTS 安裝mongodb 3.2.8教程,具有一定的參考價值,有需要的可以了解一下。2017-04-04Ubuntu 16.04源碼編譯安裝Apache 2.4.25教程
這篇文章主要為大家詳細介紹了Ubuntu 16.04源碼編譯安裝Apache 2.4.25,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Windows 和 Linux 上Redis的安裝守護進程配置方法
​ Redis是目前最常用的非關(guān)系型數(shù)據(jù)庫(NOSql)之一,常以Key-Value的形式存儲。這篇文章主要介紹了Windows 和 Linux 上Redis的安裝守護進程配置 ,需要的朋友可以參考下2019-06-06