进程内存分布

1、Linux内核空间与用户空间  

Linux的虚拟地址空间范围为0~4G(x86 32位),通常32位Linux内核地址空间划分为0~3G为用户空间,3~4G为内核空间

每个进程都可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。从这个角度来说,每个进程可以拥有4G的虚拟空间。

Linux使用两级保护机制:0级供内核使用,3级供用户程序使用,每个进程有各自的私有用户空间(0~3G),这个空间是进程独立的,其他进程不可见的。最高的1G虚拟内核空间则为所有进程以及内核共享的。

内核空间存放的是内核代码和数据,而进程的用户空间存放的是用户程序的代码和数据。不管是内核空间还是用户空间,他们都处于虚拟空间中。虽然内核空间占据了每个虚拟空间中的最高1G字节,但映射到物理内存却总是从最低地址开始(0x00000000)

使用虚拟地址可以很好的保护内核空间不被用户空间破坏,虚拟地址到物理地址转换过程由操作系统和CPU共同完成:操作系统为CPU设置好页表,CPU通过MMU单元进行地址转换

2、每个进程的内存分布

 

自底向上的方式进行讲解:

  1. 代码段:主要是程序的代码以及编译时静态链接进来的库。这段内存大小在程序运行之前就已经确定,而且是只读,可能存在一些常量,比如字符串常量。

  2. 数据段:分为data和bss两个段,表现为静态内存段,data段存放已初始化的全局变量(静态内存分配的变量和初始化全局变量)。bss段存放未初始化的全局变量,在内存中bss段被清零。

  3. 堆  段:用于程序动态内存分配和管理,如何分配和管理由程序的开发者决定,大小不固定(跟您的机器内存有关系),可以动态伸缩。

  4. 映射段:该内存区域存放链接其它动态程序库的向量,共享内存映射向量等等。

  5. 栈  段:栈是一种先进后出的数据结构,该段内存区域由程序在运行中自行管理,如:局部变量、临时变量、函数调用的返回指针等。

  6. 输入的环境变量和参数段:主要内存程序执行时的环境变量,输入参数等等。

  7. 就是系统区域

3、查看Linux下 栈和堆空间的大小

ulimit -s:查看linux的默认栈空间大小

du -sh:查看当前目录占用空间的大小

df -h:以磁盘分区为单位来查看文件系统的大小

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值