您的位置:首页 > 职场人生

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

2019-05-26 00:04 1456 查看

第一章 温故而知新

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

第二章 编译和链接。

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

第三章 目标文件里有什么

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

第四章 静态链接。

...to be continued

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: