读书笔记之《Linux内存使用与性能优化》
关注Linux应用在内存方面的优化,资源上的调整,neon的使用
楼兰公子
这个作者很懒,什么都没留下…
展开
-
lseek的作用
lseek(fd,0,SEEK_CUR)可以用来判断句柄是否为管道,FIFO,或者网络套接字原创 2020-07-08 20:52:53 · 294 阅读 · 0 评论 -
从代码角度优化编译速度
加快代码编译速度 1.在头文件中使用前置声明,而不是直接包含头文件 2.类的成员,函数参数等尽量使用引用指针,为前置声明创造条件 3.Pimpl模式,Private Implementation,使得类的接口与实现完全分离,保持类的公共接口不变,对类实现的修改时钟只编译cpp,,类提供给外界的头文件也会精简 4.模块化,减少相互依赖---1)文件之间,一个头文件变化尽量不要引起其他文件编译 2)工程之间,一个工程修改,尽量不引起太多其他工程编译 3)即头.原创 2020-06-15 13:39:28 · 209 阅读 · 0 评论 -
hyper_graph.h:41:10: fatal error: 'tr1/unordered_map' file not found
#if(__cplusplus == 201103L)#include <unordered_map>#include <unordered_set>#else#include <tr1/unordered_map>#include <tr1/unordered_set>namespace std{ using std::tr1...原创 2020-05-03 17:54:38 · 1101 阅读 · 0 评论 -
优化之pause的使用
example_execute.c: 在函数‘main’中:example_execute.c:22:5: 警告: implicit declaration of function ‘pause’; did you mean ‘pclose’? [-Wimplicit-function-declaration] pause(); ^~~~~ pclose...原创 2020-03-31 23:17:46 · 237 阅读 · 0 评论 -
Linux性能優化之CPU
可運行的進程不一定占用CPU linux調度器決定下一個要運行的進程時會從可運行進程隊列中挑選 進程可運行並且在等待處理器,則構成運行隊列 運行隊列越長,處於等待狀態的進程越多性能工具兩種情況可運行進程個數和等待I/O的阻塞進程個數 系統平均負載,負載指的是正在運行和可運行的進程總數,平均負載是給定時間內的負載量,一般取值1min,5min,15min...原创 2020-03-19 19:41:35 · 63 阅读 · 0 评论 -
性能追踪建议
一、 常用建议 • 记录大量笔记 1. 每一行输出,每一个操作,每一个信息,只需看记录,直奔主题 2. 记录软硬件配置(CPU/主存储器/网络子系统/磁盘子系统、OS&APP版本/编译器版本/配置信息) 3. 保存并组织性能结果 4. 写下命令行调用甚至保存成可以复用的脚本 5. 记录研究信息和url甚至是网页打印保存 ...原创 2020-03-17 17:54:53 · 91 阅读 · 0 评论 -
gdb调试常用指令
info frameframe 0up 上一帧disassmeble /m func 查看带源码的汇编displaygdb v=1 查看启动调试的详细步骤原创 2020-03-04 10:57:20 · 159 阅读 · 0 评论 -
优化之静态库&动态库区别
静态库在程序编译时被链接到目标代码,运行时不必加载 动态库编译时不被链接,执行时才载入 静态库链接时,只是简单的把静态库全部内容复制到动态库中...原创 2020-03-01 01:12:06 · 184 阅读 · 0 评论 -
优化之动态库优化
减少bss节数据 无用的动态库 动态库的合并 仅被依赖一次的动态库 使用dlopen控制动态库的生存周期原创 2020-04-01 00:05:22 · 169 阅读 · 0 评论 -
优化之动态库特点
动态库的加载方式 静态加载 程序在编译时加上"-l"选项,指定其所依赖的动态库,程序运行时,loader会预先将程序所依赖的所有动态哭加载到进程空间中 优势,动态库借口调用简单,可直接调用 缺点:动态库的生存周期等于进程生存周期,加载不灵活 动态加载 在程序中调用函数(dlopen,dlclose)来控制动态库加载与卸载 优势:时机灵活,可以细致定义动态库生存周期...原创 2020-03-01 01:02:25 · 258 阅读 · 0 评论 -
优化之arm程序和Thumb程序混合使用
Thumb比ARM程序更加紧凑,对于内存为8位或16位的系统Thumb更高效。但是arm和Thumb可以混用强调速度的场合 有一些功能只有arm程序能完成。例如使用或禁止异常中断只能在arm状态完成 当处理器进入异常中断处理程序时,程序状态自动切换到arm状态,及时异常中断处理入口是arm指令,然后根据需要切换到Thumb状态,在异常中断处理程序返回前,程序再切回到arm状态 arm处理器...原创 2020-03-01 00:23:32 · 710 阅读 · 0 评论 -
C++代码段优化
section 在编译执行文件时不要使用“-export-dynamic" 优化.rodata节。主要存放一些常亮,建议在一些不修改的全局变量前加const,将其移动到.rodata节,利用代码段系统共享的特性节约内存,将const常两修改为宏定义,使其作为立即数编译到代码中 优化text节,text节主要包括编译后的执行指令,主要有两种方法 删除冗余代码,即使冗余代码(未使用...原创 2020-03-01 00:14:54 · 252 阅读 · 0 评论 -
G++和GCC的实现细节区别
编译单元 test 在c、cpp文件在编译时,预处理器首先递归包含头文件形成一个含有所有必要信息的单个源文件,此源文件就是一个编译单元。他会被编译成同名目标文件。链接程序把不同的编译单元中产生的符号链接构成可执行程序 链接属性 /*1.内部链接:该变量只是在当前的编译单元生效,在同一编译单元中不允许有同名的变量2.外部链接:该变量不只局限于当前的编译单元,在所有编译单元中生效...原创 2020-02-29 23:35:54 · 159 阅读 · 0 评论 -
代码编写的宗旨
不要在头文件里定义变量原创 2020-02-29 22:50:07 · 111 阅读 · 0 评论 -
内存优化之非内置类型的全局变量的初始化过程
G++在编译时,为这些非内置类型的全局变量,在.bss节预留了内存空间;同时在.init_array节安排了全局变量的构造函数 在程序运行时,在mmap将数据段映射进入内存之后,调用位于.init_array节的全局对象的构造函数,将全局对象创建出来 执行main函数内的代码 C语言编写的进程,在运行时只是通过mmap为其数据段分配一段虚拟内存,只有在实际用到时才会分配物理内存 C++程序...原创 2020-02-29 22:46:57 · 370 阅读 · 0 评论 -
C++任意对象的大小
静态成员和非静态成员函数,主要占据代码段内存,生成对象,不会再占用内存 费静态数据成员是影响对象占据内存大小的主要因素,随着对象数据的增加,非静态数据成员占据的内存会相应增加 所有的对象共享一份静态数据成员,所以静态数据成员占据的内存的数量不会随着对象的数据的增加而增加 如果对象中包含虚函数,会增加4个字节的空间,不论有多少个虚函数 非内置类型的全局变量属于.bss节...原创 2020-02-29 21:32:54 · 122 阅读 · 0 评论 -
优化之stack自动释放
../elinux_optimize/stack_mem_autorelease.c: 在函数‘main’中:../elinux_optimize/stack_mem_autorelease.c:6:14: 警告: 隐式声明函数‘alloca’ [-Wimplicit-function-declaration] int* p = alloca(1024); ...原创 2020-02-23 14:46:48 · 275 阅读 · 0 评论 -
优化之如何降低频繁申请&&释放内存
1,一次多申请些内存,可以降低申请频次2,释放一块内存时,不是直接返还系统,而是将其缓存住,留待下次分配3,以上操作可以降低系统调用频次,提高进程效率...原创 2020-02-23 00:15:30 · 708 阅读 · 0 评论 -
优化之glibc内存管理
P=1,表示上一块正在被使用,此时prev_size通常为0P=0,表示上一块空闲,这时prev_size通常为上一块的大小M=1,表示该内存块通过mmap来分配,只有在分配大块内存时,才采用mmap的方式,那么在释放时会由mumap_chunk()去释放,否则释放时由chunk_free()完成M=0,则表示该内存块不采用mmap方式分配glibc内存管理使用br...原创 2020-02-22 23:25:21 · 257 阅读 · 0 评论 -
优化之malloc函数实现逻辑
分配:Linux内核中专门为进程分配一段内存地址,用来存放的内容 进程申请内存的增加,进程会通过系统调用brk调高堆顶地址 扩展内存空间,从而Linux内核分配给进程更多的内存释放: 进程释放内存时,进程优惠通过系统调用brk调低堆顶地址,缩减这段内存空间 Linux内核便会将其中一部分物理内存回收存在的问题 是否为每次调用malloc ,new时都会调用系统调...原创 2020-02-22 22:49:32 · 304 阅读 · 0 评论 -
优化之为什么malloc时,要求输入内存区域大小:而在free时,不需要输入内存区域大小
当程序调用函数malloc申请内存时,并不是直接向操作系统申请,而是先由glibc内存管理器接收到请求,其分配一块内存病将内存地址返回给用户,同时在(p-4)这个地址记录下malloc空间的大小,glibc在free这块内存的时,在(p-4)的这个地址获得分配内存的大小,释放该快内存...原创 2020-02-22 22:36:09 · 756 阅读 · 0 评论 -
进程运行占用内存分为几部分
栈区(stack):由编译器自动分配释放,存放函数的参数,局部变量等 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可有操作系统来回收 全局变量,静态变量:初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在另一块区域,程序结束后由系统释放 文字常量:常量,字符串就是放在这里,程序结束后由系统释放 程序代码:存放函数体的二进制代码/**@a...原创 2020-02-22 22:04:39 · 679 阅读 · 0 评论 -
优化之堆段,栈段,数据段,代码段与进程,线程之间的关系
堆段,每一个进程有一个,不论是主进程,动态库还是不同的线程里申请的堆内存,都反映在进程的堆段 栈段,每一个线程有一个,如果进程有多个线程,则包含多个栈段 代码段,由于其只读,不会被修改,故其在整个系统内共享。比如说一个执行文件,在系统中同时存在多个进程,那么这些进程将共享其代码段所占用的内存 数据段,由于它是可写的,其内容与其所在的进程高度相关,所以在程序运行时会为每一个进程创建一个数据段的...原创 2020-02-22 21:14:14 · 493 阅读 · 0 评论 -
优化之优化标准
所有守护进程所占内存只能比发布的上一个版本所占的内存少 Dirty Page排在前10名的守护进程,要努力去优化,dirty page总量要减少20%优化的主要类别执行文件所占用的内存 动态库对内存的影响 线程对内存的影响...原创 2020-02-22 14:44:17 · 208 阅读 · 0 评论 -
优化之判定dirty page
不能从proc目录家的maps和memmap文件中获得,应该是自行编写一个模块加载Linux内核中,从而获得进程中每一个页面的dirty 属性原创 2020-02-22 14:25:36 · 221 阅读 · 0 评论 -
优化之dirty page
Linux物理内存中每一个界面都有一个dirty标志,如果该页面被改写了,就称之为dirty page总的来说,所有非dirty page的物理页面都可以回收进程所使用的dirty page及消除了进程代码段在系统中共享带来的统计困难消除了Linux内存回收对进程内存使用量的影响...原创 2020-02-22 14:20:13 · 817 阅读 · 0 评论 -
优化之虚拟内存与物理内存有多大?
虚拟内存是210B,物理内存是4KB原因:内核分配物理内存的最小单位为一个物理页面 一个物理页面为4KB原创 2020-02-22 11:35:00 · 254 阅读 · 0 评论 -
优化之解决内存泄露
不要让进程成为一个守护进程,完成后立刻退出,Linux会自动回收该进程所占有的内存,这样程序即使有一些内存泄露,也无关大局,原创 2020-02-21 17:58:38 · 97 阅读 · 0 评论 -
大小端
数据以何种方式在存储器中被存储和引用单芯片不仅包含小端的OS环境,界面(例如USB,PCI)大端的数据(TCP/IP包,MPEG流)ARM v6体系结构支持二者混合ARM V6体系结构支持未对齐数据未对齐数据是值数据未与自然边界对其...原创 2020-02-17 19:36:50 · 84 阅读 · 0 评论 -
优化之循环展开
代码如下:#include<stdio.h>#include<stdlib.h>#include<sys/time.h>void printtime(struct timeval a1,struct timeval a2){ long time = 1000000*(a2.tv_sec-a1.tv_sec)+a2.tv_usec-a1.tv_us...原创 2020-02-16 15:17:09 · 219 阅读 · 0 评论 -
C++ 之纯函数
纯函数是指不会影响它自己范围外任何事情的函数1,可以读取全局变量或者通过指针传递的变量,但不可以进行写操作2,不可以读取volatile变量和外部资源(文件)3,函数结果依赖于参数和全局以及内存变量...原创 2020-02-16 15:01:48 · 573 阅读 · 0 评论 -
C++ 汇编以及调试源代码
#include <stdio.h>int addme(int a, int b){ int c ; c = a+ b; return c;}int main(int argc, char const *argv[]){ int ret= 0; ret = addme(10,20); printf("%d\n", ret);...原创 2020-02-16 00:41:28 · 196 阅读 · 0 评论 -
优化之应用依赖
linux 下查看程序的依赖库objdump -x app |grep NEEDEDLinux下查看库文件被使用lsof *.so原创 2020-02-16 00:24:03 · 85 阅读 · 0 评论 -
C++ 源码汇编报错
gcc -S builtin_gcc.cpp -o builtin_gcc.sbuiltin_gcc.cpp: In function ‘int passthrough(int, int, int)’:builtin_gcc.cpp:14:46: error: invalid conversion from ‘void (*)()’ to ‘void (*)(...)’ [-fpermissi...原创 2020-02-16 00:39:41 · 534 阅读 · 0 评论 -
C++ 源代码汇编源码时报错
gcc -S builtin_gcc.i -o builtin_gcc.sIn file included from builtin_gcc.cpp:1:0:/usr/include/stdio.h:29:8: error: expected identifier or ‘(’ before string constant__BEGIN_DECLS ^~~builtin_...原创 2020-02-16 00:19:21 · 835 阅读 · 1 评论 -
优化之基本原则
1.等效原则,优化前后程序实现的功能一致2.有效原则,优化后要比优化前运行速度快或占用存储空间小,或者二者兼之3.经济原则,优化程序要付出较小的代价,取得较好的结果...原创 2020-02-16 00:05:27 · 911 阅读 · 0 评论 -
优化之代码优化三部分
1.标准C代码优化,包括C语言的基本元素:数据类型,变量类型,循环,函数,文件操作等优化2.C++代码优化,主要是类相关的代码优化,,包括成员变量,成员函数等3.与硬件相关的优化,程序优化第二境界,代码运行是如何在系统中运行的,其中包括CPU内部流水线,内存访问以及CPU上面的Cache。...原创 2020-02-16 00:04:54 · 559 阅读 · 0 评论 -
优化之gcc,g++区别
#include<stdio.h>int average(int a,int b,int c){ return (a+b+c)/3;}int passthrough(int a,int b,int c){ void *record; void *playback; void (*fn)() =(void(*)())average; ...原创 2020-02-16 00:04:29 · 156 阅读 · 0 评论 -
优化之性能优化的方法
寻找程序热点 程序逻辑瓶颈 优化的层次 何时开始性能优化 如何推动系统性能优化 为什么性能低下 程序逻辑优化原创 2020-04-01 00:05:43 · 127 阅读 · 0 评论 -
优化之进程启动速度
查看进程启动过程 减少加载的动态库数量 共享库搜索路径 动态库的高度 动态库的初始化 动态链接 提高进程启动速度 进程的冷启和热启区别原创 2020-02-15 18:50:26 · 107 阅读 · 0 评论