【Linux应用开发】malloc内存分配原理
来源:互联网 发布:javascript resources 编辑:程序博客网 时间:2024/04/30 05:08
如何查看进程发生缺页中断的次数?
用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是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。上面两种都是在glibc(应用层)中实现的,改变的都是应用层中堆的大小。
在标准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所示:
- 【Linux应用开发】malloc内存分配原理
- malloc内存分配原理
- malloc原理和内存分配
- Linux内存分配原理
- Linux内存分配小结--malloc、brk、mmap
- malloc内存分配与free内存释放的原理
- linux环境内存分配原理
- linux环境内存分配原理
- malloc free内存分配
- malloc内存分配机制
- malloc内存分配
- malloc内存分配
- c malloc分配内存
- malloc内存分配详解
- c malloc分配内存
- malloc分配内存失败
- malloc 内存分配
- 内存分配malloc
- 装饰设计模式和继承的区别
- ibatis的in函数的使用
- POJ 2299(树状数组求逆序对)
- 取消EditText自动聚焦弹出输入框
- UISplitViewController翻译
- 【Linux应用开发】malloc内存分配原理
- 【机器学习实战】制作五子棋AI之一:图片预处理(尺寸变换和增加alpha通道)
- ubuntu服务器安装配置apache2
- 浅谈Java中CountDownLatch的用法
- 【Unity】【UI.Text】【Code】通用代码库(五)——文字循环滚动+touch控制上下滚动
- 非阻塞式socket的select()用法
- mysql操作查询结果case when then else end用法举例
- post提交json数据后,java接收json
- 北大oj-1008 C语言