1. 前言
知乎上面好多推荐看这本书的, 今天拿起来看看, 做些笔记
2. 笔记
1.2 万变不离其宗
- 计算机硬件中几个关键部件:
- 中央处理器cpu
- 内存
- IO控制芯片
- 硬件结构框架
北桥: 高速芯片 使用 PCI 总线
南桥: 低速芯片 使用 ISA 总线 - SMP 和 多核
- 由于CPU的频率受到制作工艺限制,无法继续提升, 就采用增加cpu 数量提升性能
- 但是这个有点类似人月神话中的思想, 一个女人可以花10个月生一个孩子, 但是10个女人不能在一个月生一个孩子
- 多应用于需要处理大象请求的时候, 并且这些请求相互独立的情形
1.3 站得高,望得远
计算机体系结构中的一个名言:
Any problem in computer science can be solved by another layer of indirection.
计算机软件体系结构
1.4 操作系统做什么
- 操作系统的一个功能是提供抽象的接口, 另外一个是管理硬件资源
1.4.1 不要让cpu 打盹
- 多道程序运行系统
- 分时系统
- 多任务系统
1.4.2 设备驱动
1.5 内存不够怎么办
- 隔离
- 每个进程都有自己独立的虚拟地址空间, 每个进程只能访问自己的地址空间,从而达到进程隔离
- 分段
- 实现了地址的隔离,并且不用关心实际的物理地址(程序不需要重定位)
- 但是内存效率低, 以整个程序为单位进行换入换出操作
- 分页
- 实现地址隔离
- 内存效率高
- 不需要重定位
- 可以实现页面保护机制
1.6 众人拾柴火焰高
- 线程
- 访问权限
- 线程调度和优先级
- 几种运行状态
- 抢占特性
- linux 中的写时复制机制
- 线程安全
- 同步和锁
- 信号量: 在整个系统中可以被任意线程获取和释放, 进程间可用
- 互斥量: 谁污染谁治理, 进程间可用
- 临界区: 仅在本进程中有效, 出了本进程 不承认
- 读写锁: 线程同事读取ok, 但是写入需要同步
- 条件变量: 可以让多个线程一起等待某个事件的发生,事件发生的时候, 所有线程可以一起回复执行
- 可重入
- 不应使用任何静态或者全局非const变量
- 仅依赖调用方参数
- 不依赖任何单个资源的锁
- 不调用不可重入的函数
- 过度优化
- cpu 可能交换执行顺序, 或者将某个值写入寄存器
- 通过violate 阻止这一特性
- 同步和锁
- 多线程内部情况
- 一对一
- 高效, 但是内核线程数量有限, 内核调度上下文切换代价大
- 多对一
- 一个用户线程阻塞,所有线程都无法执行
- 多对多
- 上述两者的综合效果
- 一对一