面试宝点

iOS-虚拟内存

2022-09-06  本文已影响0人  笑破天

虚拟内存是对内存的一个抽象。支持虚拟内存的CPU需要通过虚拟寻址的方式来引用内存中的数据。CPU加载一个虚拟地址,然后发送给MMU进行地址翻译,MMU借助页表来获得物理地址。

物理内存

物理内存指的是内存条上的内存,早期一个进程的数据是全部加载在物理内存上,CPU直接通过物理内存地址来访问进程数据。这种方式会产生以下几个问题:

为了解决物理内存的这几个问题,CPU访问进程数据就不能直接通过物理内存地址,而是通过虚拟内存来间接访问。

虚拟内存

虚拟内存是计算机系统内存管理的一种技术,虚拟内存为每个进程提供了一个连续、私有的地址空间,它每个进程会认为自己在使用一块大的连续的内存。事实上,每个进程的内存散布在物理内存的不同区域。或者可能被调出到备份存储中(一般在硬盘)。当一个进程请求自己的内存,操作系统负责把程序生成的虚拟地址,映射到实际存储的物理内存上。操作系统在分页表中存储虚拟地址到物理地址的映射。

image.png image.png

寻址

现代处理器使用的是一种称为 虚拟寻址(Virtual Addressing) 的寻址方式。使用虚拟寻址,CPU需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有一个被称为 内存管理单元(Memory Management Unit, MMU)的硬件。MMU 需要借助存放在内存中的页表来动态翻译虚拟地址,该页表由操作系统管理。

内存分页

虚拟内存管理器对虚拟内存地址,划分为大小统一的内存块,称为 内存页,处理器及其内存管理单元(MMU)维护一个页表,此页表是程序的逻辑地址对计算机RAM中的物理地址的映射。当程序代码访问内存中的地址时,MMU使用页表将指定的逻辑地址转换为实际的硬件内存地址。
系统将内存页分为三种状态。
活跃内存页(active pages)- 这种内存页已经被映射到物理内存中,而且近期被访问过,处于活跃状态。
非活跃内存页(inactive pages)- 这种内存页已经被映射到物理内存中,但是近期没有被访问过。
可用的内存页(free pages)- 没有关联到虚拟内存页的物理内存页集合。
当可用的内存页降低到一定的阀值时,系统就会采取低内存应对措施,在OSX中,系统会将非活跃内存页交换到硬盘上,而在iOS中,则会触发Memory Warning,如果你的App没有处理低内存警告并且还在后台占用太多内存,则有可能被杀掉。

VM Region

一个 VM Region 是指一段连续的内存页(在虚拟地址空间里),这些页拥有相同的属性(如读写权限、是否是 wired,也就是是否能被 page out)。举几个例子:
mapped file,即映射到磁盘的一个文件
__TEXT,r-x,多数为二进制
_DATA,rw-,为可读写数据
MALLOC(SIZE),顾名思义是 malloc 申请的内存

VM Object

每个 VM Region 对应一个数据结构,名为 VM Object。Object 会记录这个 Region 内存的属性

参考:

iOS虚拟内存
iOS虚拟内存与内存分页

上一篇下一篇

猜你喜欢

热点阅读