嵌入式linux内存和性能优化

一直在做嵌入式Linux系统的内存和性能优化,试着把自己这一年多来的知识和经验系统化,总结出来。初步出来个东西,还在不断更新中。
1. 序 6
2. 内存 7
2.1. 系统当前可用内存 8
2.2. 进程的内存使用 9
2.2.1. 虚拟内存与物理内存 10
2.2.2. /proc/{pid} 11
2.2.3. 内存回收 17
2.3. 进程 19
2.3.1. 堆段 20
2.3.1.1. 小块内存分配 23
2.3.1.2. 大块内存分配 26
2.3.1.3. 内存释放 27
2.3.1.4. 内存空洞 29
2.3.1.5. 堆内存管理器参数总结 32
2.3.1.6. 内存的跟踪 32
2.3.1.7. 堆内存优化 34
2.3.2. 栈 34
2.3.2.1. 栈上申请内存 35
2.3.2.2. 栈的扩展 37
2.3.2.3. 栈的释放 38
2.3.2.4. 栈内存的优化 39
2.3.3. 环境变量及参数 39
2.3.3.1. 环境变量的存储 40
2.3.3.2. 新增环境变量 41
2.3.3.3. 修改环境变量 43
2.3.3.4. 释放环境变量 44
2.3.3.5. 环境变量内存优化 45
2.3.4. ELF文件 45
2.3.4.1. 常用工具 46
2.3.4.2. ELF文件 48
2.3.4.3. 程序瘦身 57
2.3.4.4. 程序的运行 60
2.3.5. 数据段 61
2.3.5.1. .bss 与 .data的区别 61
2.3.5.2. 变量所在内存区域 65
2.3.5.3. 关于数据段的优化 70
2.3.6. 代码段 74
2.3.7. 使用Thumb指令 75
2.3.7.1. Thumb指令的编译 76
2.3.7.2. ARM程序和Thumb程序混合使用 77
2.4. 动态库 80
2.4.1. 数据段 81
2.4.1.1. 共享库中的bss 81
2.4.1.2. 共享库数据段对进程数据段的影响 84
2.4.2. 代码段 87
2.4.2.1. 符号解析 87
2.4.2.2. 关于代码段共享 90
2.4.2.3. 导出函数对代码段的影响 90
2.4.2.4. 删除多余的导出符号 91
2.4.3. 动态库的优化 91
2.4.3.1. 减少bss节的数据 91
2.4.3.2. 无用的动态库 91
2.4.3.3. 动态库的合并 92
2.4.3.4. 仅被依赖一次的动态库 93
2.4.3.5. 使用dlopen来控制动态库的生存周期 93
2.5. 线程 96
2.5.1. 设置进程栈空间 99
2.5.2. 设置线程栈空间 100
2.5.3. 减少线程的数量 101
2.6. 共享内存 101
2.7. 内存调试 103
2.7.1. mtrace 103
2.7.2. malloc and free 钩子函数 104
2.7.3. 栈的回溯 126
2.7.4. 化整为零法 129
2.7.5. dmalloc 130
2.7.6. valgrind 132
2.8. 嵌入式系统 139
2.8.1. tmpfs分区 140
2.8.2. Cache与Buffer 140
2.8.3. 内存交换与回收 142
2.8.4. 减少守护进程数量 144
2.8.5. /proc/sys/vm/优化 145
2.8.6. 系统内存分析 147
3. 速度 147
3.1. 性能评价 147
3.2. 性能优化的方法 148
3.3. 性能的评测 149
3.3.1. Proc目录 150
3.3.1.1. 系统相关 150
3.3.1.2. 进程相关 151
3.3.2. 相关工具 153
3.3.2.1. top 153
3.3.2.2. lmbench 153
3.3.2.3. vmstat 155
3.4. 优化基本原则 159
3.5. shell脚本优化 160
3.5.1. Builts-in和applets 160
3.5.2. bash脚本 161
3.5.3. 如何优化Busybox bash脚本 161
3.5.4. Bash脚本优化 161
3.6. 进程启动速度 161
3.6.1. 查看动态库的加载过程 162
3.6.2. 减少加载动态库的数量 163
3.6.3. 共享库的搜索路径 163
3.6.4. 动态库的层次 166
3.6.5. 动态库的初始化 166
3.6.5.1. 动态库的构造和析构函数机制 167
3.6.5.2. 全局变量初始化 167
3.6.6. Prelink 169
3.6.6.1. Prelink会带来内存使用上的增长 172
3.6.7. 提高进程启动速度 178
3.6.7.1. 进程改为线程 178
3.6.7.2. Preload进程 179
3.7. 优化思路 180
3.8. 查找性能瓶颈 181
3.8.1. gprof 181
3.8.1.1. 基本用法: 182
3.8.1.2. gprof与动态库 184
3.8.1.3. gprof与多线程 186
3.8.2. OProfile 186
3.8.2.1. Oprofile范例 186
3.8.2.2. 多个文件 190
3.8.2.3. Oprofile与动态库 193
3.8.2.4. Oprofile与多线程 198
3.8.2.5. 在嵌入式环境下的OProfile 201
3.9. 优化的层次 203
3.10. 算法优化 204
3.10.1. 查表法 205
3.10.2. 使用异步通讯替代多线程 207
3.11. GCC编译优化 213
3.11.1. 体系无关优化 214
3.11.2. 内部连接和外部连接 218
3.12. 程序的优化 225
3.12.1. 数据类型 225
3.12.2. 慢操作 227
3.12.3. if 与switch的性能比较 227
3.12.4. 循环 231
3.12.5. 函数 235
3.12.6. 数组 238
3.12.7. 浮点 238
3.12.7.1. 软浮点与硬浮点 240
3.12.8. 结构体 242
3.12.9. 除法 243
3.12.10. inline内联函数 248
3.12.11. C 249
3.12.11.1. 在声明对象时进行初始化 249
3.12.11.2. 构造函数和析构函数 249
3.12.11.3. 构造函数初始化列表 250
3.12.11.4. 参数与返回值 251
3.12.12. 使用mmap来优化大文件操作 252
3.12.13. ARM体系结构相关 254
3.12.13.1. ARM指令简介 255
3.12.13.2. ARM寄存器 257
3.12.14. 内存 257
3.12.14.1. 消除数据的相关性 261
3.12.14.2. 同时向内存控制器发送多个查询 262
3.12.14.3. 请求按不少于32个字节的增量方式读取数据 262
3.12.14.4. 建议 262
3.12.14.5. 消除数据相关性 263
3.12.15. cache 263
3.13. 硬加速 263
3.13.1. SIMD加速 263
3.14. 整体调优 264
3.14.1. 进程执行速度与空闲内存的关系 264
3.14.2. 调整进程的优先级 265
3.14.3. shutdown、reboot的区别 267
3.14.4. 设备的启动时间 268
3.14.5. damon的数量 269
3.14.6. 文件系统 270
3.14.7. 使用lmbench检查系统瓶颈 273
3.14.8. 系统待机时间 275
4. 附录 288
4.1. gcc与g 的不同 288
4.2. 代码段和数据段优化 290
4.3. Advanced SIMD data-processing instructions 300
4.3.1. Advanced SIMD integer ALU instructions 304
4.3.2. Advanced SIMD floating-point instructions 307
4.3.3. ARMv6 SIMD intrinsics 309
4.3.4. Note 310
希望这篇文档能对大家有所帮助。
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window/nCTRL Mouse wheel to zoom in/out';}" οnmοuseοver="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window/nCTRL Mouse wheel to zoom in/out';}" οnclick="if(!this.resized) {return true;} else {window.open('http:///fileicon/pdf.gif');}" onmousewheel="return imgzoom(this);" alt="" />

文件:Linux性能详解.pdf
大小:2056KB
下载:
下载

你可能感兴趣的:(嵌入式学习)