linux进程空间?进程地址空间
linux进程地址空间划分
Linux 64位系统在理论上拥有16位十六进制表示的巨大内存地址空间,即从0x0000000000000000到0xFFFFFFFFFFFFFFFF。然而,Linux仅实际使用了其中的256T空间,其余部分未被使用。
在Linux 64位操作中,实际使用的是低47位地址,高17位用于扩展,只能取全0或全1值。这样,可用的地址空间被分为两部分:用户空间(0x0000000000000000至0x00007FFFFFFFFFFF)和内核空间(0xFFFF800000000000至0xFFFFFFFFFFFFFFFF),剩余部分未被利用。
用户空间主要包含以下部分:代码段、数据段、BSS段、堆和栈。
代码段用于存放程序执行代码,即CPU执行的机器指令。
数据段存放已初始化且初值不为0的全局变量和静态局部变量,属于静态内存分配,可读可写。
BSS段包括未初始化全局变量和静态局部变量的空间。
堆(heap)是动态分配内存的区域,当进程读取文件时,若文件未在内存中,会通过缺页中断获取物理内存,通过磁盘调页将文件数据读入内存,实现文件的读取。
文件在两个进程间共享时,即使它们映射到同一文件,虚拟地址空间也可能不同。若进程A先读取文件,则会获取物理内存,通过磁盘调页将文件数据读入内存。进程B在访问文件时,若文件数据不在内存中,则会查找缓存区,如果缓存中有文件数据,则建立映射关系,实现进程间通信。
栈(stack)用于存储函数调用时的局部变量。
以数组s和指针p3为例,数组s的内容是在运行时赋值,而指针p3指向的常量区字符串内容在编译时已赋值。
使用malloc函数分配内存时,虚拟内存的分配情况如下:
当malloc分配的内存小于128k时,使用brk分配内存,将_edata向高地址移动,只分配虚拟空间,不对应物理内存。第一次读/写数据时,会触发内核缺页中断,内核分配物理内存,建立虚拟地址空间映射关系。若分配的内存不被访问,对应的物理内存不会被分配。
brk分配的内存需要等待高地址内存释放后才能释放,可能导致内存碎片。
当malloc分配的内存大于128k时,使用mmap分配内存,在堆和栈之间寻找空闲内存分配,对应独立内存且初始化为0。mmap分配的内存可以直接通过free释放。
当最高地址空间的空闲内存超过128k时,Linux执行内存紧缩操作,释放部分内存。
当进程访问未建立映射关系的虚拟内存时,逻辑地址转换为物理地址,发现当前页不在内存中,处理器自动触发缺页异常。
linux 下怎么查看一个进程占用内存大小
这里介绍下查看一个进程占用内存大小的方法。
1、首先单击桌面左上角的应用程序,选择系统工具选项,如下图所示。
2、接着在下拉菜单中,单击系统终端选项,如下图所示。
3、这时会来到系统终端命令行,如下图所示。
4、最后输入free-h命令,在结果中找到total即可查看到系统总的内存情况,如下图所示就完成了。
Linux里面VIRT和RES代表什么意思
深入理解Linux世界中的内存管理:VIRT与RES的奥秘
Linux操作系统中的内存管理是其高效性能的关键,其中VIRT和RES是两个重要的内存指标,它们分别揭示了进程在虚拟和实际内存中的占用情况。VIRT,全称为Virtual Memory Size,代表的是进程占用的虚拟内存总量。这一数字包含了物理内存(即RAM)的使用、swap空间的占用,以及操作系统为进程分配但实际未使用的内存。虽然VIRT看似庞大,但往往并不直观反映实际内存需求,因为它的值可能会超过实际硬件内存总容量。
相比之下,RES,即Resident Set Size,是进程实际占用的物理内存,不包括swap空间,但包括与其他进程共享的内存。RES值的实用性明显优于VIRT,因为它能提供一个更准确的内存占用量。然而,即使如此,我们仍需注意,某些进程可能因为内存不足而被swap到硬盘,这部分内存也应该计入RES的计算中,尽管它并未真正存储在RAM中。
最后,SHR,即Shared Memory,代表的是进程可以与其他进程共享的内存空间。这是Linux内核Copy on Write(CoW)机制的体现,当一个进程fork出子进程时,两者可以共享相同的内存区域,直到子进程需要更改数据时才会进行实际的复制。这种机制有效地节省了内存资源,但理解SHR的含义对于理解进程间内存协作至关重要。
总结来说,VIRT、RES和SHR这三个内存指标在Linux中各有其重要性,VIRT提供了总览,RES聚焦实际使用,而SHR则揭示了进程间的内存共享。理解这些概念,有助于我们更好地监控和优化系统内存使用,确保资源的有效分配和性能的提升。