系统调用brk 和 mmap 有什么不同?
1. 核心功能差异
brk: 通过调整进程堆顶指针(_edata)扩展/收缩堆空间,仅适用于连续内存分配。
mmap:在进程虚拟地址空间中创建独立映射区域,支持文件/匿名内存映射,可分配非连续内存。
2. 内存管理机制
brk:分配时仅修改虚拟地址边界,物理内存按需分配(首次访问触发缺页中断)。释放时内存由malloc内部缓存,不立即归还操作系统。
mmap:分配时建立虚拟地址与文件/内存的映射关系,支持共享/私有模式。释放时通过munmap**立即归还虚拟地址空间和物理内存**。
3. 性能与适用场景
特性 | brk | mmap |
---|---|---|
分配大小 | 适合小块内存(<128KB) | 适合大块内存(≥128KB) |
碎片问题 | 易产生堆碎片 | 独立管理,无外部碎片 |
系统开销 | 仅移动指针,开销低 | 需系统调用,开销高 |
多线程 | 需全局锁,性能受限 | 支持线程独立映射,无锁竞争 |
4. 典型应用场景
brk:频繁分配/释放小内存(如字符串、结构体)。
mmap:大文件I/O、共享内存、进程间通信(IPC)。
问题思考:
1. 什么是缺页中断?
2. _edata 具体是指什么?除了_edata 区还有哪些内存区域的划分?