操作系统中几个常用关键的概念

应用程序没有直接访问键盘、显示器、磁盘或者主存的能力。取而代之的是,它们依靠操作系统提供的服务。我们可以把操作系统看成是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统。

image.png

操作系统有两个基本功能:

1、防止硬件被失控的应用程序滥用。

2、向应用程序提供简单一致的机制来控制复杂而又通常大不相同的底层硬件设备。


一、进程&线程

image.png

      进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。在大多数系统中,需要运行的进程数是多于可以运行它们的CPU个数的。传统系统在一个时刻只能执行一个程序,而先进的多核处理器同时能够执行多个程序。

      尽管通常我们认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。由于网络服务器中对并行处理的需求,线程成为越来越重要的编程模型,因为多线程之间比多进程之间更容易共享数据,也因为线程一般来说都比进程更高效。当有多处理器可用的时候,多线程也是一种使得程序可以运行得更快的方法。


二、并发&并行

1、并发(Concurrent)一般是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

(1.线程级并发通常有两种策略,多核技术和超线程技术:

(1)多核处理器是指在一枚处理器中集成两个或多个完整的计算引擎(内核),此时处理器能支持系统总线上的多个处理器,由总线控制器提供所有总线控制信号和命令信号。多核技术可以很好的解决由于单独提高单核芯片的速度会产生过多热量且无法带来相应的性能改善等问题。当前ARM架构的处理器通常采用多核技术来提升处理器性能。

(2)超线程指在物理核基础上,提供两个逻辑线程。对os来说,可以就当做两个物理核来使用。超线程毕竟不是增加物理核,性能上会有所差异。对计算密集性的应用,可以发挥出近似于两个物理核的效能。对于非1/O密集型的应用,因为没有独立的二级缓存,性能优势就没那么明显了。

(2.线程和超线程有什么区别?

      一个线程在执行时会占用CPU资源,其他线程想要得到执行就必须等待该线程将CPU资源让出。

      利用超线程技术,模拟出的两个逻辑内核共享同一个CPu资源,所以同一时刻可以有两个线程都占用CPU资源,因此这两个线程都可以得到执行,这就是实现同一时间执行两个线程的并行操作。


2、并行( Parallel)一般是指许多指令得以同时进行的计算模式。

      指令级并行:指令集的是更低层次的概念。计算机处理问题是通过指令实现的,每个指令都是交给CPU执行。初级处理器一次只能执行一个指令。通过使用流水线( Pipeline)技术,当指令之间不存在相关时,将计算机指令处理过程拆分为多个步骤,并通过多个硬件处理单元并行执行来加快指令执行速度。在使用流水线的处理器中一个指令不是在处理器的一个时钟信号周期中完成的,而是被分到多个信号中去完成,但是与此同时多个指令的分任务被同时处理。

      单指令,多数据并行:在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即SIMD并行。例如,较新几代的Intel和AMD处理器都具有并行地对8对单精度浮点数CC数据类型float)做加法的指令。


三、上下文

      无论是在单核还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,但是在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程。新进程就会从它上次停止的地方开始。操作系统保持跟踪进程运行所需的所有状态信息。这种状态,也就是上下文,包括许多信息,比如PC和寄存器文件的当前值,以及主存的内容。

      从一个进程到另一个进程的转换是由操作系统内核( kernel)管理的。

image.png


四、虚拟内存

      虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分成多片,每一片被称作“页或页面( page)”,页内的地址范围是连续的。这些页被映射到实际的物理内存中,但并不是程序地址空间的所有页都必须在内存中程序才能运行。当程序引用到一部分在物理内存中的页(地址空间)时,由硬件立即完成地址映射执行程序;当程序引用到一部分不在物理内存中的页时,有操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

      大部分虚拟内存系统中都使用一种被称作“分页”的技术。由程序产生的地址称为“虚拟地址”,它们构成了一个“虚拟地址空间”。在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到“内存管理单元”( Memory Management Unit,MMU ) ,MMU将虚拟地址映射为物理地址。

      由于虚拟内存和分页机制,每次内存访问都需要进行虚拟地址到物理地址的转换,而指令最终都是来自内存,因此,每条指令都需要进行一两次或更多次页表访问(内存访问,页表是保存在内存中的)。为避免映射成为瓶颈,快速的页映射需求是必定的。TLB ( Translation Lookaside Buffer)可以将虚拟地址直接映射到物理地址,不需要再访问页表。TLB的每个表项记录了一个页面的相关信息,但是TLB能够记录的表项一般情况下比较少。进行地址映射是会首先匹配TLB中记录的虚拟页,当没有检测到有效地匹配项时就会进行正常的页表查询,并从TLB中淘汰一个表项,用新找到的表项代替它。

      另外,如果页面大小为4KB,4GB( 32位)虚拟地址空间需要1M的页表项,假设一个页表项占8个字节,那么一个进程的页表就需要占用8MB的内存,每个进程都需要自己的页表。更大的虚拟地址空间页表占用的内存更多,64位虚拟地址空间的页表就会超过3000万GB。解决巨大的虚拟地址空间的方法有两种,一种是多级页表,一种是倒排页表。多级页表可以避免把全部页表一直保存在内存中,特别是那些不需要的页表就不应该保留。例如一个需要12MB内存的进程,最底端是4MB的代码段,后面是4MB的数据段,顶端是4MB的堆栈段,中间是大量的根本没有使用的地址空间,这部分不需要建立映射。如下图,使用二级页表只需要4个页表( 32KB)就可以了。倒排页表在实际内存中不是每一个虚拟页面有一个表项,而是每个页框有一个表项,因此可以节省大量的空间。

image.png

(完)