这个图的主要思想就是想告诉我们上一层的存储器作为低一层存储器的高速缓存,也就是寄存器是L1的高速缓存,L2是L1的高速缓存,以此类推。
就像可以用不同的高速缓存知识来提高程序的性能,我们一眼可以利用对整个存储器层次的原理的理解来提高程序性能。
操作系统管理硬件🤔
接下来的内容在学校学过计组的读者都会比较熟悉了
操作系统有两个基本功能:
防止硬件被失控的程序滥用;
向程序提供一种机制来控制“长得像”而复杂的低级硬件设备;
这两个功能靠什么实现呢?
答:进程,虚拟存储器,文件三者来抽象表示。接下来我会解释他们
进程🤔
hello world 程序在运行时,操作系统会提供一种假象,因为屏幕上只会出现执行结果,就好像系统上只有这一个程序在运行,此时的处理器,I/O设备,主存似乎都被这个程序所用,处理器就好像一条一条执行程序中的命令。这些假象都是通过进程的概念来实现的。
进程这个概念算是计算机中最重要最成功的概念之一了,他是对一个正在运行的程序的一种抽象。一个系统可以有很多的进程,似乎每个进程都在独占硬件。而并发运行提出一个进程和另一个进程是交错执行的。
在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行
上下文切换🤔
需要运行的进程数要堆多于可以运行他们的CPU数的,如今大多的多核处理器都可以处理多个程序,但无论是单核还是多核,一个CPU都像是在并发运行多个进程,通过处理器在进程间切换来实现,这种机制就叫上下文切换,为了方便我们默认为只有一个CPU。
什么是上下文?他是指操作系统保持跟踪进程所需的所有状态信息。任何时刻,单处理器只能处理一个进程的代码,如果他决定把控制权转移到一个新进程,就会进行上下文切换,保存当前上下文,恢复新进程上下文,然后递交控制权新进程就会从上次停止的地方开始,以 hello world 为例大致长成这样:
实现这个抽象概念需要低级硬件和操作系统的配合,原理咱后面会谈。
线程🤔
我们认为单个进程只能有一个单一的控制流,但现代系统中,一个进程可以由多个线程执行单元组成,每个线程都运行在进程的上下文里面,共享相同的数据与代码。
因为多线程之间比对多进程更容易共享数据,所以线程一般比进程更高效。多处理器可用时,多线程也是使程序更高效的方法。
虚拟存储器🤔
既然带虚拟二字,就代表他是一个抽象概念,他是为进程提供假象的罪恶之源。其实每个进程看到的一致的存储器,被称为虚拟地址空间。
他的结构从最低的地址开始向上分别是:
程序代码和数据:对所有的进程都是,代码是从后同一个固定地址开始的。
堆:紧随的就是运行时堆。这和堆区一样是可供我们自主分配空间的区域。
共享库:用来存放C标准库(stdio.h)和数学库(math.h )等,共享库的概念很强大也很难懂,一样后面讲。
栈:位于用户虚拟地址空间的用户栈,用来调用函数,可以像堆一样动态开辟和回收(函数的调用和返回)
内核虚拟存储器:内核是操作系统的一部分,虚拟存储器运行需要硬件与操作系统精密复杂的交互。
文件🤔
文件就是字节序列。
每个硬件设备都可以被视为文件,磁盘,键盘,甚至网络,系统里面所有的输入输出都是依靠一组Unix I/O 系统来调用读写文件来实现的。
文件这个简单却精致的概念十分丰富,它向程序提供了一个统一的视角来看待各式各样的I/O设备
系统之间利用网络通信🤔
我们一直把系统视为一个独立的软硬件集合体,实际上现代经常通过网络和其他系统链接到一起。从一个单独的系统来看,网络可视为一个I/O设备,系统复制一串字节到网络适配器,数据流经网络到另一台机器而不是其他地方,同理机器可以读取从其他地方发来的数据,并复制到自己主存(这里没挂图,图比较抽象对理解也没有太大帮助)。
细想一下这种机制不就是我们邮件,即时通信,上网这样的场景都涉及到的吗。这就可以涉及到客户端与服务器的典型交互方式:在远程主机上敲了一句哈哈哈,此时客户端是连接到远程主机上的服务器的,远端接收到输入指令,就开始五步走战略:
这里的图大家意会理解就可以了,主要是体会一个过程,现在有些概念比较晦涩难懂(以上语言描述经过了我主管二次修改,意思是一样的)
线程级并发🤔
我们一直在要求计算机做的更多与做的更快,并发就是指一个同时具有多个活动的系统,并行是指并行使系统运行更快比如多线程。
我们设计出同时执行多个程序的系统,就会导致并发,线程概念甚至允许我们一个进程使用多个控制流,传统上并发只是模拟出来的,通过正在执行的进程快速切换实现就像一个杂技演员同时抛多个球,这就允许了许多人从一个 web 服务器获取页面的场景。多处理器系统是随着多核处理器和超线程的出现才变得常见,多核处理器是把多个CPU(核)集成到一个集成电路芯片上。
这里的超线程是同时多线程,允许一个CPU执行多个控制流的技术,常规处理器需要大约20 000个时钟周期做不同线程之间的转换,而超线程处理器可以在单个周期决定执行哪一个线程,这使得CPU能更好利用他处理资源。