程序员的自我修养读书笔记
第一章
计算机系统来看从两个方面来看
软件
硬件
计算机硬件
中央处理器
内存
I/O控制芯片
APPdeveloper---->关注CPU.
要从经济的角度理解计算机的发展,计算机系统的发展。
早期计算机,CPU核心频率与内存的频率一样,所以连接在同一个总线上,但是I/O 还是十分慢,so协调I/O与总线的速度差别,所以每个I/O总是有一个控制器
之后,CPU频率提升,本质上还是像物尽其用,不然经济上不划算。这样内存的速度远低于CPU的f,所以才有了与内存f相一致的系统总线,但是CPU的采用倍频方式与系统总线通信。什么是倍频呢
倍频就是CPU的主频相对于外频的倍数
那么什么是CPU的主频呢?
-
CPU的主频
在一定的电压下,单位时间内CPU的脉冲信号连续发出方波信号的次数
那么各种信号是由什么激发呢
晶振
-
那么晶振又是什么呢
晶振是石英晶体振荡器,如果在一定的电压下,可以产稳定和峰值稳定的正弦波
-
晶振产生机械信号的原理就是
-
压电效应
- 压电效应是压电材料的一种性质,在机械力的作用下产生电极化强度的变化,且这个效应可逆,也就是说电压的变化会使得物体变形。
-
人们越来越喜欢视觉效果,交互体验,图形化的操作系统发展,游戏的发展使得图形芯片与CPU和内存之间交换数据越来越频繁,所以慢的I/O bus无法满足这一需求,所以人们设计一个高速的北桥芯片来满足。
北桥速度高,if所有的设备连接在北桥,设计就会十分复杂,且不经济,所以人又设计了南桥新品,所以磁盘,键盘鼠标等I/O device 连接在南桥上.汇总后连接到北桥上.
- 90年代硬件架构图.png
由于功率的限制,物理到达极限,所以频率很难再提升,故单个速率无法提高,所以就需要数量啦。所以对称多处理器应运而生。逻辑上来说,增加CPU的数量可以提高计算机的运算速度,但是实际上并不是,因为我们的程序并不能完全的分解为完全不相干的子问题。
但是处理器厂商开始讲多个处理器合并在一起,即:共享昂贵的缓存,保留多个核心,核心就是计算单元。
但是多核处理器和对称多处理器SMP还是有差别。
-
计算机的系统软件可以分为两类
-
平台型
- 操作系统,内核,驱动程序,运行库,系统工具
-
程序开发
- 编译器,汇编器,链接器,等开发工具和开发库
-
计算机的科学中的问题可以通过增加一个中间层来解决
- 计算机软件体系结构.png
计算机软件的每层都要进行通信,So通信的话就需要协议,一般称呼协议为接口
注意硬件和操作系统的向后兼容性
-
虚拟机技术
- 硬件和操作系统之间增加一层虚拟层,使得一个计算机可以同时运行多个操作系统。
开发工具和应用程序属于同一个层次,使用操作系统应用程序编程接口。
-
应用程序接口的提供者是运行库,什么样的运行库提供什么样的API,运行库使用操作系统提供的系统调用接口,系统调用接口往往以软件中断的方式提供
LInux中使用0X80
Windows使用0X2E
硬件的接口定义了操作系统内核:即就是驱动程序如何操作硬件,如何与硬件通信
硬件的生产厂商负责提供硬件说明规格,操作系统和驱动程序的开发者通过阅读硬件规格文档所规定的各种硬件编程接口标准来编写操作系统和驱动程序。
操作系统
-
作用
提供抽象接口
管理硬件资源
硬件资源有限,目标就是更短的时间内处理更多的任务
-
计算机资源:
CPU
-
存储器
内存
磁盘
I/O设备
-
多道程序multiprogramming
- 本质是一个监控程序,暂时不使用CPU的话,监控程序启动另外等待CPU的程序,提高CPU的利用率
-
分时系统
每个程序都运行一段时间
限制条件是CPU资源有限
缺点:死机
-
多任务系统
受硬件保护
所有的应用程序都以进程的方式运行在比操作系统权限更低的级别,每个进程都有自己的独立空间,使得进程地址空间是隔离的。
OS根据进程的优先级高低进行分配CPU
-
OS系统成熟后,硬件被OS抽象成了概念
UNIX中,访问硬件设备就是访问文件
-
Windows
-
图形硬件
- GDI
-
声音和多媒体设备
- DirectX对象
-
磁盘
- 普通文件系统
-
从硬件的细节中解放出来,更多的关注应用程序本身的开发。
驱动程序往往跟操作系统内核一起运行在特权级,但是它又与操作系统内核之间保持着一定的独立性。
操作系统开发者为硬件生产厂商提供了一些列接口和框架,凡是按照这个接口和框架开发的驱动程序都可以在改操作系统上使用。
硬盘的基本存储单位是扇区
-
一个硬盘往往有多个盘片
-
盘片
-
两个面
-
若干个同心圆(磁道)
若干个扇区
屏蔽复杂的硬件细节,LBA的方式
逻辑扇区号
-
-
-
-
如将计算机的上有限的物理内存分配给多个程序使用
-
简单的内存分配策略的问题
地址空间不隔离,使用物理地址,实模式的情况。
内存使用效率低,换入和换出
程序运行的地址不确定,重定位
-
如何解决
-
增加中间层,虚拟地址
- 目的是为了保证任意一个程序所能够访问的武林外i村区域和另外一个程序相互不重叠。
-
-
-
地址空间
物理地址空间
-
虚拟地址空间
- 虚拟地址空间,实际上是不存在的,目的是为了有效的地址空间的隔离
-
分段
把一段与程序所需的内存空间的大小映射到某个地址空间
解决了 地址空间不隔离的问题,
程序运行地址不确定的问题。
但是没有解决内存效率低的问题,还需要大面积的换入换出
-
所以需要更小的颗粒度进行细分,即分页
把地址空间人为地等分为固定大小的页
-
其中页的大小由
硬件决定
或者硬件支持多种大小的页,由OS决定page size
经常用的数据和code page 放入内存
不经常使用的放入磁盘,需要时将其从磁盘调出到内存中
不在内存中将会出现 page fault
虚拟页在虚拟空间中
物理页在物理内存中
磁盘页在磁盘内存中,
硬件本身就支持以页为单位来操作数据和代码。
虚拟存储的实现靠MMU部件来进行页映射。
现在一般的MMU继承到CPU内部
线程
线程就是轻量级进程
程序执行流的最小单元
-
组成strip
s:stack
t:
r:registers
i:线程ID
p:PC 当前指令指针
-
线程的访问权限
栈 私有
线程局部存储 私有
寄存器 私有
-
线程之间共享
全局变量
堆的数据
函数里的静态变量
程序代码
打开的文件
-
线程调度与优先级
当线程的数量小于处理器数量是,线程的并发是真并发,且操作系统支持多处理器
-
单处理器对应的多线程是模拟出来的状态。
运行 线程正在执行
就绪 可以立即执行奈何CPU被占用
等待 等待某一事件发生
时间片用尽进入就绪状态
-
什么是时间slice
- 运行中线程有一段可以执行的时间
-
线程调度方法
-
优先级调度
优先级可以用户手动设置
还可以自动调
会出现饿死现象,为了避免长时间得不到执行的而线程优先级被提升
轮转法
-
-
频繁等待
- I/O密集线程
-
很少等待
-
CPU密集进程
storytelling.jpg
-


