计算机基础回顾
这里特指PC
速度差
- 早期的计算机
- 没有专用的GPU
- CPU的核心频率也不高
- 内存的频率和CPU一样
- I/O控制器(为了协调总线和io设备之间的速度差)
-
直接连接在同一个总线(Bus)上
-
发展中的计算机
- CPU频率大幅提升
- 内存频率小幅提升(相对于CPU而言)
-
总线(Bus)速度与内存一致
-
世纪初的计算机
- 图形化系统普及导致GPU进入系统
- CPU频率大幅提升
- 内存频率小幅提升(相对于CPU而言)
-
单独的总线(Bus)无法满足GPU与CPU和内存的数据交换
- 高速的北桥芯片(Northbridge,PCI Bridge)控制的高速总线
- 低速的南桥芯片(Southbridge)控制的低速总线
-
现代计算机
- GPU分为核心显卡和独立显卡两种,前则由CPU直接集成,后者则通过PCIE总线进入系统
- CPU多核心化,并且集成内存控制和北桥芯片的功能,北桥芯片成为历史
- 内存由集成了内存控制器的cpu直连
- PCIE成为总线(Bus)标准
- 现代主板上依然有南桥芯片,通常我们称作芯片组,而主板的型号开头就是这颗南桥芯片的型号
- 由于南桥芯片是一颗低速芯片,即使是现在,它的带宽依然十分有限,所以通常我们会把独立显卡接到cpu直连的pcie插槽上
- 并且由于现在固态硬盘的速度已经相当快了,南桥芯片慢慢难以满足其带宽需求,现代主板除了一个直连cpu的pcie插槽,还有有一到两个为m.2固态准备直连cpu硬盘插槽
接口
“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”
- 每个层次之间都须要相互通信,既然须要通信就必须有一个通信的协议,我们一般将其称为接口(Interface),接口的下面那层是接口的提供者,由它定义接口;接口的上面那层是接口的使用者,它使用该接口来实现所需要的功能。
-
除了硬件和应用程序,其他都是所谓的中间层,每个中间层都是对它下面的那层的包装和扩展。
-
操作系统
应用程序编程接口(Application Programming Interface)
由运行库
提供运行库
使用操作系统提供的系统调用接口(System call Interface)
系统调用接口
在实现中往往以软件中断(Software Interrupt)的方式提供- 中断后便会陷入操作系统,由内核使用驱动程序操作硬件
- 硬件厂商提供给驱动程序编写者的接口叫做硬件规格(Hardware Specification),驱动程序编写者根据这些信息编写驱动程序
CPU调度
详细内容参考 ostep CPU章节
- 抢占模式
- 操作系统处于特权级别 内核态,依靠时钟来强制陷入操作系统,或者系统调用、意外事件、中断陷入操作系统
- 用户处于普通级别 用户态,在规则内运行程序
驱动程序
硬件由操作系统统一管理,但是操作系统不直接操作硬件,而是通过各种硬件设备的驱动程序来操作硬件。驱动程序是操作系统和硬件之间的中间层,对于各个类型的硬件它们大都有通用的驱动协议来规范驱动的接口,以便操作系统使用他们。
内存分配
详细内容参考 ostep 内存章节
多线程
- 线程私有
- 局部变量
- 函数的参数
- 线程局部存储(TLS)数据
- 线程共享
- 全局变量
- 堆上的数据
- 函数里的静态变量
- 程序代码,读和执行权限
- 打开的文件,A线程打开的文件可以由B线程读写
Windows对进程和线程的实现如同教科书一般标准,Linux对多线程的支持颇为贫乏,事实上,在Linux内核中并不存在真正意义上的线程概念。Linux将所有的执行实体(无论是线程还是进程)都称为任务(Task),每一个任务概念上都类似于一个单线程的进程,具有内存空间、执行实体、文件资源等。不过,Linux下不同的任务之间可以选择共享内存空间,因而在实际意义上,共享了同一个内存空间的多个任务构成了一个进程,这些任务也就成了这个进程里的线程。
- 线程安全
- 加锁
- 二元信号量(Binary Semaphore),占用/非占用二元,当锁被占用时,其他请求必须排队等待锁的释放。
- 互斥量(Mutex),在二元的基础上,增加了必须由占用者释放的条件。
- 临界区(Critical Section),这种锁在占用时其他进程不可见,其他进程尝试获取该锁为非法操作。
- 读写锁(Read-Write Lock)
- 条件变量(Condition Variable)
- 可重入(Reentrant)
- 编译器过度优化
- CPU乱序执行
多线程内部情况
内核态的内核线程/用户态的用户线程
- 三种线程模型
- 一对一模型
- 多对一模型 多个用户线程对一个内核线程
- 多对多模型