iOS-二进制重排(二)

164 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

通过问题看本质!!!

通过前文,我们得出结论,二进制重排能够优化启动时间,但是为什么二进制重排之后能够优化呢?我们就必须了解APP启动时,程序是如何加载到内存的了。

APP启动过程

APP启动前,APP的进程不在系统里,需要系统创建进程分配给APP。 APP启动,加载到内存的时候,出于安全和效率方面的考虑,并不会把整个应用程序都加载到物理内存中。 苹果系统会为每一个进程都提供了一个独立且受保护的虚拟空间,而虚拟内存和物理内存通过映射表进行映射。

物理内存是以页的形式存在的,而映射表同样也是以页为单位。

当应用程序被加载到内存的时候,并不会把整个应用程序加载到内存中,只会加载用到的一部分。 当访问到某个地址时,如果映射表中对应的物理地址不存在,就会触发页中断,阻塞进程,系统会先从磁盘把数据读到物理内存中,再把映射表中虚拟地址指向对应的物理地址,然后再继续访问。如果内存满了,系统就会根据置换算法,找一页覆盖。

页中断会触发进程阻塞,在release模式下也会对签名验证,所以对启动性能有一定的影响。

所以说,我们通过二进制重排把启动时的符号放在前面就能达到优化效果。就好比柜子的抽屉,我们把经常用的东西放在上面的抽屉,这样就能更加方便,更加省时省力。