Optimizing App Startup Time

Optimizing App Startup Time

内容来自官方视频Optimizing App Startup Time

Mach-O

Mach-O是运行时可执行文件的文件类型。一些术语表

  • Executable - Main binary for application 可执行文件,应用扩展文件的主二进制文件
  • Dylib - Dynamic library (aka DSO or DLL) 动态库,在其他平台上,可能是DSO 或者 DLL
  • Bundle - Dylib that cannot be linked, only dlopen(), e.g. plug-ins 一种特殊的Dylib,是不能进行链接的,只能在运行时通过dlopen()函数打开它

Image - An executable, dylib, or bundle 指的是任意这三种类型
Framework - Dylib with directory for resources and headers 一个Dylib,带有特别的目录结构,存储Dylib需要的文件

Mach-O Image File

Optimizing App Startup Time
Mach-O Image文件被分成数段(segment),所有的段名都是由大写字母组成
分区(section)是段的子范围
最常见的段名是:

  • TEXT( has header, code, and read-only constants) - 文件的开头,包含任何的Mach的头文件,任何机器指令,以及任何只读常量,比如C字符串
  • DATA(has all read-write content: globals, static variables, etc) - 所有的全局变量
  • LINKEDIT(has "meta data” about how to load the program)- 不包含全局变量的函数,它包含变量函数信息,比如名称和地址

Mach-O Universal Files

Mach-O通用文件,例如如下的一个64为的Mach-O文件,一个32位的Mach-O文件
Optimizing App Startup Time
2个文件合并成一个文件,叫做Mach-O通用文件,它前端有一个头文件,所有的头文件都有一个所有体系结构的列表,它们的偏移值也在文件里
Optimizing App Startup Time

Virtual Memory

虚拟内存的介绍可参考《程序员的自我修养》
虚拟内存解决的问题是,所有这些进程存在时,如何管理所有物理内存?
每一个进程都是一个逻辑地址空间,映射到RAM的某个物理页面,这种映射不一定是一对一的,逻辑地址可以不对应任何物理RAM,也可以多个逻辑地址对应一个物理RAM

  • 如果一个逻辑地址不映射任何物理RAM,当进程将要访问该地址时就会产生页面错误Page fault,内核将停止该线程

  • 如果有两个进程,有两个逻辑地址映射同一个物理页面,这两个进程共享一样的RAM

  • 可以通过mmap调用告诉VM系统,而不是将整个文件实际读取到RAM中,我希望在我的进程中将此文件的这一部分映射到该地址范围

    So why would you do that? Well rather than having to read the entire file, by having that mapping set up, as you first access those different addresses, as if you had read it in memory, each time you access an address that hasn’t been accessed before it will cause a page fault, the kernel will read just that one page. And that gives you lazy reading of your file.
    那为什么要这么做呢? 而不是必须通过设置映射来读取整个文件,因为您第一次访问这些不同的地址时,就像您已经在内存中读取它一样,每次访问的地址在访问之前都没有被访问过,这会导致页面错误,内核将仅读取该页面。 这使您可以lazy read文件。
    dylib或者image的任何一个TEXT段可以被映射到多个进程中,它将会被lazy read,并且所有的page可以在进程间共享

  • Copy-On-Write (COW)

    DATA是可读可写的,copy on write的作用是在所有的进程间共享DATA page
    一旦一个进程实际尝试写入其DATA页面,就会进行复制和写入。
    复制和写入使内核将该页面的副本复制到另一个物理RAM中,然后将映射重定向到该物理RAM。 因此,一个进程现在拥有该页面的副本。

  • Dirty vs. clean pages

    copy的被视为dirty page。dirty page是包含进程特定信息的内容。
    clean page是内核在以后需要时可以重新生成的内容,例如从磁盘重新读取。

Mach-O Image Loading