操作系统概述
# 相关概念
- 程序运行时会发生什么
一个正在运行的程序会做一件非常简单的事情:执行指令。
CPU从内存中获取(fetch)到一条指令,对其解码(decode),然后执行它。完成这条指令后,CPU继续执行下一条指令,依此类推,直到程序运行完成。
- 虚拟化
操作系统将物理资源(CPU、内存、磁盘等资源)转换为更通用、更强大且更易于使用的虚拟化形式。因此我们有时称操作系统为虚拟机(virtual machine)。
os 与 vm 区别
你说的这个观点有一定道理,从某种角度来看,操作系统的确是通过对物理资源的虚拟化,提供了一个“抽象层”来管理硬件资源,并使得应用程序可以在这个抽象层上运行,而不需要直接与底层硬件打交道。这种“虚拟化”让操作系统显得像一个虚拟机,管理和调度硬件资源,提供一个统一、易于使用的接口给应用程序和用户。
但这个比喻仍然有些不完全准确。因为“虚拟机”通常指的是通过硬件虚拟化技术创建的独立环境,这些虚拟环境能运行自己的操作系统,并且看起来像是一个独立的计算机。而操作系统本身更多是一个资源管理器,它直接运行在物理硬件上,并为用户提供一个操作界面。
总结来说,操作系统的确通过虚拟化技术为应用程序提供了一个统一的资源管理平台,可以类比为“虚拟机”,但严格来说,它并不是一个虚拟机,而是管理和调度虚拟资源的工具。这个比喻可以帮助理解操作系统的工作方式,但在技术上有一些差异。
虚拟化让许多程序运行(共享CPU),让许多程序可以同时访问自己的指令和数据(共享内存),让许多程序访问设备(共享磁盘),所以操作系统有时被称为资源管理器(resource manager)。每个CPU、内存和磁盘都是系统的资源(resource),因此操作系统扮演的主要角色就是管理这些资源,以做到高效公平。
- API
为了让用户可以告诉操作系统做什么,从而利用虚拟机的功能(如运行程序、分配内存或访问文件),操作系统提供了一些接口,供用户调用。我们有时会说操作系统为应用程序提供了一个标准库(standard library)
# 什么是操作系统
负责让程序运行变得容易,甚至允许同时运行多个程序,允许程序共享内存,让程序能够与设备进行交互,这就是操作系统,它们负责确保系统既易于使用又正确高效运行。
# 虚拟化CPU
将单个CPU(或其中一小部分)转换为看似无限数量的CPU,从而让许多程序看似同时运行,这就是所谓的虚拟化CPU(virtualizing the cpu)。
# 虚拟化内存
现代机器提供的物理内存模型非常简单,内存就是一个字节数组。要读取内存,必须指定一个地址,才能访问存储在那里的数据,要写入或者更新内存,还必须指定要写入给定地址的数据。
程序运行时,一直要访问内存。程序将所有数据结构保存在内存中,并通过各种指令来访问它们。
每个进程访问自己的私有虚拟地址空间(virtual address space),操作系统以某种方式映射到机器的物理内存上。一个正在运行的程序中的内存引用不会影响其他进程的地址空间,对于正在运行的程序,它完全拥有自己的物理内存。
# 并发
并发问题首先出现在操作系统本身中。但是,并发问题不再局限在操作系统本身,现代多线程程序也存在相同的问题。
# 持久性
在系统内存中,数据容易丢失,因为像DRAM这样的设备以易失的方式存储数值。如果断电或者系统崩溃,那么内存中的所有数据都会丢失。因此我们需要硬件和软件持久地存储数据。
硬件以某种I/O设备的形式出现。在现代系统中,硬盘驱动器是存储长期保存的信息的通用存储库。
操作系统中管理磁盘的软件通常称为文件系统(file system),文件系统是操作系统的一部分,负责管理持久的数据。因此它负责以可靠和高效的方式,将用户创建的任何文件存储在系统的磁盘上。
# 设计目标
一个最基本的目标,是建立一些抽象(abstraction),让系统方便和易于使用。
设计和实现操作系统的一个目标,是提供高性能(performance)。换言之,我们的目标是最小化操作系统的开销(minize the overhead)。虚拟化和让系统易于使用是非常值得的,但不会不计成本。因此,我们必须努力提供虚拟化和其他操作系统功能,同时没有过多的开销。这些开销会以多种形式出现:额外时间(更多指令)和额外空间(更多磁盘和内存)
另一个目标是在应用程序之间以及在OS和应用程序之间提供保护(protection)。保护是操作系统基本原理之一的核心,这就是隔离(isolation)。让进程彼此隔离是保护的关键。
操作系统力求高度的提供高度的可靠性(reliability)。
其他目标:能源效益(energy efficiency),安全性(security),移动性(mobility)。
# 发展历史
- 早期操作系统:只是一些常用函数库。避免每个让每个程序员编写低级I/O处理代码,而是让OS提供这样的API,这样开发人员的工作更加轻松。通常,在这些旧的大型机系统上,一次运行一个程序,是由操作员来控制。
- 超越库:保护。操作系统除了提供一些常用库外,还扮演着其他方法面更为重要的角色。诞生了系统调用的概念。系统调用和过程调用的区别在于,系统调用将控制转移到OS中,同时提高硬件特权级别。用户应用程序以所谓的用户模式运行,这意味着硬件限制了应用程序的功能。
- 多道程序时代:操作系统的真正兴起在大主机计算时代之后,即小型机(minicomputer)时代。由于希望更好的利用机器资源,多道程序(multiprogramming)变得很普遍。
- 摩登时代:除了小型计算机外,还有一种新型机器,我们称之为个人计算机(personal computer ,pc)。