编译系统
- 预处理(Preprocessing):
预处理器根据源代码中的预处理指令,如#include和#define等,将源代码转换为另一份源代码。预处理器的输出通常会保存在hello.i的文件中。 - 编译(Compilation):
编译器将预处理器生成的hello.i源代码转换为汇编语言代码,保存在hello.s的文件中。 - 汇编(Assembly):
汇编器将hello.s汇编代码转换为机器语言指令,并将结果保存在名为hello.o的目标文件(可重定位目标程序的格式)。 - 链接(Linking):
链接器将hello.o目标文件与标准库函数和其他依赖的目标文件进行链接,生成可执行文件hello(Windows中通常是hello.exe,其他系统可能没有拓展名,只叫hello)。可执行文件包含了所有程序的二进制指令和数据。
系统的硬件组成
I/O(待转移)
I/O设备都通过控制器或适配器与I/O总线相连。
控制器和适配器之间的区别:
功能不同: 控制器是一种独立的设备,它包含了处理I/O设备请求的控制逻辑,能够直接与I/O总线进行通信。适配器是一种中间设备,主要的作用是将不兼容的I/O设备接口转换为计算机系统所支持的接口,以便计算机系统能够识别和控制这些设备。
设计不同: 控制器通常是一个独立的芯片或板卡,它集成了处理I/O设备请求的控制逻辑和与I/O总线通信的接口。适配器通常是一个小型设备,它包含了设备接口转换的电路和接口插口。
使用场景不同: 控制器通常用于控制和管理相对复杂的I/O设备,例如磁盘驱动器、网络适配器等。适配器通常用于连接较为简单的I/O设备,例如键盘、鼠标、打印机等。
CPU(待转移)
CPU的核心是PC。任何时刻,PC都指向主存中的某条机器语言指令
操作系统的抽象表示
上下文
- 编程语言:
在编程语言中,上下文通常指代码执行的环境或上下文。例如,在 JavaScript 中,函数的上下文指函数执行时所在的对象上下文,也称为 this 对象。 - 操作系统:
在操作系统中,上下文通常指进程或线程的上下文,包括寄存器、程序计数器、堆栈指针等信息。在进行进程或线程切换时,需要保存当前上下文并加载新的上下文。 - 数据库:
在数据库中,上下文通常指查询的上下文环境,包括查询条件、表名、列名等信息。在进行数据库查询时,需要指定查询的上下文环境。 - 用户界面:
在用户界面中,上下文通常指用户当前操作的上下文环境,包括当前所在的应用程序、打开的窗口、当前选中的对象等信息。在进行用户交互时,需要考虑用户的当前上下文环境。
进程的虚拟地址空间
并发和并行
并发(Concurrency) 指的是多个任务交替执行的过程,这些任务可以是同时启动的,但并不一定同时执行,而是根据一定的调度策略进行交替执行。在并发执行的过程中,任务之间会发生切换,每个任务只能在某个时间段内被执行,然后再被暂停,等待下一次执行的机会。
并行(Parallelism) 则指的是多个任务同时执行的过程,这些任务可以是相互独立的,它们可以在不同的处理器核心或者多台计算机上并行执行,不需要等待其他任务的完成。在并行执行的过程中,每个任务拥有自己的执行环境和资源,不会互相干扰。
因此,尽管并发和并行的表述很相似,但是它们的含义是不同的。并发强调的是多个任务在有限的时间内交替执行,而并行则强调多个任务在同时执行,通过分配不同的资源,使得每个任务可以独立执行,从而提高计算效率。
超线程、超标量、SIMD
相同点:
通过并行执行多个指令或多个数据项,提高了处理器的执行效率和吞吐量。
都需要在处理器硬件中增加额外的执行单元和相关支持逻辑,以支持并行执行多个指令或数据项。
都可以在不增加处理器频率的情况下提高处理器性能。
不同点:
超线程主要是通过在处理器的物理核心中模拟多个逻辑核心,以提高处理器的并发度和资源利用率。而超标量和SIMD则是通过在处理器硬件中增加多个执行单元来提高指令吞吐量和数据处理能力。
超线程和超标量都是针对指令级并行(ILP)优化的技术,即在同一时间内执行多个指令。而SIMD则是针对数据级并行(DLP)优化的技术,即在同一时间内对多个数据项执行相同的操作。
超线程和超标量需要对指令进行调度和数据依赖检测,以确保指令能够正确地执行。而SIMD则不需要进行指令调度和数据依赖检测,因为所有数据项执行相同的操作。