计算机操作系统

一、操作系统概述

计算机系统由硬件系统和软件系统两大部分组成。操作系统(英语:Operating System,缩写:OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

用户角度的操作系统位置

计算机系统层次结构

二、操作系统发展

  • 无操作系统阶段

从第一台计算机诞生(1945年)到20世纪50年代中期的计算机,属于第一代计算机。这时还未出现OS,计算机操作是由用户(即程序员)采用人工操作方式直接使用计算机硬件系统,即由程序员将事先已穿孔(对应于程序和数据)的纸带(或卡片)装入纸带输入机(或卡片输入机),再启动它们将程序和数据输入计算机,然后启动计算机运行。当程序运行完毕并取走计算结果之后,才让下一个用户上机。这种方式下,随着CPU速度的提高和系统规模的扩大,人工操作方式严重降低了计算机资源的利用率,人机矛盾变得日趋严重。

  • 单道批处理系统

上世纪50 年代中期发明了晶体管,人们开始用晶体管替代真空管来制作计算机,从而出现了第二代计算机。为了能充分地利用它,应尽量让该系统连续运行,以减少空闲时间。为此,通常是把一批作业以脱机方式输入到磁带上,并在系统中配上监督程序(Monitor),在它的控制下使这批作业能一个接一个地连续处理,这样便形成了早期的批处理系统。由于系统对作业的处理都是成批地进行的,且在内存中始终只保持一道作业,故称此系统为单道批处理系统(Simple Batch Processing System)。

单道批处理系统是最早出现的一种OS。严格地说,它只能算作是OS的前身而并非是现在人们所理解的OS。批处理系统的出现主要是为了解决人机矛盾以及CPU和I/O设备速度不匹配的矛盾。

  • 多道批处理系统

20 世纪60 年代中期,人们开始利用小规模集成电路来制作计算机,生产出第三代计算机。在单道批处理系统中,内存中仅有一道作业,它无法充分利用系统中的所有资源,致使系统性能较差。为了进一步提高资源的利用率和系统吞吐量,在20 世纪60 年代中期又引入了多道程序设计技术,由此而形成了多道批处理系统(Multiprogrammed Batch Processing System)。在该系统中,用户所提交的作业都先存放在外存上并排成一个队列,称为“后备队列”;然后,由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享CPU 和系统中的各种资源。

多道批处理系统是一种有效、但十分复杂的系统。为使系统中的多道程序间能协调地运行,必须解决一系列问题。包括:处理机管理问题(多道程序如何分配CPU)、内存管理问题(多道程序如何分配内存,及共享内存和程序异常问题)、I/O 设备管理问题(多道程序如何分配I/O资源)、文件管理问题(如何管理系统中程序和数据问题)、作业管理问题(多道程序中不同作业的组织管理问题)。

为此,应在计算机系统中增加一组软件,用以对上述问题进行妥善、有效的处理。这组软件应包括:能控制和管理四大资源(CPU、进程、内存、I/O)的软件,合理地对各类作业进行调度的软件,以及方便用户使用计算机的软件。正是这样一组软件构成了操作系统。

  • 分时系统

分时系统(Time Sharing System)与多道批处理系统之间有着截然不同的性能差别,它能很好地将一台计算机提供给多个用户同时使用,提高计算机的利用率。

  • 实时系统

所谓“实时”,是表示“及时”,而实时系统(Real Time System)是指系统能及时(或即时)响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。虽然,多道批处理系统和分时系统已能获得较为令人满意的资源利用率和响应时间,从而使计算机的应用范围日益扩大,但它们仍然不能满足以下某些应用领域的需要。比如,实时控制系统,当把计算机用于生产过程的控制,以形成以计算机为中心的控制系统时,系统要求能实时采集现场数据,并对所采集的数据进行及时处理,进而自动地控制相应的执行机构,使某些(个)参数(如温度、压力、方位等)能按预定的规律变化,以保证产品的质量和提高产量。类似地,也可将计算机用于对武器的控制,如火炮的自动控制系统、飞机的自动驾驶系统,以及导弹的制导系统等;实时信息处理系统,该系统由一台或多台主机通过通信线路连接到成百上千个远程终端上,计算机接收从远程终端上发来的服务请求,根据用户提出的请求对信息进行检索和处理,并在很短的时间内为用户做出正确的响应。如:网上订票,网上购物等。

微机操作系统

  • 单用户单任务:MS-DOS
  • 单用户多任务:windows
  • 多用户多任务:UNIX OS、Solaris OS、Linux OS

引申阅读:摩尔定律 公众号:科技开讲当摩尔定律失效 三大IT定律

三、操作系统特性

批处理系统、分时系统、实时系统都各自有着自己的特征,如批处理系统具有能对多个作业进行成批处理,以获得高的系统吞吐量的特征,分时系统具有允许用户和计算机进行人机交互特征,实时系统具有实时特征。但它们也都具有并发、共享、虚拟和异步这四个基本特征。其中,并发特征是操作系统最重要的特征,其它三个特征都是以并发特征为前提的。

  • 并发

并行是指两个或多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在单核系统上,在任何时刻CPU只能执行一个进程,微观上这些程序只能是分时地交替执行,宏观上看似是并行执行,实际是串行。在多核系统上,才能实现真正的并行执行。而正是由于CPU的这种时间片切换调度算法,使得多个程序实现了并发执行。

通常的程序是静态实体,它们不能独立运行,也不能和其他程序并发执行,所以,操作系统引入了进程的概念。在没有进程的系统中,同属于一个程序的计算程序和I/O程序,两者只能顺序执行。但在引入进程之后,分别为计算程序和I/O程序各建立一个进程,则两个进程可以并发执行。而多个程序在并发执行时,系统也是为每个程序建立进程(Process),然后,由操作系统调度实现多个程序的并发执行。简单来讲,进程是指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。多个进程的并发执行,进程间可以通信,进程运行时需要一定的资源,如CPU、存储空间、I/O等,这一系列就涉及到了进程管理。而进程和并发是现代操作系统最重要的基本概念,也是系统运行的基础,它所涉及的概念、算法,在很多高级语言中,特别是在多核系统时代,都是很经典的解决方案和指导思想。

长期以来,进程都是操作系统中可以拥有资源并作为独立运行的基本单位。直到20世纪80年代中期,人们才又提出了比进程更小的单位——线程(Threads)。进程拥有自己的地址空间,而线程没有,一个进程可以保护若干个线程,并且这些线程共享进程的资源,由于线程比进程更小,故对它的调度所付出的开销要小,能更高效的提高系统内多个程序间并发执行的程度。现在很多操作系统都支持线程,在Unix System V及SunOS中,线程也被称为轻量进程(lightweight processes),但大部分概念里,轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。线程的调度,线程间的通信,线程状态的切换,以及基于线程一些资源的处理等,这些线程的管理操作,是现代操作系统的重要标志,多线程的运行情况更是操作系统性能的一个重要指标。

现在越来越多语言支持协程,一种比线程更轻量级的调度单位,进程和线程的管理都需要系统内核的调度,而协程完全是由应用程序控制和调度。这样,可以减少一些不必要的系统调度。对一些特定场景的应用,减少对系统资源的使用,可以更好地增加整个系统的并发程度。如:go语言的goroutine。

  • 共享

所谓共享(Sharing),是指系统中的资源可供内存中多个并发执行的进程(线程)共同使用,相应地,把这种资源共同使用称为资源共享,或称为资源复用。由于资源的属性不同,实现资源复用的方式也不同,通常包含互斥和同时。

互斥共享方式当一个进程A 要访问某资源时,必须先提出请求。如果此时该资源空闲,系统便可将之分配给请求进程A 使用。此后若再有其它进程也要访问该资源时(只要A 未用完),则必须等待。仅当A 进程访问完并释放该资源后,才允许另一进程对该资源进行访问。我们把这种资源共享方式称为互斥式共享,而把在一段时间内只允许一个进程访问的资源称为临界资源或独占资源。计算机系统中的大多数物理设备,以及某些软件中所用的栈、变量和表格,都属于临界资源,它们要求被互斥地共享。为此,在系统中必需配置某种机制来保证诸进程互斥地使用独占资源。

同时访问方式:系统中还有另一类资源,允许在一段时间内由多个进程“同时”对它们进行访问。典型的可供多个进程“同时”访问的资源是磁盘设备,一些用重入码编写的文件也可以被“同时”共享,即若干个用户同时访问该文件。

  • 虚拟

操作系统中的所谓“虚拟”(Virtual),是指通过某种技术把一个物理实体变为若干个逻辑上的对应物。物理实体(前者)是实的,即实际存在的,而后者是虚的,仅是用户感觉上的东西。用于实现虚拟的技术称为虚拟技术。在操作系统中利用了两种方式实现虚拟技术,即时分复用技术和空分复用技术。

时分复用技术是指通过将时间分成时间片供进程切换执行,来实现的一种资源复用的工作方式。最早的时分复用技术用于电信业中,为了提高信道的利用率,人们利用时分复用方式,将一条物理信道虚拟为多条逻辑信道,将每条信道供一对用户通话。在计算机领域中,广泛利用该技术来实现虚拟处理机、虚拟设备等,以提高资源的利用率。

虚拟处理机技术,利用多道程序设计技术,为每道程序建立一个进程,让多道程序并发地执行,以此来分时使用一台处理机。

虚拟设备技术,将一台物理I/O 设备虚拟为多台逻辑上的I/O 设备,并允许每个用户占用一台逻辑上的I/O 设备,这样便可使原来仅允许在一段时间内由一个用户访问的设备(即临界资源),变为在一段时间内允许多个用户同时访问的共享设备。

空分复用技术是指利用空间的分割实现复用的一种方式。电信业使用频分复用技术来提高信道的利用率,它是将一个频率范围非常宽的信道,划分成多个频率范围较窄的信道,其中的任何一个频带都只供一对用户通话。计算机中也使用了空分复用技术来提高存储空间的利用率。

虚拟磁盘技术:通常在一台机器上只配置一台硬盘,我们可以通过虚拟磁盘技术将一台硬盘虚拟为多台虚拟磁盘,这样使用起来既方便又安全。

虚拟存储器技术:在没有采用虚拟技术的操作系统环境下,处理机会有很多空闲时间,内存也会有很多空闲空间,显然,这会使处理机和内存的效率低下。时分复用技术是利用处理机的空闲时间来运行其它的程序,使处理机的利用率得以提高,那么空分复用则是利用存储器的空闲空间来存放其它的程序,以提高内存的利用率。

单纯的空分复用存储器只能提高内存的利用率,并不能实现在逻辑上扩大存储器容量的功能。而虚拟存储技术的引入,使一道程序可以在远小于它的内存空间中运行。虚拟存储技术的本质是将物理内存分隔成多个碎片(还有部分暂时存储在外部磁盘存储上,需要时进行数据交换),在程序运行期间,不必完全装入内存中,而是每次通过“请求调入功能”、“置换功能”,将程序的一部分调入内存运行。常见的实现包括页式虚拟存储系统、段式虚拟存储系统,即离散的基本单位是页或者段。

  • 异步

操作系统的进程在执行时,通常需要获得某些资源,才能继续执行,而这些资源如打印机,属于临界资源。如请求临界资源时,其他线程正在占用打印机,此时,线程只能等待,且放弃处理机,直到打印机空闲,并再把处理机分配给该进程时,进程方能继续进行。可见,由于某些因素的限制,进程的执行不会是“一气呵成”的,而是“走走停停”的方式。由于操作系统的调度和各种资源的限制,以及程序运行时操作系统的不可预知的特点,使得程序的执行结果和执行状况不是确定的,这些结果体现了操作系统的异步性,也就是说,正是由于操作系统的异步性,才会使程序的运行具有不可预知的情况。而操作系统的异步性,也是因为操作系统的各种机制导致的,比如处理器分时调度、临界资源的限制,进程运行时操作系统的其他状况等。

四、操作系统功能

操作系统的主要任务,是为多道程序的运行提供良好的运行环境,以保证多道程序能有条不紊地、高效地运行,并能最大程度地提高系统中各种资源的利用率和方便用户的使用。为实现上述任务,操作系统应具有这样几方面的功能:处理机管理,存储器管理,设备管理和文件管理。

  • 处理机管理功能

处理机的分配和运行都是以进程为基本单位,因而对处理机的管理可归结为对进程的管理;在引入了线程的OS中,也包含对线程的管理。处理机管理的主要功能如下:

进程控制:程序的运行,必须先为它创建一个或几个进程,并为进程分配必要的资源。当进程结束时,立即撤销进程,并回收相应的资源。进程控制的主要就是进程创建、进程结束以及在进程执行中进程状态的切换等(线程同理)。

进程同步:主要是保证在多个进程在并发时的协调机制,不同进程间可能是不同的同步关系。如,对同一临界资源操作的是互斥;做一件事的前后两个进程,属于合作关系,他们之间是同步的。

进程通信:在一个程序运行时,可能会创建多个进程,这些进程(线程)相互合作去完成一个共同的任务。而在这些进程(线程)之间,又往往需要交换信息。进程间通信(IPC,InterProcess Communication)的方式通常有管道、消息队列、信号量、共享内存、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。进程通信是操作系统内核层极为重要的部分。

进程调度:广义上的进程调度,是指整个进程的生命周期中,进程创建、进程获取处理器时间片执行、到最后进程的终止。这里的进程调度,主要是分为长程调度、短程调度、中程调度。

长程调度,又称作业调度,用于决定把外存上处于后备队列中的哪些作业调入内存,并为它们创建进程、分配必要的资源,然后,再将新创建的进程排在就绪队列上,准备执行。

短程调度,又称进程调度,用来决定就绪队列中的哪个进程应获得cpu,然后再由分派程序把处理机分配给该进程的具体操作。

中程调度,引入中程调度的主要目的,是为了提高内存利用率和系统吞吐量。

  • 存储器管理功能

存储器管理的主要任务是为多道程序的运行提供良好的环境,方便用户使用存储器,提高存储器的利用率以及能从逻辑上扩充内存。

内存分配:内存分配是指为每个进程分配内存空间,以供进程存放程序执行代码、进程的堆栈空间、程序数据等。OS在实现内存分配时,可采取静态和动态两种方式。静态分配是在作业装入时,确定每个作业的内存空间,之后运行期间,不会再申请内存空间;动态分配是在装入时分配基本的内存空间,后续可以继续申请内存空间,以适应程序的动态增长。

内存保护:为了确保每道程序都只在自己的内存区中运行,必须设置内存保护机制。使进程间不会互相干扰,进程也不会访问操作系统的程序和数据。通常使用界限寄存器设置上界、下界,以保证程序不会越界操作,由软硬件配合实现。

地址映射:每个进程都有自己的地址空间,用于存放程序的指令和数据。程序在经过编译、链接之后,形成完整的装入程序,这些程序的地址都是从“0”开始的,这些地址成为逻辑地址。在装入内存运行时,需要将逻辑地址转化成内存单元所限定的物理地址,这就是地址映射。操作系统通常使用重定位寄存器(也叫基址定位器),来实现地址映射(地址重定位)。

内存扩充:存储器管理中的内存扩充任务并非是去扩大物理内存的容量,而是借助于虚拟存储技术,从逻辑上去扩充内存容量,使用户所感觉到的内存容量比实际内存容量大得多,以便让更多的用户程序并发运行。为了能在逻辑上扩充内存,系统通常需要实现请求调入功能、置换功能。

请求调入功能:允许在装入一部分用户程序和数据的情况下,便能启动该程序运行。若在程序运行中,发现所需程序和数据尚未装入内存,可向OS发送请求,将所需部分调入内存,以便继续执行。

置换功能:若发现内存中已无足够空间来装入需要调入的程序和数据时,系统应将内存中的一部分暂时不用的程序和数据调到磁盘上,以腾出空间,供所需要的程序,将其数据装入内存。

  • 设备管理功能

设备管理用于管理计算机系统中所有的外围设备,而设备管理的主要任务是:完成用户进程提出的I/O 请求;为用户进程分配其所需的I/O 设备;提高CPU 和I/O 设备的利用率;提高I/O速度;方便用户使用I/O设备。

缓冲管理:由于CPU和I/O设备速度的不匹配的矛盾,严重降低了CPU的利用率。所以,在现代操作系统中,几乎所有的I/O设备在与处理机交换数据时都用了缓冲区。不仅缓和CPU和I/O设备速度不匹配的矛盾,提高了CPU的利用率,进而提高了系统的吞吐量,而且改善了系统的性能。

设备分配

为防止诸进程对系统资源的无序竞争,特规定系统设备不允许用户自行使用,必须 由系统统一分配。为了实现设备分配,系统中应设置设备控制表、控制器控制表等数据结构,用于记录设备及控制器的标识符和状态。对于不同设备有不同的分配策略,包括独占设备(临界资源)、共享设备、虚拟设备。

设备驱动程序:其基本任务是用于实现CPU和设备控制器之间的通信,即由CPU 向设备控制器发出I/O 命令,要求它完成指定的I/O 操作;反之,由CPU接收从控制器发来的中断请求,并给予迅速的响应和相应的处理。

虚拟设备:这里主要是I/O设备的虚拟化,不包括内存虚拟化、处理器虚拟化。虚拟化的I/O设备主要是磁盘和网卡,常见的磁盘虚拟设备是RAID,它是对多个物理磁盘驱动器虚拟成一个大容量的逻辑驱动器。虚拟网卡,将一张物理网卡虚拟成多张虚拟网卡(vNIC),通过虚拟程序隔离不同应用。从而达到资源的合理利用,避免物理资源的浪费。

  • 文件管理功能

“一切皆文件”是linux/unix的哲学核心思想。这里的文件不仅仅是我们通常指的文件。在现代操作系统中,总是把程序和数据以文件形式存在磁盘上。为此,在操作系统中必须配置文件管理机构。文件管理功能主要包括如下:

文件存储空间的管理:为了方便用户的使用,文件系统对诸多文件及文件的存储空间实施统一的管理。为每个文件分配必要的外存空间,提高外存的利用率,并能有助于提高文件系统的存、取速度。为此,系统设置相应的数据结构,用于记录文件存储空间的使用情况,以供分配存储空间时参考。另外,文件系统还有对存储空间进行分配和回收的功能。

目录管理:为了使用户能方便地在外存上找到自己所需的文件,通常由系统为每个文件建立一个目录项。目录项包括文件名、文件属性、文件在磁盘上的物理位置等。

文件的读/写管理和保护:文件系统提供基本的文件读写功能,根据用户的读请求,从存储中读取文件;根据写请求,向目标文件中写内容。为了防止系统中的文件被非法窃取和破坏,在文件系统中必须提供有效的存取控制功能,即文件保护,如Linux的权限机制。

  • 内核函数

在OS内核中设置了一组为了实现各种系统功能的程序,并将它们提供给应用调用,但避免应用程序破坏内核程序,所以以系统调用方式,让应用程序去调用所需要的系统服务。在高级语言以及C语言中,通常提供与各系统调用一一对应的库函数,如Java中的JNI方法的实现。

在应用需要操作系统提供服务时,如请求I/O资源或执行I/O操作,操作系统提供了一种保护机制,避免了系统的不安全性。当操作系统捕获到该命令后,便将CPU的状态从用户态转换到系统态,然后执行操作系统中相应的内核函数。执行完成后,系统又CPU状态从系统态转换到用户态,再继续执行应用程序。系统调用是通过中断机制实现的。

目前许多操作系统都提供了上面所介绍的各种类型的系统调用,实现的功能也相类似,但在实现的细节和形式方面却相差很大,这种差异给实现应用程序与操作系统平台的无关性带来了很大的困难。为解决这一问题,国际标准化组织ISO 给出的有关系统调用的国际标准POSIX,也称为“基于UNIX 的可移植操作系统接口”。POSIX 定义了标准应用程序接口(API),用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。

五、OS结构设计

早期OS很小,只有几十KB,随着OS规模的愈来愈大,其所具有的代码也愈来愈多。原来一个人就可以完成的代码,现在需要几十人甚至上百人,这意味着,操作系统的设计,应采用工程化的方法对大型的软件进行开发。由此,产生了“软件工程学”。

软件开发技术的不断发展,促进了OS 结构的更新换代。从早期的传统结构的OS,发展到现代结构的OS。把早期的无结构OS(第一代)、模块化结构的OS(第二代)和分层式结构的OS(第三代),都统称为传统结构的OS,而把微内核结构的OS称为现代结构的OS。

这个发展过程很像,我们现实工作中互联网产品的迭代过程。拿我们曾经的产品举例子来说一下,早期我们的电商产品,所有功能模块都在一个大系统里,包括首页、产品页、购物车、结算、支付等,因为这时大家更关注功能,而且业务流量也不是很大。但随着公司的发展,性能问题,业务问题都逐渐显现出来了。所以,要拆分系统,进行微服务的改造。这样,才能提升产品的整体性能和各自业务线的发展,不至于互相影响,互相制约。

通常在软件工程里,面对复杂的系统的设计,都使用模块化,分层的结构思想。将OS按其功能精心地划分为若干个具有一定独立性和大小的模块;每个模块具有某方面的管理功能。并仔细地规定好各模块间的接口,使各模块之间能通过该接口实现交互。和电商系统拆分一样,相信很多公司在做微服务改造时,都面临着这个问题。而操作系统的这些模块的划分也要适当,模块划分如果过小,虽然可以降低模块本身的复杂性,但会引起模块之间的联系过多,而会造成系统比较混乱;模块划分如果过大又会增加模块内部的复杂性,使内部的联系增加。因此,在划分模块时,应在两者间进行权衡。

层次结构是一种操作系统的组织结构,其提供了一种隔离操作系统各层功能的模型。它的最大特点就是将一个大型复杂的系统分解成若干单向依赖的层次,也叫自底向上的分层设计,每一层仅能使用其底层所提供的功能和服务。这种自下而上的设计方式,使所有设计中的决定都是有序的,或者说是建立在较为可靠的基础上的,这样比较容易保证整个系统的正确性。而且在系统中增加、修改或替换一个层次中的模块或整个层次,只要不改变相应层次间的接口,就不会影响其它层次,这必将使系统维护和扩充变得更加容易。不过,就像将整体的电商服务拆分成,单体的微服务一样,这样的拆分,增加了各个层级间的通信开销,使系统的效率降低了。


  1. 《操作系统——维基百科》
  2. 《计算机操作系统 第三版》
  3. 《深入理解计算机系统》
  4. 《现代操作系统 第四版》
  5. https://www.ibm.com/developerworks/cn/linux/theory/os/explore/part1/index.html
  6. https://www.pingwest.com/a/50674

原文发布于微信公众号 - BanzClub(banz-club)

原文发表时间:2019-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券