007-1内存管理架构

本文介绍了内存管理的架构,包括用户空间的malloc/free操作,内核空间的虚拟内存管理和页分配器,以及硬件中的MMU在地址转换中的作用。通过示例分析了sbrk函数在内存分配与回收中的应用,探讨了堆大小与实际分配的差异问题。
摘要由CSDN通过智能技术生成

一、内存管理架构

内存管理子系统架构包括:用户空间、内核空间和硬件部分。

 

1、用户空间

        应用程序使用malloc()函数申请内存资源、通过free()函数释放内存资源;malloc/free是glibc库的内存分配器ptmalloc提供的接口。ptmalloc使用系统调用brk或者mmap向内核申请内存(一页为单位),然后进行分成很小的内存块分配给对应的应用程序。

2、内核空间

        虚拟内存管理负责从进程的虚拟地址分配虚拟页。sys_brk来扩大或者压缩堆,sys_mmap用来在内存映射区域分配虚拟页,munmap用来释放虚拟页,页分配器(伙伴分配器)负责分配物理页。

        内核空间拓展功能,不连续页分配器提供分配内存的接口vmalloc/vfree。在内存碎片化的时候,申请连续物理页的成功率很低,可以申请不连续的物理页,然后映射成连续的虚拟页。

        内存控制组用来控制进程占用的内存资源。当内存碎片的时候,找不到连续的物理页,内存碎片整理通过迁移的方式得到连续的物理页。在内存不足的时候,页回收负责回收物理页。

3、硬件

        MMU包含一个页表缓存,保存最近使用过的页表映射,避免每次把虚拟地址转换物理地址都需要查内存中的页表。解决处理器执行速度和内存速度不匹配的问题,中间增加一个缓存。一级缓存分为数据缓存和指令缓存,二级缓存作用是协调一级缓存和内存之间的工作效率。

4、直接通过系统调用,内存分配实例分析:---sbrk和brk函数既可以分配,页可以回收,取决于函数参数

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

#define MXA 1024

int main(int argc, char* argc[])
{
	int *p=sbrk(0);
	int *old=p;
	
	p=sbrk(MAX*MAX); 分配内存
	if(p == (void *)(-1))
	{
		perror("sbrk error.\n");
		exit(-1);
	}
	
	printf("old: %p \n p=%p \n", old, p);
	int *new=sbrk(0);
	printf("new: %p\n",new);
	
	sbrk(-MAX*MAX); 回收内存
	
	return 0;
}

5、问题

        堆的大小90f5000 - 8fd4000 = 0x00121000 并不等于p=sbrk(MAX*MAX);
1024*1024=0x00100000 ??

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyDog0623

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值