进程所使用的内存空间

进程的内存空间布局

进程的内存空间布局
  • Kernel space:内核态内存空间,用户代码无法读写,否则会导致“段错误”的异常
  • Random stack offset
  • Stack:用户态的堆栈,大小不固定,可以用 ulimit -s 进行调整,默认一般为 8M,从高地址向低地址增长
  • Random mmap offset
  • Memory Mapping Segment(mmap):共享内存,进程茫茫内存空间里的主要部分,既可以从高地址到低地址延伸(所谓 flexible layout),也可以从低到高延伸(所谓 legacy layout),看进程具体情况
  • Program break(brk)
  • Heap:程序运行过程中动态申请的内存
  • Random brk offset
  • BSS Segment:数据段,主要是进程里未初始化的全局数据总和,当然还有编译器生成一些辅助数据结构等等),大小取决于具体进程,其位置紧贴着代码段
  • Data Segment:数据段,主要是进程里已初始化的全局数据总和,当然还有编译器生成一些辅助数据结构等等),大小取决于具体进程,其位置紧贴着代码段
  • Text Segment(ELF, Executable and Linkable Format):代码段,主要是进程的指令,包括用户代码和编译器生成的辅助代码,其大小取决于具体程序

一个C程序所使用的内存分析

//main.cpp 
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 
{ 
int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 
char *p3 = "123456"; 123456\0在常量区,p3在栈上。 
static int c =0; 全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
分配得来得10和20字节的区域就在堆区。

 
strcpy(p1, "123456"); 123456\0放在常量区。编译器可能会将它与p3所指向的"123456"优化成一个地方。 
}

相关概念

  • 虚拟内存 / Virtual Memory
  • 页表 / Page Table
  • 物理内存 / Physical Memory
  • 驻留内存 / Resident Memory
  • 共享内存 / Shared Memory

查看进程的内存占用

  • top命令
[root@055e4e6dc6db /]# top

top - 21:31:26 up 18 min,  0 users,  load average: 0.08, 0.08, 0.07
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2047036 total,   132976 free,   322092 used,  1591968 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.  1540976 avail 

                       虚拟内存  驻留内存  共享内存    
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                 
    1 root      20   0   11784   2852   2560 S   0.0  0.1   0:00.12 bash                                                                                    
   44 root      20   0   11784   3000   2576 S   0.0  0.1   0:00.05 bash                                                                                    
   67 root      20   0   11784   3024   2596 S   0.0  0.1   0:00.23 bash                                                                                    
  197 root      20   0   51912   3636   3112 R   0.0  0.2   0:00.00 top     
  • 进程的maps文件
[root@055e4e6dc6db /]# cat /proc/$$/maps 
# 代码段 / Text Segment
00400000-004dd000 r-xp 00000000 08:01 131482                             /usr/bin/bash
006dc000-006dd000 r--p 000dc000 08:01 131482                             /usr/bin/bash
006dd000-006e6000 rw-p 000dd000 08:01 131482                             /usr/bin/bash

# 数据段 / BSS Segment + Data Segment
006e6000-006ec000 rw-p 00000000 00:00 0 

# 堆 / Heap
01eaa000-01eec000 rw-p 00000000 00:00 0                                  [heap]

# mmap
7f1df94cc000-7f1df94d8000 r-xp 00000000 08:01 923657                     /usr/lib64/libnss_files-2.17.so
7f1df94d8000-7f1df96d7000 ---p 0000c000 08:01 923657                     /usr/lib64/libnss_files-2.17.so
7f1df96d7000-7f1df96d8000 r--p 0000b000 08:01 923657                     /usr/lib64/libnss_files-2.17.so
7f1df96d8000-7f1df96d9000 rw-p 0000c000 08:01 923657                     /usr/lib64/libnss_files-2.17.so
7f1df96d9000-7f1df96df000 rw-p 00000000 00:00 0 
7f1df96df000-7f1df9897000 r-xp 00000000 08:01 923591                     /usr/lib64/libc-2.17.so
7f1df9897000-7f1df9a97000 ---p 001b8000 08:01 923591                     /usr/lib64/libc-2.17.so
7f1df9a97000-7f1df9a9b000 r--p 001b8000 08:01 923591                     /usr/lib64/libc-2.17.so
7f1df9a9b000-7f1df9a9d000 rw-p 001bc000 08:01 923591                     /usr/lib64/libc-2.17.so
7f1df9a9d000-7f1df9aa2000 rw-p 00000000 00:00 0 
7f1df9aa2000-7f1df9aa4000 r-xp 00000000 08:01 923601                     /usr/lib64/libdl-2.17.so
7f1df9aa4000-7f1df9ca4000 ---p 00002000 08:01 923601                     /usr/lib64/libdl-2.17.so
7f1df9ca4000-7f1df9ca5000 r--p 00002000 08:01 923601                     /usr/lib64/libdl-2.17.so
7f1df9ca5000-7f1df9ca6000 rw-p 00003000 08:01 923601                     /usr/lib64/libdl-2.17.so
7f1df9ca6000-7f1df9ccb000 r-xp 00000000 08:01 133586                     /usr/lib64/libtinfo.so.5.9
7f1df9ccb000-7f1df9ecb000 ---p 00025000 08:01 133586                     /usr/lib64/libtinfo.so.5.9
7f1df9ecb000-7f1df9ecf000 r--p 00025000 08:01 133586                     /usr/lib64/libtinfo.so.5.9
7f1df9ecf000-7f1df9ed0000 rw-p 00029000 08:01 133586                     /usr/lib64/libtinfo.so.5.9
7f1df9ed0000-7f1df9ef1000 r-xp 00000000 08:01 923580                     /usr/lib64/ld-2.17.so
7f1dfa0e9000-7f1dfa0ec000 rw-p 00000000 00:00 0 
7f1dfa0ee000-7f1dfa0f1000 rw-p 00000000 00:00 0 
7f1dfa0f1000-7f1dfa0f2000 r--p 00021000 08:01 923580                     /usr/lib64/ld-2.17.so
7f1dfa0f2000-7f1dfa0f3000 rw-p 00022000 08:01 923580                     /usr/lib64/ld-2.17.so

# Random mmap offset
7f1dfa0f3000-7f1dfa0f4000 rw-p 00000000 00:00 0 

# 栈 / Stack
7ffd8e07b000-7ffd8e09c000 rw-p 00000000 00:00 0                          [stack]

7ffd8e0a6000-7ffd8e0a8000 r--p 00000000 00:00 0                          [vvar]

7ffd8e0a8000-7ffd8e0aa000 r-xp 00000000 00:00 0                          [vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

# Random stack offset

# Kernel space

  • 进程的smaps文件
[root@055e4e6dc6db /]# cat /proc/1/smaps 
00400000-004dd000 r-xp 00000000 08:01 131482                             /usr/bin/bash
Size:                884 kB
Rss:                 820 kB
Pss:                 273 kB
Shared_Clean:        820 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:          820 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd ex mr mw me dw 
01a72000-01ab4000 rw-p 00000000 00:00 0                                  [heap]
Size:                264 kB
Rss:                 208 kB
Pss:                 208 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:       208 kB
Referenced:          208 kB
Anonymous:           208 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac 
7ffed73f5000-7ffed7416000 rw-p 00000000 00:00 0                          [stack]
Size:                132 kB
Rss:                  20 kB
Pss:                  20 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        20 kB
Referenced:           20 kB
Anonymous:            20 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me gd ac 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Size:                  4 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd ex 

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359