我听到的我会忘记 我看到的我能记住 只有我做过的,我才能理解
CSAPP 最大的魅力在于,每章的前言会站在程序员的角度跟你分析,为什么要学这些知识,然后在正文里清晰的阐述这些问题的答案。
操作系统是什么?提供了什么功能?
- 用户角度:操作系统是一个控制软件
- 管理应用程序
- 为应用程序提供公共服务(比如底层的 IO、以及网络协议栈等各种底层 API)
- 进程管理
- 硬件角度:资源管理
- 管理外设、分配资源
- CPU 调度器
- 物理内存管理
- 虚拟内存管理
- 文件系统管理
- 中断处理与设备驱动
- 管理外设、分配资源
- 所处位置:硬件之上,应用程序之下
- 操作系统内核特征
- 并发(注意区分并发与并行,并发强调的是一段时间,并行是一个时间点,所以并行必须是多核)
- 共享:
- “同时”访问
- 互斥共享
- 虚拟(为上层提供底层的抽象)
- 异步
- 内核时被信任的第三方
- 只有内核可以执行特权指令
操作系统实验:
- 系统启动及中断
- 物理内存管理
- 虚拟内存管理
- 内核线程管理
- 用户进程管理
- CPU 调度
- 同步与互斥
- 文件系统
信息 = 位 上下文
编码是一切信息处理的基础。
程序被其他程序翻译成不同的格式
编译过程:
源程序(hello.c)=> 预处理器 (hello.i) => 编译器(hello.s) => 汇编器(hello.o) => 链接器(可执行)
- 预处理:以 # 开头的,直接修改源程序。比如 #include <stdio.h>,将直接把文件插入进来。
- 编译器:将此文本文件翻译成汇编语句。
- 汇编器:将汇编语句翻译成机器语言指令。
- 链接器:将用到的链接库合并。
了解编译系统如何工作大有益处
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
处理器读并解释储存在内存中的指令
系统的硬件组成
计算机:
- 以硬件为基础
- 以软件扩充其功能
- 以执行程序的方式提现功能
组成:
- 总线:bus,各部件信息传输的渠道
- I/O 设备:输入输出设备。输入信息 => 处理信息 => 输出信息
- 主存
- 处理器
运行 hello 程序
高速缓存至关重要
存储设备形成层次结构
操作系统管理硬件
进程
线程
一个进程可以由多个线程构成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
虚拟内存
为每个进程提供了一个假象,就好像每个进程都独占了主存。
每个程序执行时,内存起点都是一样的。
文件
系统之间利用网络通信
Amdahl 定律
并发和并行
抽象的重要性
CPU => 进程
磁盘 => 文件
内存 => 地址空间