经典书籍:深入理解计算机系统 的读书笔记
1. 了解编译器如何工作对编程帮助巨大:
1.1 优化程序性能
比如相似语句那种效率高,比如switch和if-then-else语句,while和for循环,循环求和的结果放到本地变量比放到引用传递来的参数速度快,等
1.2 理解链接时错误
链接器无法解析引用,静态变量和全局变量区别,不同源文件定义同名全局变量会发生什么,等
1.3 避免安全漏洞
缓冲区相关知识,如何避免缓冲区溢出等
2. 系统硬件组成
总线、I/O设备、主存、处理器
3. 存储设备层次
4. 虚拟存储器
虚拟存储器是抽象概念,为进程提供了一个假象,让每个进程都以为自己独占主存。进程看到的都是一致的存储器,叫做虚拟地址空间。下图为Linux进程的虚拟地址空间:
程序代码和数据:所有进程的代码都从同一固定地址开始,然后是全局变量数据位置
堆:代码和数据区在进程开始时指定了大小,堆的大小可动态变化
共享库:存放了比如C标准库、数学库的代码和数据区
栈:位于用户虚拟地址空间顶部,向下增长
内核虚拟存储器:内核总驻留在内存中,这段内存就是为它保留的,用户进程不能读取这里的数据,也不能直接调用内核函数
5. 抽象的重要性
指令集结构提供了对实际处理硬件的抽象
文件是对I/O的抽象
虚拟存储器是对程序存储器的抽象
进程是对一个正在运行的程序的抽象
6. 缩写和概念
C语言:又贝尔实验室的Dennis Ritchie于1969年-1973年创建,1989年颁布了ANSI C的标准
ANSI:American National Standards Institute, 美国国家标准学会
GNU:GNU's Not Unix的缩写,由Richard Stallman于1984年发起,是一个开源项目,目标是开发出一个完整的类Unix系统。GNU环境包括EMACS编辑器、GCC编译器、GDB调试器、汇编器、链接器、处理二进制文件的工具等。
Posix: Portable Operating System Interface,可移植操作系统接口,IEEE(电气和电子工程师协会)为防止各大厂商往Unix中加入不兼容的特性,开始标准化Unix的开发,由Richard Stallman命名为Posix
Linux:1991年8月,芬兰研究生Linus Torvalds发布了Linux第一版