1 计算机漫游
计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。
计算机技术的飞速发展得益于两个方面: 1\计算机制造技术的发展 2\计算机系统结构的创新
1.1 信息就是位 + 上下文
-
信息就是位(Information is Bits):
-
计算机中的所有数据和指令都以二进制位(0和1)的形式存储和处理。
-
这些二进制位可以表示各种不同的信息,例如数字、文字、图像等。
-
计算机通过对这些位进行组合和操作来实现复杂的功能。
-
-
上下文(Context Matters):
计算机中的信息需要依赖特定的上下文来进行解释和处理。
同样的二进制位,在不同的上下文中可能会有不同的含义和操作。
例如,一个二进制数可以被解释为一个整数、一个字符或者一条指令,具体取决于上下文环境
1.2 hello.c
程序的生命周期
想要在操作系统上运行hello.c
程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令, GCC编译器驱动将hello.c
源文件,翻译成可执行目标文件hello。这个翻译的过程可分为四个阶段。
#include <stdio.h>
int main(){
printf("hello world!\n");
return 0;
}
执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统
-
预处理阶段:
-
预处理器(
cpp
)根据以字符#开头的命令,修改替换原始的C程序; -
例如:
hello.c
中的第一行include <stdio.h>
命令告诉预处理器读取系统头文件stdio.h
的内容,直接插入到程序文本中; -
结果就得到了另一个C程序,通常是以
.i
作为文件扩展名(hello.i
)。
-
-
编译阶段:
-
编译器(
ccl
) 将文本文件he1lo.i
翻译成文本文件hello.s
,它包含一个汇编语言程序; -
汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令;
-
例如,C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。
-
-
汇编阶段:
-
汇编器(
as
)将he1lo.s
翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program
)的格式,并将结果保存在目标文件hello.o
中; -
hel1o.o
文件是一个二进制文件,它的字节编码是机器语言指令而不是字符。
-
-
链接阶段:
-
请注意,
hello.c
程序调用了printf
函数,它是每个C编译器都会提供的标准c库中的一个函数; -
printf
函数存在于一个名为printf.o
的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o
程序中; -
链接器(
ld
)就负责处理这种合并。结果就得到hello文件,它是一个可执行目标文件(或者简称为可执行文件),可以被加载到内存中,由系统执行。
-
1.3 处理器读并解释存储在存储器中的指令
1.3.1 系统的硬件组成
-
总线:贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。
-
I/O设备:输入/输出(I/O)设备是系统与外部的联系通道。每个I/O设备都通过一一个控制器或适配器与I/O总线相连。
-
主存:主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
-
从物理上来讲,主存由一组动态随机存取存储器(DRAM)芯片组成的。
-
从逻辑上讲,存储器是一个线性的字节数组,每个字节都有其唯一的地址(即数组索引)。
-
-
处理器:中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。
-
处理器的核心是一个字长的存储设备(或寄存器),称为程序计数器(PC),在任何时刻,PC都在指向主存中的某条机器语言指令。
-
从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向地指令,在更新程序计数器,使其指向下一条指令。
-
1.3.2 运行hello程序过程
1.3.3 高速缓存
由于技术的发展导致处理器与驻村之间的差距不断地增大,加快处理器的运行速度比加快主存的运行速度要容易和便宜的多。 针对这种差异,高速缓存存储器(cache)被设计出来,作为暂时的集结区域,存放处理器近期可能会需要的信息。
# ① hello程序的机器指令最初是存放在磁盘上的 # ② 当程序加载时,它们被复制到主存; # ③ 当处理器运行程序时,指令又从主存复制到处理器。
-
L1高速缓存位于处理器芯片上,容量可以达到数万字节,访问速度几乎可以和访问寄存器文件一样快。
-
L2高速缓存通过一条特殊的总线连接到处理器,容量为数十万字节到数百万字节,进程访问L2高速缓存的时间要比访问L1的时间长5倍。L1和L2都是SRAM。
-
有的更新的系统包含了L1、L2和L3三级缓存。通过让高速缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。
1.3.4 存储器的层次结构
1.3.5 操作系统管理硬件
-
计算机的分层试图
1.3.6 操作系统的几个抽象概念:进程、线程、虚拟存储器、文件
-
进程
-
是操作系统中一个正在运行的程序的抽象,每个进程都有自己的地址空间、内存、文件描述符、安全性属性等,它们在操作系统中相互独立地运行。
-
而并发执行则是说一个进程的指令和另一个进程的指令是交错执行的(看上去像是多个进程同时执行,但是针对单个处理器来说,每个时间片只有一个进程的代码在执行)。从一个进程到另一个进程的切换是由操作系统内核管理的,内核是操作系统代码常驻主存的部分(注意:内核不是一个独立的进程,相反,它是系统管理全部进程代码和数据结构的集合)
-
-
线程
-
是进程内部的执行单元。一个进程可以包含一个或多个线程,它们共享进程的地址空间和资源,但每个线程拥有自己的栈、寄存器等执行上下文。使用多线程可以提高程序的并发性和效率。
-
-
虚拟存储器(虚拟内存)
-
是一种抽象概念,用来描述计算机系统中实现内存管理的技术。
-
它为每个进程提供了一个假象,即每个进程都在独占的使用主存。每个进程看到的内存都是一样的,成为虚拟地址空间。
-
-
文件
-
是指计算机中存储数据的一种方式。就是字节序列。
-
文件可以是文本、图像、音视频等形式,通过文件系统进行管理。
-
操作系统提供了文件I/O接口,使得程序可以读取、写入和操作文件中的数据。
-
1.3.7 并发和并行
并发:指一个同时具有多个活动的系统; 并行:指用并发使一个系统运行的更快。 通俗点说,并发指的是多个任务能被来回切换的做;而并行则指的是几件事情可以同时做(并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机)。并发和并行都可以指多个线程,如果这些线程可以被分配到多个CPU上同时执行,那么就是并行;如果是单CPU对多线程进行切换式处理,那么就是并发。
-
线程级并发:
-
线程级并发是指在一个计算机系统中同时执行多个线程(或进程)的能力。
-
在多线程编程中,多个线程可以并行执行,每个线程都可以独立执行不同的任务。
-
这种并发可以通过操作系统的线程调度器实现,它能够将不同的线程分配到不同的处理器核心上,从而实现并行执行。
-
线程级并发可以提高系统的吞吐量和响应性,并充分利用多核处理器的性能。
-
-
指令级并行:
-
指令级并行是指在一个处理器内部同时执行多条指令的能力。
-
现代处理器通常采用流水线(pipeline)技术,将指令的执行过程划分为多个阶段,并同时执行不同阶段的多条指令。
-
这样可以在一个时钟周期内完成多条指令的执行,提高处理器的效率。
-
指令级并行可以通过流水线技术、超标量处理器、乱序执行等技术来实现。
-
# 超线程和并发有何区别? 超线程(Hyper-Threading)是单个物理处理器核心同时执行多个线程的技术,通过复用和共享资源提高处理器的效率和性能。 并发是系统能够同时处理多个任务或操作的能力,可以在单个核心上实现,也可以在多个核心上实现。 简而言之: 超线程是一种技术,通过将单个物理核心划分为多个虚拟处理器来提高性能。 并发是系统能够同时处理多个任务或操作的能力,可以在单核或多核上实现。
2 单处理器性能进一步提高所面临的问题:
# 1、功耗问题(功耗已经很大); # 2、可以进一步有效开发的指令级并发性已经很少; # 3、存储器访问速度的提高缓慢。
3 系统结构的重大转折:《多核》
# 1、通过在单个芯片上实现多个处理器来提高性能; # 2、从单纯依靠指令级并行转向开发线程级并行和数据级并行。