返回

Mach虚拟内存和OC内存管理详解

iOS

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虚拟内存问题解答

  1. Mach虚拟内存与传统虚拟内存有何不同?
    传统虚拟内存不支持多任务,而Mach虚拟内存提供多任务支持。

  2. 为什么Mach虚拟内存使用分页?
    分页有助于优化内存使用,仅在需要时加载页面。

  3. 拷贝-在-写入机制如何提高性能?
    它防止了页面在修改时相互覆盖,确保数据完整性。

  4. 如何分配Mach虚拟内存?
    可以使用Mach内核接口vm_allocate()分配虚拟内存。

  5. iOS端如何检测内存不足?
    可以使用CFNotificationCenter设置内存报警,并在达到特定阈值时接收通知。