不奢望岁月静好 只希望点滴积累

0%

计算机概念漫谈

总线: 一组电子管道, 携带信息字节、并负责在各个组件间传递

每个IO设备通过一个控制器或者适配器与IO总线相连

控制器和适配器的区别是: 封装方式的不同、但功能都是在IO总线和IO设备之间传递信息

控制器: IO设备本身或者系统的主板上的芯片组

适配器: 是一块插在主板槽上的卡

主存: 是一个临时性的存储设备、在处理器执行程序时、用来存放程序和程序处理的数据

从物理上来说、主存是由一组动态随机存取存储器芯片组成的

从逻辑上来说、存储器是一个线性的字节数组、每个字节有唯一地址(数组索引)、地址从0开始、

处理器: 中央处理单元CPU、简称处理器、是解释(或执行)存储在主存中指令的引擎、

处理器的核心是一个大小为1个字的存储设备(或寄存器)、即: 程序计数器PC

在任何时刻、PC都指向主存中的某条机器语言指令(即: 含有该指令的地址)

处理器从程序计数器指向的内存处读取指令、解释指令中的位、执行该指令的简单操作、然后更新PC, 使其指向下一条指令(不一定和内存中刚刚执行的指令相邻、比如 jump)

这样的简单操作不多、围绕 主存、寄存器文件 和 算术/逻辑单元 ALU 进行. eg. 如下操作

加载: 从主存复制一个字节或者一个字到寄存器、以覆盖寄存器原来的内容

存储: 从寄存器复制一个字节或者一个字到主存的某个位置、以覆盖这个位置上原来的内容

操作: 把两个寄存器的内容复制到ALU, ALU对这两个寄存器的字进行算术运算、并将结果存放到一个寄存器中、覆盖该寄存器原来的内容

跳转: 从指令本身抽取一个字、并将这个字复制到程序计数器PC中、以覆盖PC中原来的值

处理器的指令架构集描述的是每条机器代码指令的效果

微体系结构描述的是处理器实际上如何实现的

处理器从寄存器文件中读数据比从主存中读取几乎要快100倍、所以系统设计者采用了更小更快的存储设备 高速缓存存储器 cache 来存放近期需要的数据

位于处理器芯片上的L1高速缓存 容量可以达到数万字节、访问速度几乎和访问寄存器问你件一样快

一个容量为数十万到数百万字节的L2高速缓存 通过一条特殊的总线连接到处理器、进程访问L2高速缓存的时间要比访问L1高速缓存的时间长5倍、但仍比访问主存快5~10倍

L1和L2高速缓存是使用 静态随机访问存储器SRAM的硬件技术实现的

新的系统出现了L3缓存、系统可以获得一个更大的存储器、同时访问素的也更快、是利用了高速缓存的局部性原理、使程序具有访问局部区域里的数据和代码的趋势、通过让高速缓存里存放可能经常性访问的数据、

程序不会直接操作硬件、而是依靠操作系统提供的服务

可以将操作系统看成应用程序和硬件之间插入的一层软件

操作系统: 1.防止硬件被失控的应用程序滥用 2.向应用程序提供简单一致的机制来控制硬件设备(通过 进程、虚拟内存、文件来实现)

进程:

并发运行: 一个进程的指令和另一个进程指令是交错执行的、大多数系统中可以运行的进程数多于CPU个数、传统系统 一个时刻只能执行一个程序、多核处理器可以同时执行多个程序

无论是单核还是多核处理器、一个CPU看上去都像是在并发执行多个进程、是通过进程间切换实现的。这种交错执行的机制称为 上下文(包括PC、寄存器文件当前值及主存内容等)切换

从一个进程到另一个进程的切换是操作系统内核管理的, 内核是操作系统代码常驻主存部分

注意: 内核不是一个独立的奖金池、而是系统管理全部进程所用代码和数据结构的集合

线程:

进程实际上由多个线程执行单元组成、每个线程运行在进程上下文中、并共享同样的代码和全局数据

虚拟内存;

虚拟内存是一个抽象概念、为每个进程提供了独占使用主存的假象、每个进程看到的内存是一致的、称为虚拟地址空间

Linux中、地址空间的最上边的区域是给操作系统代码和数据的、底部存放用户进程的代码和数据、地址从下-> 上增加

每个进程看到的虚拟地址空间由大量准确定义的区构成、每个区有专门的功能(下述从最低地址向上)

  • 程序代码和数据: 对所有进程来说、代码从同一个固定地址开始、接着是和C全局变量对应的数据位置
  • 堆: 代码和数据区后紧随着是运行时 堆、代码和数据区在进程开始运行时就指定了大小、堆是在运行时可动态扩展和收缩的空间
  • 共享库: 大概地址空间的中间是一块用来存放像C标准库和数学库这样的共享库代码和数据的区域
  • 桟: 位于用户虚拟地址顶部的是用户桟、编译器用它来实现函数调用
  • 内存虚拟内存: 不允许应用程序读写这个区域的内容或者直接调用年内和定义的函数

文件:

文件就是文字序列、每个io设备、包括磁盘、键盘、显示器 甚至网络都可以看成文件

系统中的输出输入都是通过Unix io的系统函数调用读写文件来实现的

Amdahl定律:

Amdahl定律: 对系统某部分性能的提升取决于该部分的重要性和加速程度、

eg. 某系统初始耗时 60%、加速比例 k=3 则加速为 1/((1-0.6)+0.6/3) = 1.67倍

并发:

线程级并行:

1.多个CPU

2.超线程 又称:同时多线程、是一项允许一个CPU执行多个控制流的技术, 它涉及CPU某些硬件有多个备份、eg. 程序计数器和寄存器文件、而其它的硬件只有一份、eg. 执行浮点数运算的单元, 常规的处理器大约需要20000个时钟周期做线程切换、而超线程的处理器可以在单个周期的基础上决定执行哪个线程

指令级并行

早期处理器一个指令需要多个时钟周期来执行、现代处理器可以同时执行多条指令的属性称为: 指令级并行

单指令、多数据并行

现代处理器允许一条指令参数多个并行执行的操作、称为: 单指令、多数据并行 即:SIMD并行

提高这些SIMD指令是为了提高处理影像、声音和视频数据应用的执行速度、虽然有些编译器会试图从C程序中自动抽取SIMD并行性、但更可靠的方法是用编译器支持的特殊向量数据类型来写程序、eg. GCC 就支持向量数据类型

几个抽象:

文件是对IO设备的抽象

虚拟内存是对程序存储器的抽象

进程是对一个正在运行的程序的抽象

虚拟机是对整个计算机的抽象、包括 操作系统、处理器和程序