计算机系统是由硬件和系统软件组成的
1. 信息就是位 + 上下文
首先我们写出一个hello.c的源码
1 |
|
而源码是以字节序列(ASCII)的方式存储在文件中的
这种文件被称为文本文件, 所有其他文件都称为二进制文件.
这反映了一个基本思想: 系统中所有的信息———包括磁盘文件, 内存中的程序, 内存中存放的用户数据以及网络上传送的数据, 都是由一串比特(bit)表示的. 区分不同数据对象的唯一方式是我们读到这些数据对象时的上下文(其实我个人理解为这种方式类似于指针. )
程序被其他程序翻译成不同的格式
每条的C语句都必须被其他程序幻化为低级机器语言指令. 让后这些指令按照可执行目标程序的格式打好包, 并以二级制磁盘文件的形式存放起来, 目标程序也称为可执行目标文件
源文件到目标文件的转化是由编译器驱动程序完成的
- 预处理阶段, 预处理器根据以’#’开头的命令, 修改运势的C程序,比如#include <stdio.h>告诉预处理器读取系统头文件<stdio.h>的内容, 并把它插入到程序文本中, 由.c变成了.i, 注意此时文件仍然是文本文件
- 编译阶段, 将.i文件翻译成了.s文件, 它包含了一个汇编语言程序, 是一种以文本格式描述了一条低级机器语言指令.
- 汇编阶段, 汇编器(as)将hello.s翻译成机器语言指令, 将这些指令打包成可重定位目标程序的格式, 这时文件就是一个二进制文件了, 由.s文件变成了.o文件
- 链接阶段, 将我们所需要的编译器提供的标准C库中的东西合并到程序中. 这是它就是一个可执行目标文件
系统硬件的组成
总线
携带信息字节并负责传递, 注意传送的是定长的字节块, 也就是字(word),
I/O设备
就是输入输出设备, 每个IO设备都通过一个控制器或适配器与IO总线相连, 控制器和适配器的功能都是在IO总线与IO设备减传递信息
主存
是由一组动态随机存取存储器(DRAM)芯片组成的,
处理器
就是CPU, 处理器执行程序计数器指向的治理那个, 这个指令执行模型是由指令集架构决定的. (指令集架构描述的是每条机器代码指令的效果; 而微体系结构描述的是处理器实际上是如何实现的)
高速缓存
hello程序的机器指令一开始在磁盘上, 当程序加载时, 它们被复制到主存上, 当处理器运行程序时, 指令又从主存复制到处理器.
- 存储空间与传输速度成反比关系, 也就是说空间越大, 速度越小
所以处理器和主存之间存在速度差(这就像是接力赛一样, 如果只有一个人快, 他还要等很慢的那个人, 这样整体就慢了, 个人猜测, 希望指正!!)所以有了一个中间桥梁叫做告诉缓存存储器, 搭在处理器和主存之间.
结论: 告诉缓存存储器的存在能使程序的性能提高一个数量级
存储设备形成层次结构
主要思想: 上一层的存储器作为第一层存储器的高速缓存
作用: 提高程序性能
操作系统管理硬件
可以把操作系统看成使应用程序和硬件之间插入的一层软件
所有应用软件对硬件的操作尝试都必须通过操作系统
功能:
- 防止硬件被时空的应用程序滥用,
- 项应用程序提供简单一致的基址来控制复杂而又大不相同的低级硬件设备
进程
进程是操作系统对一个正在运行的程序的一种抽象
一个系统上可以同时运行多个进程, 每个进程都像是独占硬件.
而并发运行, 则是说一个进程的指令和另一个进程的指令是交错执行的.多核处理器可以同时执行多个程序, 无论单核还是多核, CPU并发执行是通过进程间切换来实现的. 操作系统实现这种交错执行的机制被称为上下文切换
操作系统保持跟踪进程运行所需的所有状态信息, 这种状态就是上下文
比如PC和寄存器文件的当前值, 以及主存中的内容.
当操作系统决定要把控制权从当前进程转移到某个新进程时, 就会进行上下文切换, 即保存当前进程的上下文, 恢复新进程的上下文, 将控制权传递到新进程. 新进程就会从它上次停止的地方开始.
就像是用shell打开hello程序, 系统将控制权给操作系统, 系统保存shell进程上下文, 创建hello进程及其上下文, 然后将控制权给hello进程.
线程
进程由多个线程组成
当有多处理器可用的时候, 多线程也是一种使得程序可以运行得更快的方法
虚拟内存
是一种抽象概念, 它为每个进程提供了一种家乡, 即每个进程都在独占的使用内存, 称为虚拟地址空间.
虚拟地址空间的大致分区
从低到高的地址排序
文件
文件就是字节序列, 仅此而已
每个IO设备(键盘, 磁盘, 显示器)都可以看成文件
系统之间利用网络通信
网络通信使分散的系统链接在一起,
Amdahl定律
主要思想: 当我们对系统的某个部分加速时, 其对系统整体性能的影响取决于该部分的重要性和加速程度.
就是把程序分为两个部分, 一个是未加速的部分, 一个是加速部分, 然后将加速部分乘以比例得到加速后部分, 再将加速后部分和为加速部分相加就是加速后所需要的总时间了.
并发和并行
- 并发是一个通用的概念, 指一个同时具有多个活动的系统
- 并行指用并发来使一个系统运行得更快
线程级并发
构建再进程这个抽象之上. 我们有同时可以执行多个程序的系统, 但传统意义上, 这种并发只是模拟出来的是通过计算机再进程间快速奇幻来实现的, 就像杂耍艺人保持多个球再空中飞舞一样.
单处理器系统只能执行一个任务, 所以要在各个任务间来回切换, 而现在的多处理器系统可以有但操作系统内核控制多处理器执行任务.
超线程(同时多线程): 允许一个CPU执行多个控制流的奇数.
指令集并行
同时执行多条指令的属性称为指令集并行
一般执行一条指令需要2-4个时钟周期, 流水线中可以接近一个时钟周期一条指令. 如果处理器可以达到比一个周期一条指令更快的执行速率, 就称之为超标量处理器.
单指令多数据冰寒
允许一条指令产生多个可以并行执行的操作, 这种方式称为单指令, 多数据.
计算机系统中抽象的重要性
如为函数规定一个简单的应用程序接口(API)
有三个抽象:
- IO设备的抽象, 虚拟内存是对程序存储器的抽象,
- 进程是对一个重在运行的程序的抽象
- 虚拟机, 是对整个计算机的抽象, 包括操作系统, 处理器和程序.
小结
主要学习硬件和系统的一些常识, 分为