程序员的修养--读书笔记

第一章 温故而知新安全

-- cpu、内存、显示设备、io设备早期都连接在一个总线上。后来出现了北桥芯片使得cpu,内存和高速的图形设备可以高速的交换数据。南桥芯片处理低速设备,好比磁盘,usb,键盘,鼠标等设备。
--名言 计算机科学领域的任何问题均可以经过增长一个间接的中间层来解决。
--充分利用cpu:分时系统(每一个程序运行一段时间之后都主动让出cpu给其余程序),多任务系统(操做系统接管了全部的硬件资源,全部应用程序都以进程的方式运行在比操做系统权限更低的级别,每一个进程都有本身独立的地址空间,使得进程之间的地址空间相互隔离。Cpu由操做系通通一分配,先根据进程优先级的高低分配,可是运行超过必定时间后,操做系统会暂停该进程,将cpu分配给其余等待的进程,这叫作抢先式)。
--虚拟地址:把程序给出的地址看做一种虚拟地址,经过某些映射的方法,将这个虚拟地址转换为实际的物理地址。分页的策略:把地址空间人为地等分为固定大小的页,每一页的大小由硬件决定,或者硬件支持多种大小的也,由操做系统选择决定页的大小。当咱们把进程的虚拟地址空间按页分割,把经常使用的数据和代码页装载到内存中,把不经常使用的代码和数据保存在磁盘中,当须要用到的时候再把它从磁盘里取出来。
--虚拟存储的实现须要依靠硬件的支持,对于不一样的cpu来讲是不一样的。可是几乎全部的硬件都采用一个叫mmu(Memory Management Unit)的部件来进行页映射。在页映射的模式下,cpu发出的是程序的虚拟地址。通过mmu转换后就变成了物理地址。Mmu通常就集成在cpu内部。
--线程 是程序执行流的最小单元。一个标准的线程由线程id、当前指令指针、寄存器集合和堆栈组成。一个进程由多个线程组成,各个线程之间共享程序的内存空间(包括代码段,数据段,堆等)及一些进程级的资源(如打开文件和信号)。
--线程调度 有优先级调度和轮转法的方法。
--线程安全 同步与锁。过分优化带来的问题。
--用户态多线程库的实现方式。用户实际使用的线程并非操做系统内核里的内核线程,而是存在与用户态的用户线程,它们之间能够是一对一模型,多对一模型或者多对多模型。多线程

第二章 编译和连接。ide

-- 编译一个程序包含了如下的过程:预处理、编译、汇编和连接。
-- 预处理:主要处理源代码文件中的以”#”开始的预编译指令。
-- 编译:把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。
-- 汇编:将汇编代码转变成机器能够执行的指令,每个汇编语句几乎都对应一条机器指令。这个过程只是根据汇编指令和机器指令的对照表一一对应就能够了。
-- 连接:地址和空间分配,符号决议和重定位。
-- 编译器作了什么:扫描,语法分析,语义分析,源代码优化,代码生成和目标代码优化。
-- 连接:模块之间的拼接。
-- 静态连接(模块拼装) 把每一个源代码模块独立的编译,而后按照须要把它们组装起来。从原理上来说,它的工做无非是把一些指令对其它符号地址的引用加以修正。连接过程主要包括了地址和空间分配、符号决议和重定位等这些步骤。函数

第三章 目标文件里有什么优化

-- 编译器编译源代码后生成的文件叫作目标文件。目标文件中的内容至少有编译后的机器指令代码,数据。除了这些,目标文件中还包括了连接时所须要的一些信息,好比符号表,调试信息,字符串等。结构为文件头,.text段保存了程序指令,.data段保持了程序数据,.bss段为未初始化的全局变量和局部静态变量预留文职,没有内容,在文件中也不占据空间。
-- 代码段.text,包含的是函数的指令。
-- 数据段(.data)和只读数据段(.rodata)。数据段保存的是已经初始化了的全局静态变量和局部静态变量。只读数据段存放的是只读数据,通常是程序里面的只读变量(如const修饰的变量)和字符串常量。
-- bss段存放的是未初始化的全局变量和局部静态变量。
-- 连接的接口—符号。连接的过程就是要把多个不一样的目标文件之间相互粘在一块儿,为了达到这个目的,这些目标文件之间必须有固定的规则。在连接中,目标文件之间相互拼合其实是目标文件之间对地址的引用,即对函数和变量的地址的引用。函数和变量统称为符号,函数名或变量名就是符号名。连接过程当中很关键的一部分就是符号的管理,每个目标文件都会有一个相应的符号表,记录了目标文件中所用到的全部符号。每一个定义的符号有一个对应的值,叫作符号值,通常是它们的地址。操作系统

第四章 静态连接。线程

...to be continued指针

相关文章
相关标签/搜索