linux下c程序釋放内存?操作系統利用體系結構提供的VA到PA的轉換機制實現虛拟内存管理,下面可以進一步來理解虛拟内存管理:,今天小編就來聊一聊關于linux下c程序釋放内存?接下來我們就一起去研究一下吧!
操作系統利用體系結構提供的VA到PA的轉換機制實現虛拟内存管理,下面可以進一步來理解虛拟内存管理:
# ps
PID USER TIME COMMAND
1 root 0:14 {linuxrc} init
2 root 0:00 [kthreadd]
3 root 0:00 [ksoftirqd/0]
4 root 0:00 [kworker/0:0]
5 root 0:00 [kworker/0:0H]
7 root 0:47 [rcu_preempt]
8 root 0:00 [rcu_sched]
9 root 0:00 [rcu_bh]
10 root 0:00 [migration/0]
11 root 0:00 [watchdog/0]
12 root 0:00 [watchdog/1]
13 root 0:00 [migration/1]
14 root 0:00 [ksoftirqd/1]
16 root 0:00 [kworker/1:0H]
17 root 0:00 [kdevtmpfs]
983 root 0:02 mc_server
用ps命令查看當前終端下的進程,得知mc_server進程的id是983,然後使用car /proc/983/maps 命令查看它的虛拟地址空間。/proc 目錄中的文件并不是真正的磁盤文件,而是由内核虛拟出來的文件系統,當前系統中運行的每個進程在/proc 文件都有一個子目錄,目錄名就是進程的id,查看目錄下的文件可以得到該進程的相關信息。
# cat /proc/983/maps
00400000-00401000 r-xp 00000000 1f:05 384 /usr/bin/mc_server
00410000-00411000 rw-p 00000000 1f:05 384 /usr/bin/mc_server
16ce7000-17103000 rw-p 00000000 00:00 0 [heap]
7f8c7cb000-7f8c7d1000 r-xp 00000000 1f:05 208 /lib/librt-2.23.so
7f8c7d1000-7f8c7e0000 ---p 00006000 1f:05 208 /lib/librt-2.23.so
7f8c7e0000-7f8c7e1000 r--p 00005000 1f:05 208 /lib/librt-2.23.so
7f8c7e1000-7f8c7e2000 rw-p 00006000 1f:05 208 /lib/librt-2.23.so
7f8c7e2000-7f8c90d000 r-xp 00000000 1f:05 187 /lib/libc-2.23.so
7f8c90d000-7f8c91c000 ---p 0012b000 1f:05 187 /lib/libc-2.23.so
7f8c91c000-7f8c920000 r--p 0012a000 1f:05 187 /lib/libc-2.23.so
7f8c920000-7f8c922000 rw-p 0012e000 1f:05 187 /lib/libc-2.23.so
7f8c922000-7f8c926000 rw-p 00000000 00:00 0
7f8c926000-7f8c93a000 r-xp 00000000 1f:05 463 /usr/lib/libcncrDriver.so
7f8c93a000-7f8c949000 ---p 00014000 1f:05 463 /usr/lib/libcncrDriver.so
7f8c949000-7f8c94a000 rw-p 00013000 1f:05 463 /usr/lib/libcncrDriver.so
7f8c94a000-7f8cb86000 rw-p 00000000 00:00 0
7f8cb86000-7f8cb95000 r-xp 00000000 1f:05 494 /usr/lib/libibcUtilsMc.so
7f8cb95000-7f8cba5000 ---p 0000f000 1f:05 494 /usr/lib/libibcUtilsMc.so
7f8cba5000-7f8cba8000 rw-p 0000f000 1f:05 494 /usr/lib/libibcUtilsMc.so
7f8cba8000-7f8cbaa000 rw-p 00000000 00:00 0
7f8cbaa000-7f8cbc0000 r-xp 00000000 1f:05 204 /lib/libpthread-2.23.so
7f8cbc0000-7f8cbd0000 ---p 00016000 1f:05 204 /lib/libpthread-2.23.so
7f8cbd0000-7f8cbd1000 r--p 00016000 1f:05 204 /lib/libpthread-2.23.so
7f8cbd1000-7f8cbd2000 rw-p 00017000 1f:05 204 /lib/libpthread-2.23.so
7f8cbd2000-7f8cbd6000 rw-p 00000000 00:00 0
7f8cbd6000-7f8cbe0000 r-xp 00000000 1f:05 462 /usr/lib/libboardConfigOPMc.so
7f8cbe0000-7f8cbef000 ---p 0000a000 1f:05 462 /usr/lib/libboardConfigOPMc.so
7f8cbef000-7f8cbf0000 rw-p 00009000 1f:05 462 /usr/lib/libboardConfigOPMc.so
7f8cbf0000-7f8cc18000 rw-p 00000000 00:00 0
7f8cc18000-7f8cc35000 r-xp 00000000 1f:05 179 /lib/ld-2.23.so
7f8cc3e000-7f8cc42000 rw-p 00000000 00:00 0
7f8cc42000-7f8cc43000 r--p 00000000 00:00 0 [vvar]
7f8cc43000-7f8cc44000 r-xp 00000000 00:00 0 [vdso]
7f8cc44000-7f8cc45000 r--p 0001c000 1f:05 179 /lib/ld-2.23.so
7f8cc45000-7f8cc47000 rw-p 0001d000 1f:05 179 /lib/ld-2.23.so
7fdba5c000-7fdba86000 rw-p 00000000 00:00 0 [stack]
x86 平台的虛拟地址空間是0x0000 0000 0xffff ffff, 大緻上前3GB(0x0000 0000 00xbfff ffff)是用戶空間,後1GB(0xC000 0000 ~ 0xffff ffff)是内核空間。
0x00400000-0x00401000地址段,訪問權限是 r-x, 表示Text Segment, 包含.text段,.rodata段,.plt段等。
0x00410000-0x00411000地址段,訪問權限為r-w, 表示Data Segment,包含.data段,.bss段等。
0x16ce7000-0x17103000不是從磁盤文件加載到内存的,這段空間稱為堆(Heap), malloc函數動态分配内存是在這裡分配的。
從0x7f8c7cb000開始是共享庫的映射空間,每個共享庫也分為幾個Segment,每個Segment有不同的訪問權限。從堆空間的結束地址0x17103000到共享庫映射空間的起始地址0x16ce7000之間有很大的地址空洞,在地址分配内存時堆空間是可以向高地址增長的。堆空間的地址上限稱為Break, 堆空間要向高地址增長就要擡高Break, 映射新的虛拟内存空間到物理内存,這是通過系統調用brk實現的。malloc函數也是調用break向内核請求分配内存的。
0x7fdba5c000-0x7fdba86000是棧空間,其中高地址的部分保存着進程的環境變量和命令行參數,低地址的部分保存函數棧幀,棧空間是向低地址增長的,但顯然沒有堆空間那麼大的可供增長的餘地,因為實際的應用程序動态分配大量的并不少見,但是函數調用有很多局部變量的非常少見。棧空間是可能用盡的,并且比堆空間更容易用盡,用盡棧空間最終導緻段錯誤。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!