由malloc等函数想到的一些问题

malloc/calloc函数作用都是在堆上分配内存,区别是malloc函数分配好内存后没有初始化内存,而calloc函数分配好函数后会把内存清零。还有一个alloca函数是在栈上分配内存。

之前个人总是想当然的认为malloc函数是系统调用,它的流程是向操作系统申请内存, 操作系统在内核空间分配好内存后调用内核态类似mmap的函数映射到用户进程空间。后来想到malloc是C库函数,发现我理解错了。malloc函数会调用brk/sbrk, 用来改变进程数据段的基址和大小。这么说来, malloc等函数分配的是线性地址,需要的时候由内核映射成物理地址。

提到线性地址不得不说分段机制和分页机制两种内存管理机制。

分段机制是早期的内存管理机制,所谓分段就是将一块可执行文件大小的逻辑内存映射成物理内存。我总是将内存分段机制中的段和我们学习x86实模式下的汇编中的段弄混淆,分段内存管理中段是一块与可执行文件的大小相同的物理内存。这块物理内存的段基址由系统负责映射。而intel x86的汇编语言中的代码段 数据段等也是分块思想(他们对应的是elf格式中的段,或者节),它们都是逻辑地址,由操作系统映射成物理地址,这些逻辑段最终都在一个物理段内。

分页机制是把物理内存和线性内存分成大小相同的块(一般是4k),  如果线性内存很大(32位系统就是4G), 这些块则非常多,查找效率较低,这时需要对一些地址范围做索引形成页表。这种机制分配内存的时候只会给进程分配可执行文件大小的线性内存,真正使用的时候才会将逻辑内存映射到物理内存。一开始可能只映射.text节的前4k字节,运行的时候CPU如果发现了逻辑地址没有映射,向系统报一个缺页中断,系统将该页映射成物理内存。随着程序的不断运行,越来越多的逻辑内存被映射。

在之前没有内存管理时,这两种机制都解决了以下3个问题:

1. 进程间的内存隔离, 应用使用的都是虚拟地址,一个应用进程不能随意访问另一个应用进程的内存空间, 因为映射机制对应用是不可见的,应用进程不知道自己的物理内存,也不知其他进程的物理内存。

2. 内存不够时,可以置换出没有运行进程的内存,分段机制置换的大小是以进程为单位进行置换, 分页机制以页为单位。通常页的尺寸比段小。

分页是一种更小粒度的内存管理,根据局部原理,采用分页机制,换入换出的效率更高,进程运行时需要的物理内存更小。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值