1.操作系统简介
操作系统(Operating System,OS),是一种使程序运行变得容易的软件。它允许你同时运行多个程序,允许程序共享内存,让程序能够与设备进行交互,以及其他类似工作。
学习操作系统要理解操作系统的3个重要概念:虚拟化、并发、和持久性。
2.虚拟化
操作系统利用虚拟化技术将物理资源(处理器、内存、磁盘)转换为更通用、更强大且更易使用的虚拟形式。因此,有时我们将操作系统称为虚拟机。
虚拟化让许多程序同时运行(从而共享CPU),让许多程序可以同时访问自己的指令和数据(从而共享内存),让许多程序访问设备(从而共享磁盘等),所以操纵系统有时被称为资源管理器。每个CPU、内存和磁盘都是系统的资源,因此操作系统扮演的主要角色就是管理这些资源,以做到高效或公平。
2.1虚拟化CPU
在硬件的支持下,CPU交替执行多个程序,造成一种系统拥有非常多的虚拟CPU的假象。将单个CPU转换为看似无限数量的CPU,从而让多个程序看似同时运行,这就是虚拟化CPU。
一次运行多个程序会带来各种新问题。列如程序运行时间的分配、优先执行哪个程序。这个问题由操作系统的调度策略来回答。在这,操作系统承担了CPU资源管理器的角色。
2.1虚拟化内存
现代机器提供的物理内存模型很简单。内存就是一个字节数组。要读取内存,必须指定一个地址,
每个进程都要自己的私有虚拟空间(有时称为地址空间),操作系统以某种方式映射到物理内存上。相同的虚拟地址可以映射到不同的物理地址上。物理内存是由操作系统管理的进程之间共享的一种资源。
3.并发
并发的问题首先出现在操作系统中。在虚拟化CPU中,操作系统同时处理很多事情,首先运行一个进程,然后再运行另一个进程。事实证明,这会带来一些有趣的问题。
并发问题不再局限于操作系统本身。事实上,现代多线程程序也存在相同的问题。
例如如两个线程同时对一个全局变量进行计算。各自循环10000次,最后得到的结果不一定等于20000。
事实证明,这些奇怪的不正常的结果与指令如何执行有关,指令每次执行需要3条指令:一条从内存中加载数值到寄存器,一条进行递增,另一条将其保存会内存。因为这3条指令并不是原子方式执行的(所有指令一次性执行),所以奇怪的事情就可能会发生。
4.持久性
在系统内存中,数据容易丢失,因为像DRAM这样的设备以易失的方式存储。如果断电或者系统奔溃,内存中的所有数据就会丢失。因此,我们需要硬件和软件来持久地存储数据。
硬件以某种输入输出(IO)设备的形式出现。例如磁盘、固态硬盘等。操作系统中管理磁盘的软件通常称为文件系统。它负责以可靠和高效的方式,将用户创建的任何文件存储在系统的磁盘上。
不像操作系统为CPU和内存提供的抽象,操作系统不会为每个应用程序创建专用的虚拟磁盘。相反,它假设用户经常需要共享文件中的信息。
文件系统是操作系统的一部分,负责管理持久地数据。操作系统为了实际写入磁盘需要做很多工作:首先确定新数据将驻留在磁盘上的哪个位置,然后再文件系统所维护的各种结构中记录。这样需要向底层存储设备发出IO请求,以读取现有结构或更新它们。出于性能的方面的考虑,大多数文件系统首先会延迟这些写操作一段时间,希望将其批量分组为较大的组。为了处理写入系统奔溃的问题,大多数文件系统都包含某种复杂的写入协议,如日志或写时复制,仔细排序写入磁盘的操作,以确保如果在写入序列期间发生故障,系统可以在之后恢复到合理状态。
5.设计目标
操作系统取得了CPU、内存或磁盘等物理资源,并对它们进行虚拟化。它处理与并发有关的麻烦且棘手的问题。它能持久地存储文件,从而使它们长期安全。
抽象化
设计操作系统的一个基本目标,就是建立一些抽象,让系统方便和易于使用。抽象使得编写一个大型程序成为可能,将其划为小而且容易理解的部分,用C这样的高级语言不用考虑汇编,用汇编写代码不用考虑逻辑门,用逻辑门来构建处理器不用考虑晶体管
高性能
设计实现操作系统另一个目标,是提供高性能,即最小化操作系统的开销。虚拟化和抽象化是非常值得的,但不能不计成本。这些开销多数体现在额外的时间(运行效率)和额外的空间(更多的内存和磁盘)。
安全性
另一个目标是在应用程序之间以及在OS和应用程序之间提供保护。我们要确保一个程序的恶意或者偶尔不良行为不会损坏其他程序和操作系统。因此,我们要让进程之间隔离。