- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《成都ios培训:优化App的启动时间
成都ios培训:优化 App 的启动时间 这是一篇学习笔记,从原理到实践讲述了如何优化 App 的启动时间。 App 运行理论 main() 执行前发生的事 Mach-O 格式 虚拟内存基础 Mach-O 二进制的加载 理论速成 Mach-O 术语 Mach-O 是针对不同运行时可执行文件的文件类型。 文件类型: Executable: 应用的主要二进制 Dylib: 动态链接库(又称 DSO 或 DLL) Bundle: 不能被链接的 Dylib,只能在运行时使用 dlopen() 加载,可当做 macOS 的插件。 Image: executable,dylib 或 bundle Framework: 包含 Dylib 以及资源文件和头文件的文件夹 Mach-O 镜像文件 Mach-O 被划分成一些 segement,每个 segement 又被划分成一些 section。 segment 的名字都是大写的,且空间大小为页的整数。页的大小跟硬件有关,在 arm64 架构一页是 16KB,其余为 4KB。 section 虽然没有整数倍页大小的限制,但是 section 之间不会有重叠。 几乎所有 Mach-O 都包含这三个段(segment): __TEXT,__DATA 和 __LINKEDIT: __TEXT 包含 Mach header,被执行的代码和只读常量(如C 字符串)。只读可执行(r-x)。 __DATA 包含全局变量,静态变量等。可读写(rw-)。 __LINKEDIT 包含了加载程序的『元数据』,比如函数的名称和地址。只读(r–)。 Mach-O Universal 文件 FAT 二进制文件,将多种架构的 Mach-O 文件合并而成。它通过 Fat Header 来记录不同架构在文件中的偏移量,Fat Header 占一页的空间。 按分页来存储这些 segement 和 header 会浪费空间,但这有利于虚拟内存的实现。 虚拟内存 虚拟内存就是一层间接寻址(indirection)。软件工程中有句格言就是任何问题都能通过添加一个间接层来解决。虚拟内存解决的是管理所有进程使用物理 RAM 的问题。通过添加间接层来让每个进程使用逻辑地址空间,它可以映射到 RAM 上的某个物理页上。这种映射不是一对一的,逻辑地址可能映射不到 RAM 上,也可能有多个逻辑地址映射到同一个物理 RAM 上。针对第一种情况,当进程要存储逻辑地址内容时会触发 page fault;第二种情况就是多进程共享内存。 对于文件可以不用一次性读入整个文件,可以使用分页映射(mmap())的方式读取。也就是把文件某个片段映射到进程逻辑内存的某个页上。当某个想要读取的页没有在内存中,就会触发 page fault,内核只会读入那一页,实现文件的懒加载。 也就是说 Mach-O 文件中的 __TEXT 段可以映射到多个进程,并可以懒加载,且进程之间共享内存。__DATA 段是可读写的。这里使用到了 Copy-On-Write 技术,简称 COW。也就是多个进程共享一页内存空间时,一旦有进程要做写操作,它会先将这页内存内容复制一份出来,然后重新映射逻辑地址到新的 RAM 页上。也就是这个进程自己拥有了那页内存的拷贝。这就涉及到了 clean/dirty page 的概念。dirty page 含有进程自己的信息,而 clean page 可以被内核重新生成(重新读磁盘)。所以 dirty page 的代价大于 clean page。 Mach-O 镜像 加载 所以在多个进程加载 Mach-O 镜像时 __TEXT 和 __LINKEDIT 因为只读,都是可以共享内存的。而 __DATA 因为可读写,就会产生 dirty page。当 dyld 执行结束后,__LINKEDIT 就没用了,对应的内存页会被回收。 安全 ASLR(Address Space Layout Randomization):地址空间布局随机化,镜像会在随机的地址上加载。这其实是一二十年前的旧技术了。 代码签名:可能我们认为 Xcode 会把整个文件都做加密 hash 并用做数字签名。其实为了在运行时验证 Mach-O 文件的签名,并不是每次重复读入整个文件,而是把每页内容都生成一个单独的加密散列值,并存储在 __LINKEDIT 中。这使得文件每页的内容都能及时被校验确并保不被篡改。 从 exec() 到 main() exec() 是一个系统调用。系统内核把应用映射到新的地址空间,且每次起始位置都是随机的(因为使用 ASLR)。并将起始位置到0x000000 这段范围的进程权限都标记为不可读写不可执行。如果是 32 位进程,这个范围至少是 4KB;对于 64 位进程则至少是
您可能关注的文档
- 《初中英语词组短语复习纲要.doc
- 《初中英语语法之非谓语动词.docx
- 《初中英语语法归类学习.doc
- 《初中英语语法总结七——动词.doc
- 《初中英语语法最有用的150条英语短语句型.doc
- 《初中英语语法结构词组.doc
- 《初中英语课中如何进行阅读课教学.doc
- 《初中英语课例研究报告正稿.doc
- 《初中英语课后作业的个性化设计与评价的研究.doc
- 《初中英语课堂导入方法的初探.doc
- 广东省河源市高职单招2022-2023学年医学综合真题及答案.pdf
- 建筑制图及识图试题含答案.pdf
- 2024年深圳市高三年级第二次调研(二模) 语文试卷.pdf
- 2023届江苏省常熟市第一中学中考英语最后一模试卷(含解析).pdf
- 小升初|小学语文古诗填空100题(含答案),背过他,用得着!.pdf
- 2022-2023学年浙江省杭州市萧山区人教版三年级下册期末学科素养评价数学试卷.pdf
- 2022-2023学年黑龙江省绥化市统招专升本教育理论月考卷(含答案).pdf
- 2023年山西省大同市新荣区小升初数学试卷(含答案).pdf
- 2024年初一语文下册的教学计划范本(3篇).pdf
- 2022-2023学年四川省宜宾市叙州区人教版六年级上册期末学业监测数学试卷1625.pdf
文档评论(0)