linux虚拟内存api,Linux虚拟内存空间分布-Go语言中文社区
平常總說cpu的位數(shù),其實說的是cpu一次能運算的最長整數(shù)的寬度,既ALU(算術邏輯單元)的寬度。
cpu的位數(shù)也是數(shù)據(jù)總線的條數(shù)
數(shù)據(jù)總線:數(shù)據(jù)線的總和,數(shù)據(jù)線就是cpu與內(nèi)存進行數(shù)據(jù)傳遞的通道,一條數(shù)據(jù)線,一次可以傳送1位二進制數(shù),8條數(shù)據(jù)線一次就可以傳8位(1個字節(jié))
地址總線:CPU是通過地址總線來指定存儲單元的,地址總線決定了cpu能訪問的最大內(nèi)存大小,比如,10位的地址線能訪問的內(nèi)存為1024位(1B)二進制數(shù)據(jù)
操作系統(tǒng)為了屏蔽I/O底層的差異,創(chuàng)建了VFS(虛擬文件系統(tǒng)),為了屏蔽I/O層與內(nèi)存之間的差異,產(chǎn)生了虛擬內(nèi)存。為了屏蔽cpu與內(nèi)存之間的差異,創(chuàng)建了進程。每個程序運行起來都會擁有一個自己的虛擬地址空間,32位cpu的操作系統(tǒng),其地址線也為32位,所以虛擬地址空間為2^32 -1= 4G
一個進程在運行時不可能會用如此大的虛擬地址空間,它們只會用到其中的一部分,而且并不一定連成一片,可能會被分割成幾塊,每一塊連續(xù)的虛擬內(nèi)存塊被稱為虛擬內(nèi)存段。
Linux虛擬內(nèi)存空間布局如下:
.reserve(預留)段
一共占用128M,屬于預留空間,進程是禁止訪問的
.text(代碼段)
可執(zhí)行文件加載到內(nèi)存中的只有數(shù)據(jù)和指令之分,而指令被存放在.text段中,一般是共享的,編譯時確定,只讀,不允許修改
.data
存放在編譯階段(而非運行時)就能確定的數(shù)據(jù),可讀可寫。也就是通常所說的靜態(tài)存儲區(qū),賦了初值的全局變量和賦初值的靜態(tài)變量存放在這個區(qū)域,常量也存放在這個區(qū)域
.bss段
通常用來存放程序中未初始化以及初始化為0的全局/靜態(tài)變量的一塊內(nèi)存區(qū)域,在程序載入時由內(nèi)核清0
.heap(堆)
用于存放進程運行時動態(tài)分配的內(nèi)存,可動態(tài)擴張或縮減,這塊內(nèi)存由程序員自己管理,通過malloc/new可以申請內(nèi)存,free/delete用來釋放內(nèi)存,heap的地址從低向高擴展,是不連續(xù)的空間
.stack(棧)
記錄函數(shù)調(diào)用過程相關的維護性信息,棧的地址從高地址向低地址擴展,是連續(xù)的內(nèi)存區(qū)域
共享庫(libc.so)
靜態(tài)庫和動態(tài)庫的區(qū)別:
(1)、不同操作系統(tǒng)下后綴不一樣
windows linux
靜態(tài)庫 .lib .a
動態(tài)/共享庫 .dll .so
(2)、加載方法的時間點不同
*.a 在程序生成鏈接的時候已經(jīng)包含(拷貝)進來了
*.so 程序在運行的時候才加載使用
(3)靜態(tài)庫把包含調(diào)用函數(shù)的庫是一次性全部加載進去的,動態(tài)庫是在運行的時候,把用到的函數(shù)的定義加載進去,所以包含靜態(tài)庫的程序所以用靜態(tài)庫編譯的文件比較大,如果靜態(tài)庫改變了,程序得重新編譯,相反的,動態(tài)庫編譯的可執(zhí)行文件較小,但.so改變了,不影響程序,動態(tài)庫的開發(fā)很方便
(4)程序?qū)o態(tài)庫沒有依賴性,對動態(tài)庫有依賴性。
cat命令可以查看進程的虛擬地址空間布局
cat /proc/pid/maps
該輸出命令一共有六列,分別為:
虛擬內(nèi)存開始地址-結(jié)束地址、訪問權(quán)限(r讀-w寫-x可執(zhí)行-s共享-p私有) 、偏移量 、主設備號:次設備號、映像文件i節(jié)點 、映像文件路徑
總結(jié)
以上是生活随笔為你收集整理的linux虚拟内存api,Linux虚拟内存空间分布-Go语言中文社区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在微型计算机中1 mb准确等于几个字,2
- 下一篇: linux 终端显示白底,mac终端使用