App 运行流程
build 流程
1. 预编译 Preprocessing
1. .c —> .i
2. 删除#define 宏展开
3. 处理条件预编译指令
4. 处理预编译指令
5. 删除注释
6. 添加行号
7. 保留#pragma 编译器指令
2. 编译 Complication
1. 扫描
2. 语法分析
3. 词法分析
4. 语义分析
5. 优化后生成的汇编代码
6. .i —>.s
3. 汇编 Assembly
1. .s—> .o生成目标文件
2. 汇编器根据机器指令表将汇编代码生成机器指令
4. 链接 Linking 0-—符号
1. 地址和空间分配
2. 符号决议(符号绑定)
3. 重定位
4. 链接生成.out 可执行文件
5. 程序源代码被编译后主要分成两种段
1. 程序指令(代码段)
2. 程序数据 (数据段 .bbs)
1. 程序为什么被分为数据段和指令段?
1. 数据区对于进程readwrite
2. 指令区对于进程readonly
3. 防止程序指令被有意无意的改写
4. CPU缓存被分为数据缓存指令缓存 分区有利于CPU效率
5. 当系统中运行多个程序的副本时,指令是一样的,所以内存中只需要一份就可以
main 函数启动之前app 启动流程
1. main函数之前
1. main函数之前
1. 操作系统会调用当前app进程
2. 进程初始化
2. 初始化需要的线程
1. main-thread
2. kernthread - 子线程
3. gputools thread-子线程
3. _dyld_start
1. dyld main
2. initializemain
3. imageLoader runinitializers—>proress intializers—>recursive initlization
4. imageLoaderMach-O
1. doinit
2. domodinitfunc
5. dyld_notify
6. load_image
7. call_load_method
1. import 之后重写+load 方法的类会执行load方法
8. libsystem
9. libsystem_initializer
10. libsystem_init
11. _os_object_init
12. _objc_init
13. 执行main 函数
2. 分为以下几个阶段
1. Commond B —> Build 生成可执行文件Mach-O (mac || iOS 系统可执行文件)
1. 预编译
2. 编译
3. 汇编
4. 链接
2. Commond R —> Run
3. dyld start
4. 动态链接 ImageLoader 加载可执行文件, 里边是被编译过的符号,代码等
5. runtime与+load
6. main 函数入口
动态链接系统的库应该是动态库,不然N个应用不会加载N个UIKit
欢迎指正!
- 操作系统是应用程序和硬件之间的中间人,硬件中最主要的是CPU,处理应用事件。
- 有操作系统知道 CPU 正在处理哪个进程,下一个该处理哪个进程,哪个进程在等待,什么时候杀掉哪个进程
- CPU 执行的最小单元是线程Thread,有操作系统来调度线程,让CPU执行
- 每一个Thread 都有一个线程栈,有一个Runloop 监听事件保证程序被执行CPU别闲着,有一个autoreleasepool 内存管理
新建一个工程, 一行代码没有写,系统内存分布,可以看到链接了多少个库
进程.png GCD.png VM.png UIRemotekeyboard.png GoogleProtobuf.png《程序员的自我修养》 - 密码: rppr
《操作系统设计原理与精髓第六版》 - 密码: u2x5
网友评论