读书笔记:程序员的自我修养

上传人:zhu****ng 文档编号:245133013 上传时间:2024-10-07 格式:PPTX 页数:20 大小:280.38KB
返回 下载 相关 举报
读书笔记:程序员的自我修养_第1页
第1页 / 共20页
读书笔记:程序员的自我修养_第2页
第2页 / 共20页
读书笔记:程序员的自我修养_第3页
第3页 / 共20页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2011-6-6,#,程序员的自我修养,读书笔记,南桥:链接慢速设备,比如键盘,,USB,,磁盘,北桥:链接快速设备,比如,CPU,,,Memory,磁盘:每个盘片有两个盘面,每个盘面划分为多个磁道,每个磁道划分为多个扇区,一般每个扇区存储,512B,数据,程序直接访问物理内存;分段;分页,线程与可以调度的进程之间的关系:,1 VS 1,,,n vs 1,m VS n,,其中,RedHat,开发的,NPTL,是第一种,所以看起来线程频繁切换的调度开销会比较大,通过控制,.ctor and.dtor,应该可以控制全局变量的析构顺序。并且如果将所有的全局变量定义在一个,cpp,里面,其余只是引用应该可以保证构造和析构顺序的。但是这有时候好像挺难的,因为不符合模块化设计原则,线程优先级的改变,用户设定优先级,根据等待的频繁程度提升或者降低优先级,频繁等待,I/O,的线程被提升的可能性就大,长时间得不到执行的线程被提升优先级,Linux,的执行实体是,Task,,不同,Task,之间可以,share,内存和文件,所以本质上就是线程,Volatile,阻止编译器将变量放入寄存器而不写会,阻止编译器将操纵该变量的语句调序,修饰代码的时候则是指不要对以下语句做任何优化,Memory barrier,阻止编译器对指令进行调序,,barrier,两端的代码一定不会被调序,编译过程,预编译,编译,汇编,链接,可执行文件格式:,Windows:PE(portable executable),Linux:ELF(executable linkable format),均来自于,COFF(Common file format),ELF file types(shell command:file),Re-locatable file:code,data(*.o),static lib,Executable file:(runnable),Shared object file:*.so,Core dump file,ELF file structure,ELF header,.text(program text),.bss(uninitialized global data,not occupy space),.data(initialized global and local static data),.rodata(read only data),.comment,自定义段:,_attribute_(section(“x”)int global_var=3;,_attribute_(section(“x”)void print();,ELF,文件格式定义:,/usr/include/elf.h,文件中定义,Magic number,,在文件和一些内存结构中常常定义一些,magic number,用于确保该文件是有效的或者放置内存被写坏,Ld,静态链接时的一些特殊地址,_executable_start:,程序起始地址,_etext:,代码段结束地址,_edata:,数据段结束地址,_end,:,程序结束地址,Name decoration&function signature,foo-_foo(C programming),foo-_foo_(Fortran),Int C:foo(string):_ZN1C3fooEs,_ZN:fixed prefix,Size of namespace or class name,Name of namespace or class name,E:fixed string,Para type,So we can know why return value cannot differentiate overloading method in c+,because method signature does not include return type,强符号和弱符号,强符号:初始化的全局变量,函数,弱符号:未初始化的全局变量,_attribute_(weak),可以显式定义一个弱符号,强符号不允许重复定义,弱符号如果有重定义则分配空间按照大的那个,强引用和弱引用,不允许未定义的强引用,允许未定义的弱引用,_attribute_(weakref),可以显示定义弱引用,弱引用的好处是允许程序,link,用户自定义的方法,库;如果用户未定义的时候,则会,link,系统默认的方法,库,gcc g,加入调试信息到执行文件,标准调试信息格式:,DWARF(debug with arbitrary record format),调试信息会比较大,,strip x,可以去除调试信息,但是不建议因为线上调试很困难,ld e,一般采用两步链接,(two pass linking),读取所有输入文件,计算文件中各个段所需空间,将各个文件的同名段,merge,起来,并根据全局符号表调整地址,实际运行环境中,,ld,常被,collect2,代替,主要处理全局变量构造,/,析构的问题,绝对地址修正:,S+A,相对地址修正:,S+A-P,S,:符号地址,A,:被修正位置的值,P,:被修正的位置,COMMON,块,未初始化的全局变量是弱符号,在,link,之前其大小是未知的(其他文件可以定义同名的符号),因此放在,COMMON,块,最终,link,的时候放在,.bss,里面,每个类模板都是一个,section,这样就可以解决模板重复链接占用空间过大的问题,因为相同的,section,会只保留一个,如果两个,section,名字相同但是内容不同,会有,warning,有个特殊的段,.init:,在,main,函数执行之前执行,.fini,:,在,main,函数返回之后执行,静态库就是一组目标文件的集合:,ar t,*,.a:create,modify or extract from archives,链接控制脚本:控制链接行为,比如入口,如何,merge,各个段,是否丢弃某些段等,进程启动:,创建虚拟空间,即创建各种数据结构,建立虚拟空间与可执行文件的映射关系,将,CPU,指令寄存器设置成可执行文件入口,具有相同权限的段可能,share,同一个,VMA,(,virtual memory area),放入同一个物理页面,动态库链接,fPIC(position indepent code),模块内指令,数据:相对地址访问,模块间指令,数据:间接跳转(,GOT,global offset table,),GOT,表实现的动态链接会造成性能下降,5%,左右,所有又延迟绑定的技术,,PLT(Procedure Linkable Table),ldd,查看程序依赖那些共享库,有时候会看到,vfso,,这是虚拟出来的共享库,提供,sysenter,入口,加快栈保存,动态链接,启动动态链接器本身,加载需要的共享对象,重定位和初始化,系统自举之后会依次加载所有的动态库,这些动态库之间又有相互依赖,这些依赖关系构成了一个图,通过遍历图可以按照正确顺序加载所有库,全局符号介入,(global symbol interpose),:当一个符号需要被加入全局符号表时,如果该符号已经存在,则将后来的忽略,动态链接:动态链接器主动,load,共享对象,动态加载:程序运行过程中利用动态链接器提供的,API,加载库,动态链接,节省内存,方便升级特定模块,方便重用,装载时重定位无法再各个进程之间共享代码,效率略高;地址无关代码可以在各个进程间共享代码,效率略低,ldconfig,可以刷新,/lib,/usr/lib,等目录加载共享库,所以可以将共享库拷贝到上述目录中然后加载,void _attribute_(constructor(1)foo();,指定动态库加载前需要做的工作,指定优先级,数字小的先运行,void _attribute_(destructor(4)foo();,指定动态库退出后需要做的工作,指定优先级,数字大的先运行,压栈顺序:参数,返回地址,返回对象在,VC,和,GCC,均会被拷贝,两,次,所以要多使用引用和指针,进程执行函数顺序,lib_start_main,main,atexit,Bound,指针:第一个是,raw value,,第二个是存储下限值,第三个是存储上限值,容易检查越界访问,Alloca,在堆被初始化之前可以用来分配内存,该内存是分配在栈上的,程序退出自动释放,OS,拥有每个打开文件对象的信息,,OS,可以解释每个,FD,或者句柄到内核文件对象的映射,线程不安全函数:,strtok,,该函数使用了静态局部变量,,strtok_r,是安全的,,STL stream,库貌似使用了不安全函数,定义,TLS,数据,隐式定义:,_thread int num;,显示定义:,pthread_key_create,errorno,是,TLS,的一种,单线程时候,errorno,返回全局唯一地址;多线程时候每个线程,errorno,返回的地址都不同,每个便一单元都会有一个全局变量初始化函数指针,程序连接时候将所有这些函数指针收集起来然后由,do_global_ctor_aux,逐个执行,定义全局构造器:,ctor_t _attribute_(section(“.ctors”)void(*)(),void x()_attribute_(constructor),可以定义全局构造器,似乎无直接的意义,因为定义全局变量一样能够解决,而且更加直观,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!