进程虚拟内存

1 进程地址空间

进程虚拟内存地址空间起始于0,终止于TASK_SIZE-1,其上是内核空间,总的地址空间按3:1划分,用户进程不能访问内核空间,如果没有某种协议,一个用户进程也不能访问其他进程的空间。

1.1 进程地址空间的布局

a 当前运行代码的text段

b 程序使用的动态库的代码

c 存储全局变量和动态产生数据的堆

d 保存局部变量和函数/过程调用的栈

e 环境变量和命令行参数

f 文件内容映射到虚拟内存空间的内存映射

每个进程都有一个mm_struct,这个结构保存了进程的内存管理信息。

经典布局

MMAP地址通常在虚拟空间的1/3处

新布局

如果栈的大小设置为不受限制,则选择使用经典布局,否则使用新布局

1.2 内存映射

在mm_struct中,进程虚拟空间信息由多个区域表示,每个区域由vm_area_struct描述,使用红黑树的方式,在添加区域时可以快速找到该区域之前的区域,而无需扫描整个链表

void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);int munmap(void* start,size_t length);

mmap函数会在虚拟地址空间start处,建立一块length长度的,访问权限为prot定义

时间: 2024-10-20 05:46:21

进程虚拟内存的相关文章

进程间的通讯

进程间通讯机制总结             2013-02-01 17:25:57 分类: LINUX 进程在内核的协调下进行相互间的通讯,主要包括三种方式:信号.管道和套接口三大类. 信号 信号是Unix 系统中的最古老的进程间通讯方式.它们用来向一个或多个进程发送异步事件信号.信号可以从键盘中断中产生,另外进程对虚拟内存的非法存取等系统错误环境下也会有信号产生.信号还被shell 程序用来向其子进程发送任务控制命令. 系统中有一组被详细定义的信号类型,这些信号可以由核心或者系统中其它具有适当

为什么linux下多线程程序如此消耗虚拟内存【转】

转自:http://blog.csdn.net/chen19870707/article/details/43202679 权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 探索 灵光一现 刨根问底 意外发现 Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Jan.27th, 2015 最近游戏已上线运营,进行服务器内存优化,发现一个非常奇妙的问题,我们的认证服

Linux进程虚拟地址空间

在linux中,各个进程的虚拟地址空间是独立的.各个进程的虚拟地址空间起始于0,延伸至TASK_SIZE -1. 在32 bit系统中,内核分配1GB,而各个用户空间进程可用的部分为3GB. 进程虚拟地址空间由若干个区域组成, 1.当前运行代码的二进制代码.text段. 2.程序使用的动态库代码. 3.存储区局变量和静态变量的数据段,bss,data段 4.保存动态分配数据的堆 5.保存局部变量和实现函数 调用的栈 6.环境变量和命令行参数. 7.文件内容映射到虚拟地址空间的内存映射. 具体布局

为什么linux下多线程程序如此消耗虚拟内存

Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Jan.27th, 2015 最近游戏已上线运营,进行服务器内存优化,发现一个非常奇妙的问题,我们的认证服务器(AuthServer)负责跟第三方渠道SDK打交道(登陆和充值),由于采用了curl阻塞的方式,所以这里开了128个线程,奇怪的是每次刚启动的时候占用的虚拟内存在2.3G,然后每次处理消息就增加64M,增加到4.4G就不再增

system()、exec()、fork()三个与进程有关的函数的比较

启动新进程(system函数) system()函数可以启动一个新的进程. int system (const char *string ) 这个函数的效果就相当于执行sh –c string. 一般来说,使用system函数远非启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序.这样对shell的安装情况,以及shell的版本依赖性很大. system函数的特点: 建立独立进程,拥有独立的代码空间,内存空间 等待新的进程执行完毕,system才返回.(阻塞) 替换进程映像(ex

可执行文件的装载于进程

6.1  进程虚拟地址空间 每个程序运行起来以后,它将拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小由计算机的硬件平台决定,具体来说是由CPU的位数决定的 对于windows来说,它的进程虚拟地址空间划分是操作系统占用2GB,那么进程就只剩2GB空间. windows有个启动参数可以将操作系统占用的虚拟地址空间减少到1GB,即跟Linux分布一样.方法如下: 修改windows系统盘根目录下的Boot.ini,加上"/3G"参数 [boot loader] timeout=30 d

把握linux内核设计思想(十三):内存管理之进程地址空间

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途] 进程地址空间由进程可寻址的虚拟内存组成,Linux 的虚拟地址空间为0~4G字节(注:本节讲述均以32为为例).Linux内核将这 4G 字节的空间分为两部分.将最高的 1G 字节(从虚拟地址0xC0000000到0xFFFFFFFF).供内核使用,称为"内核空间". 而将较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF),供各个进程使

Linux进程IPC浅析[进程间通信SystemV共享内存]

Linux进程IPC浅析[进程间通信SystemV共享内存] 共享内存概念,概述 共享内存的相关函数 共享内存概念,概述: 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间,所有用户空间的进程若要操作共享内存,都要将其映射到自己的虚拟内存空间中,通过映射的虚拟内存空间地址去操作共享内存,从而达到进程间的数据通信 共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容 本身不提供同

[转]观察进程的内存占用情况

转:http://www.cnblogs.com/bravery/archive/2012/06/27/2560611.html 概述 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题--你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存.这里我们可以看到VIRT.RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟大家一起探讨的问题.当然如果更加深入一点,你可能会问进程所占用的那些物理内存都用在了哪些