内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
来源:互联网 发布:软件项目管理制度 编辑:程序博客网 时间:2024/06/05 17:30
如何查看进程发生缺页中断的次数?
用ps -o majflt,minflt -C program命令查看。
majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
这两个数值表示一个进程自启动以来所发生的缺页中断的次数。
发成缺页中断后,执行了那些操作?
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:
1、检查要访问的虚拟地址是否合法
2、查找/分配一个物理页
3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)
4、建立映射关系(虚拟地址到物理地址)
重新执行发生缺页中断的那条指令
如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。
内存分配的原理
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
1、brk是将数据段(.data)的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。
下面以一个例子来说明内存分配的原理:
情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),如下图:
2、进程调用A=malloc(30K)以后,内存空间如图2:
3、进程调用B=malloc(40K)以后,内存空间如图3。
情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0),如下图:
5、进程调用D=malloc(100K)以后,内存空间如图5;
6、进程调用free(C)以后,C对应的虚拟内存和物理内存一起释放。
8、进程调用free(D)以后,如图8所示:
mallopt函数可以控制 内存分配的函数:
int mallopt(int param,int value)//控制 内存分配的函数 。
param 的取值可以为M_CHECK_ACTION、M_MMAP_MAX、M_MMAP_THRESHOLD、M_MXFAST(从glibc2.3起)、M_PERTURB(从glibc2.4起)、M_TOP_PAD、M_TRIM_THRESHOLD。
此处解释param取值为M_MXFAST的情况;
value是以 字节为单位的。
比如设置M_MMAP_THRESHOLD选项可以设置启用mmap申请malloc字节数阀值,设置-1是不启用mmap- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap系统调用
- 进程的内存分配函数之brk和mmap(不考虑共享内存)的应用
- 进程分配内存的两种方式--brk() 和mmap()(不设计共享内存)
- 内存分配的原理__进程分配内存有两种方式
- Linux进程分配内存的两种方式--brk() 和mmap()
- Linux进程分配内存的两种方式--brk() 和mmap()
- Linux内存分配小结--malloc、brk、mmap
- 内存分配_sbrk,brk
- 频繁分配释放内存导致的性能问题的分析--brk和mmap的实现
- 系统调用与内存管理(sbrk、brk、mmap、munmap)
- 内存分配方式及它们的分别
- 封装简单curl类
- Java基础总结7---Java基础类库
- C语句和反汇编代码对照表
- ML数学知识琐碎
- 修改linux系统root密码
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
- php 基础之GD库
- python dom方法遍历某文件夹下所有xml
- Stanford NLP 安装与初步使用
- android之Toolbar取消子控件左边留白
- [李景山php]每天laravel-20161103|CompilerEngine.php-2
- oracle 数据库分区
- mac的svn之cornerstone简易使用
- 《React-Native系列》26、 ReactNative实现图片上传功能