返回
Mach虚拟内存和OC内存管理详解
iOS
2023-01-29 19:22:49
Mach虚拟内存:了解核心概念和数据结构
什么是Mach虚拟内存?
Mach虚拟内存是一种由苹果公司开发的先进虚拟内存系统,广泛应用于macOS、iOS和tvOS操作系统中。它以其多任务和多用户支持、高效的内存管理机制以及对文件映射的支持而著称。
Mach虚拟内存的特点
- 多任务和多用户支持: Mach虚拟内存允许多个任务和用户同时运行,每个实体拥有自己的隔离虚拟地址空间。
- 分页内存管理: 它使用分页内存管理,将物理内存划分成大小均等的页面(通常为4KB)。
- 需求分页: 仅在访问页面时才会将其调入内存,提高内存效率。
- 拷贝-在-写入: 修改页面时,会创建其副本,保留原始页面,防止意外覆盖。
- 虚拟内存映射: 可以将文件映射到虚拟地址空间,直接访问文件内容而无需全部加载到内存。
Mach虚拟内存的数据结构
- 页表: 将虚拟地址映射到物理地址。
- 页目录: 包含指向页表的指针,用于快速查找。
- 内核地址空间: 内核使用的虚拟地址空间。
- 用户地址空间: 用户程序使用的虚拟地址空间。
Mach内核的内存操作接口
Mach内核提供了一组接口,用于执行内存操作:
- vm_allocate: 分配虚拟内存。
- vm_deallocate: 释放虚拟内存。
- vm_read: 从虚拟内存中读取数据。
- vm_write: 向虚拟内存中写入数据。
- vm_protect: 设置虚拟内存的保护属性。
Objective-C内存分配核心函数alloc
alloc是Objective-C中用于分配内存的关键函数。其源码为:
- (id)alloc {
Class cls = [self class];
id obj = (id)class_createInstance(cls, 0);
return obj;
}
iOS端内存报警机制
iOS端提供了内存报警机制,当内存使用超出特定阈值时触发。
设置内存报警:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
CFNotificationCenterGetDarwinNotifyCenter(),
memoryWarningCallback,
CFSTR("com.apple.coremedia.coremedia_client_event_system_memory_pressure_warning"),
NULL);
发送内存报警:
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(),
CFSTR("com.apple.coremedia.coremedia_client_event_system_memory_pressure_warning"),
NULL,
NULL,
YES);
常见的Mach虚拟内存问题解答
-
Mach虚拟内存与传统虚拟内存有何不同?
传统虚拟内存不支持多任务,而Mach虚拟内存提供多任务支持。 -
为什么Mach虚拟内存使用分页?
分页有助于优化内存使用,仅在需要时加载页面。 -
拷贝-在-写入机制如何提高性能?
它防止了页面在修改时相互覆盖,确保数据完整性。 -
如何分配Mach虚拟内存?
可以使用Mach内核接口vm_allocate()分配虚拟内存。 -
iOS端如何检测内存不足?
可以使用CFNotificationCenter设置内存报警,并在达到特定阈值时接收通知。