Skip to content

Latest commit

 

History

History
175 lines (103 loc) · 21.9 KB

Concept.md

File metadata and controls

175 lines (103 loc) · 21.9 KB

操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。计算机操作系统是随着计算机研究和应用的发展逐步形成并发展起来的,它是计算机系统中最基本的系统软件。

操作系统的特征

操作系统是一种系统软件,但与其他的系统软件和应用软件有很大的不同,它有自己的特殊性即基本特征。操作系统的基本特征包括并发、共享、虚拟和异步。

并发(Concurrence):并发是指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中同时存在多个运行着的程序,因此它具有处理和调度多个程序同时执行的能力。在操作系统中,引入进程的目的是使程序能并发执行。

共享(Sharing):资源共享是指系统中的资源可供内存中多个并发执行的进程共同使用。共享可分为以下两种资源共享方式:

  • 互斥共享方式:系统中的某些资源,如打印机、磁带机,虽然它们可以提供给多个进程使用,但为使所打印或记录的结果不致造成混淆,应规定在一段时间内只允许一个进程访问该资源。
  • 同时访问方式:系统中还有另一类资源,允许在一段时间内由多个进程同时对它们进行访问。这里所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问即 “分时共享”。典型的可供多个进程“同时”访问的资源是磁盘设备,一些用重入码编写的文件也可以被“同时”共享,即若干个用户同时访问该文件。

并发和共享是操作系统两个最基本的特征,这两者之间又是互为存在条件的:资源共享是以程序的并发为条件的,若系统不允许程序并发执行,则自然不存在资源共享问题;若系统不能对资源共享实施有效的管理,也必将影响到程序的并发执行,甚至根本无法并发执行。

虛拟(Virtual):虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实的,即实际存在的;而后者是虚的,是用户感觉上的事物。用于实现虚拟的技术,称为虚拟技术。在操作系统中利用了多种虚拟技术,分别用来实现虚拟处理器、虚拟内存和虚拟外部设备等。

在虚拟处理器技术中,是通过多道程序设计技术,让多道程序并发执行的方法,来分时使用一个处理器的。此时,虽然只有一个处理器,但它能同时为多个用户服务,使每个终端用户都感觉有一个中央处理器(CPU)在专门为它服务。利用多道程序设计技术,把一个物理上的CPU虚拟为多个逻辑上的CPU,称为虚拟处理器。类似地,可以通过虚拟存储器技术,将一台机器的物理存储器变为虚拟存储器,以便从逻辑上来扩充存储器的容量。当然,这时用户所感觉到的内存容量是虚的。我们把用户所感觉到的存储器(实际是不存在的)称为虚拟存储器。

因此,操作系统的虚拟技术可归纳为:时分复用技术,如处理器的分时共享;空分复用技术,如虚拟存储器。

异步(Asynchronism):在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。

异步性使得操作系统运行在一种随机的环境下,可能导致进程产生与时间有关的错误 (就像对全局变量的访问顺序不当会导致程序出错一样)。但是只要运行环境相同,操作系统必须保证多次运行进程,都获得相同的结果。

操作系统目标

为了给多道程序提供良好的运行环境,操作系统应具有以下几方面的功能:处理机管理、存储器管理、设备管理和文件管理。为了方便用户使用操作系统,还必须向用户提供接口。

操作系统作为计算机系统资源的管理者:

  • 处理机管理:在多道程序环境下,处理机的分配和运行都以进程(或线程)为基本单位,因而对处理机的管理可归结为对进程的管理。并发时在计算机内同时运行多个进程,所以,进程何时创建、何时撤销、如何管理、如何避免冲突、合理共享就是进程管理的最主要的任务。进程管理的主要功能有:进程控制、进程同步、进程通信、死锁处理、处理机调度等。
  • 存储器管理:存储器管理是为了给多道程序的运行提供良好的环境,方便用户使用以及提高内存的利用率,主要包括内存分配、地址映射、内存保护与共享和内存扩充等功能。
  • 文件管理:计算机中的信息都是以文件的形式存在的,操作系统中负责文件管理的部分称为文件系统。文件管理包括文件存储空间的管理、目录管理及文件读写管理和保护等。
  • 设备管理:设备管理的主要任务是完成用户的I/O请求,方便用户使用各种设备,并提高设备的利用率,主要包括缓冲管理、设备分配、设备处理和虛拟设备等功能。

为方便用户使用计算机,操作系统还提供了用户接口。操作系统提供的接口主要分为两类,一类是命令接口,用户利用这些操作命令来组织和控制作业的执行;另一类是程序接口,编程人员可以使用它们来请求操作系统服务。

  • 命令接口:使用命令接口进行作业控制的主要方式有两种,即联机控制方式和脱机控制方式。按作业控制方式的不同,可以将命令接口分为联机命令接口和脱机命令接口。
  • 程序接口:程序接口由一组系统调用命会(简称系统调用,也称广义指令)组成。用户通过在程序中使用这些系统调用命令来请求操作系统为其提供服务。用户在程序中可以直接使用这组系统调用命令向系统提出各种服务要求,如使用各种外部设备,进行有关磁盘文件的操作,申请分配和回收内存以及其他各种控制要求。当前最为流行的是图形用户界面(GUI)即图形接口,用户通过鼠标和键盘,在图形界面上单击或使用快捷键就能很方便地使用操作系统。

操作系统发展

手工操作阶段(此阶段无操作系统):用户在计算机上算题的所有工作都要人工干预,如程序的装入、运行、结果的输出等。随着计算机硬件的发展,人机矛盾(速度和资源利用)越来越大,必须寻求新的解决办法。

批处理阶段

为了解决人机矛盾及CPU和I/O设备之间速度不匹配的矛盾,出现了批处理系统。它按发展历程又分为单道批处理系统、多道批处理系统(多道程序设计技术出现以后)。

  • 单道批处理系统:系统对作业的处理是成批进行的,但内存中始终只保持一道作业。当该程序完成或发生异常情况时,才换入其后继程序进入内存运行。
  • 多道批处理系统:多道程序设计技术允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。它没有用某些机制提高某一技术方面的瓶颈问题,而是让系统的各个组成部分都尽量去“忙”,花费很少时间去切换任务,达到了系统各部件之间的并行工作,使其整体在单位时间内的效率翻倍。

分时操作系统

把处理器的运行时间分成很短的时间片,按时间片轮流把处理器分配给各联机作业使用。若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时停止运行,把处理器让给其他作业使用,等待下一轮再继续运行。由于计算机速度很快,作业运行轮转得很快,给每个用户的感觉好像是自己独占一台计算机。多道批处理是实现作业自动控制而无需人工干预的系统,而分时系统是实现人机交互的系统。

分时系统具有与批处理系统不同的特征,其主要特征如下:

  • 同时性。同时性也称多路性,指允许多个终端用户同时使用一台计算机。
  • 交互性。用户能够方便地与系统进行人-机对话。
  • 独立性。系统中多个用户可以彼此独立地进行操作,互不干扰。
  • 及时性。用户请求能在很短时间内获得响应。

实时操作系统

为了能在某个时间限制内完成某些紧急任务而不需时间片排队,诞生了实时操作系统。这里的时间限制可以分为两种情况:如果某个动作必须绝对地在规定的时刻(或规定的时间范围)发生,则称为硬实时系统。例如,飞行器的飞行自动控制系统,这类系统必须提供绝对保证,让某个特定的动作在规定的时间内完成。如果能够接受偶尔违反时间规定,并且不会引起任何永久性的损害,则称为软实时系统,如飞机订票系统、银行管理系统。

在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完接收的事件。实时橾作系统的主要特点是及时性和可靠性。

分布式计算机系统

分布式计算机系统是由多台计算机组成并满足下列条件的系统:系统中任意两台计算机通过通信方式交换信息;系统中的每一台计算机都具有同等的地位,即没有主机也没有从机;每台计算机上的资源为所有用户共享;系统中的任意若千台计算机都可以构成一个子系统,并且还能重构;任何工作都可以分布在几台计算机上,由它们并行工作、协同完成。

用于管理分布式计算机系统的操作系统称为分布式计算机系统。该系统的主要特点是:分布性和并行性。分布式操作系统与网络操作系统本质上的不同之处在于分布式操作系统中,若干台计算机相互协同完成同一任务。

分布式领域CAP理论:

  • Consistency(一致性),数据一致更新,所有数据变动都是同步的
  • Availability(可用性),好的响应性能
  • Partition tolerance(分区容错性):可靠性

定理:任何分布式系统只可同时满足二点,没法三者兼顾。
忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。

分布式系统三个指标

操作系统的运行机制

计算机系统中,通常CPU执行两种不同性质的程序:一种是操作系统内核程序;另一种是用户自编程序或系统外层的应用程序。对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程序”要执行一些特权指令,而“被管理程序”出于安全考虑不能执行这些指令。所谓特权指令,是指计算机中不允许用户直接使用的指令,如I/O指令、 置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等指令。操作系统在具体实现上划分了用户态和核心态,以严格区分两类程序。

内核是计算机上配置的底层软件,是计算机功能的延伸。不同系统对内核的定义稍有区别,大多数操作系统内核包括四个方面的内容。

  • 时钟管理:在计算机的各种部件中,时钟是最关键的设备。时钟的第一功能是计时,操作系统需要通过时钟管理,向用户提供标准的系统时间。另外,通过时钟中断的管理,可以实现进程的切换。诸如,在分时操作系统中,釆用时间片轮转调度的实现;在实时系统中,按截止时间控制运行的实现;在批处理系统中,通过时钟管理来衡量一个作业的运行程度等。因此,系统管理的方方面面无不依赖于时钟。

  • 中断机制:引入中断技术的初衷是提高多道程序运行环境中CPU的利用率,而且主要是针对外部设备的。后来逐步得到发展,形成了多种类型,成为操作系统各项操作的基础。例如,键盘或鼠标信息的输入、进程的管理和调度、系统功能的调用、设备驱动、文件访问等,无不依赖于中断机制。可以说,现代操作系统是靠中断驱动的软件。

  • 原语:按层次结构设计的操作系统,底层必然是一些可被调用的公用小程序,它们各自完成一个规定的操作。其特点是:它们处于操作系统的最底层,是最接近硬件的部分。这些程序的运行具有原子性——其操作只能一气呵成(这主要是从系统的安全性和便于管理考虑的)。这些程序的运行时间都较短,而且调用频繁。通常把具有这些特点的程序称为原语(Atomic Operation)。定义原语的直接方法是关闭中断,让它的所有动作不可分割地进行完再打开中断。系统中的设备驱动、CPU切换、进程通信等功能中的部分操作都可以定义为原语,使它们成为内核的组成部分。

  • 系统控制的数据结构及处理:系统中用来登记状态信息的数据结构很多,比如作业控制块、进程控制块(PCB)、设备控制块、各类链表、消息队列、缓冲区、空闲区登记表、内存分配表等。为了实现有效的管理,系统需要一些基本的操作,常见的操作有以下三种:

    • 进程管理:进程状态管理、进程调度和分派、创建与撤销进程控制块等。
    • 存储器管理:存储器的空间分配和回收、内存信息保护程序、代码对换程序等。
    • 设备管理:缓冲区管理、设备分配和回收等。

系统调用

所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务。各种版本的UNIX实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称为系统调用。简单来说,系统调用就是操作系统提供的用于实现系统各种核心功能的许多子程序,如 read()、write()、open()等

这些系统调用按功能大致可分为如下几类:

  • 设备管理。完成设备的请求或释放,以及设备启动等功能。
  • 文件管理。完成文件的读、写、创建及删除等功能。
  • 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
  • 进程通信。完成进程之间的消息传递或信号传递等功能。
  • 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及始址等功能。

显然,系统调用运行在系统的核心态。通过系统调用的方式来使用系统功能,可以保证系统的稳定性和安全性,防止用户随意更改或访问系统的数据或命令。系统调用命令是由操作系统提供的一个或多个子程序模块实现的。

这样,操作系统的运行环境可以理解为:用户通过操作系统运行上层程序(如系统提供的命令解释程序或用户自编程序),而这个上层程序的运行依赖于操作系统的底层管理程序提供服务支持,当需要管理程序服务时,系统则通过硬件中断机制进入核心态,运行管理程序;也可能是程序运行出现异常情况,被动地需要管理程序的服务,这时就通过异常处理来进入核心态。当管理程序运行结束时,用户程序需要继续运行,则通过相应的保存的程序现场退出中断处理程序或异常处理程序,返回断点处继续执行。

下面列举一些由用户态转向核心态的例子:

  • 用户程序要求操作系统的服务,即系统调用。
  • 发生一次中断。
  • 用户程序中产生了一个错误状态。
  • 用户程序中企图执行一条特权指令。
  • 从核心态转向用户态由一条指令实现,这条指令也是特权命令。一般是中断返回指令。

注意:由用户态进入核心态,不仅仅是状态需要切换。而且,所使用的堆栈也可能需要由用户堆栈切换为系统堆栈,但这个系统堆栈也是属于该进程的。

库函数顾名思义是把函数放到库里,是把一些常用到的函数编完放到一个文件里,供别人用。libc就是一个C标准库,里面存放一些基本函数,这些基本函数都是被标准化了的,而且这些函数通常都是用汇编直接实现的,如 printf、scanf等。

标准库函数构建在系统调用接口之上,应用程序既可以使用标准库函数,也可以使用系统调用。如下图:

系统调用和标准库函数的区别如下:

  • 从程序完成的功能来看,函数库提供的函数通常不需要操作系统的服务。系统调用是要求操作系统为用户提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等。
  • 从程序执行的空间来说,标准库函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到内核态的。系统调用则运行于内核空间。
  • 从程序的可移植性的角度来看,相对于系统调用,C语言的标准备函数库具备较高的可移植性。因为在所有的ANSI C编译器版本中,标准库函数是相同的;系统调用与系统有关,各个操作系统的系统调用是不同的。

系统调用函数

中断和异常

  • 中断(Interruption),也称外中断,指来自CPU执行指令以外的事件的发生,如设备发出的I/O结束中断,表示设备输入/输出处理已经完成,希望处理机能够向设备发下一个输入 / 输出请求,同时让完成输入/输出后的程序继续运行。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。这一类中断通常是与当前程序运行无关的事件,即它们与当前处理机运行的程序无关。
  • 异常(Exception),也称内中断、例外或陷入(Trap),指源自CPU执行指令内部的事件,如程序的非法操作码、地址越界、算术溢出、虚存系统的缺页以及专门的陷入指令等引起的事件。对异常的处理一般要依赖于当前程序的运行现场,而且异常不能被屏蔽,一旦出现应立即处理。

用户态、内核态

操作系统的很多操作会消耗系统的物理资源,例如创建一个新进程时,要做很多底层的工作,如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录、页表等,这些操作显然不能让任何程序都可以做。

我们知道,Intel的 X86 架构的CPU提供了 0 到 3 四个特权级(在CPU的设计中,用户态指非特权状态。在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患)。

在Linux操作系统操作系统的设计中主要采用了0和3两个特权级,也就是我们通常所说的内核态和用户态。运行于用户态的进程可以执行的操作和访问的资源都受到极大的限制,而运行于内核态的进程则可以执行任何操作并且在资源的使用上也没有限制。

当一个任务(进程)陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0 级)内核代码中执行。每个进程都有自己的内核栈和用户栈,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态),此时处理器在特权级最低的(3 级)用户代码中运行。简单来说在内核态下,CPU可执行任何指令,在用户态下CPU只能执行非特权指令。

Linux进程的 4GB 地址空间,3G-4G是内核态的地址空间,存放整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程运行在用户态,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作。这时必须切换到Ring 0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后切换回Ring 3,回到用户态。当程序处于内核态时可以随意进入用户态。   很多程序开始时运行于用户态,但在执行的过程中,一些操作需要在内核权限下才能执行,这就涉及到一个从用户态切换到内核态的过程。用户态切换到内核态的 3 种方式:

  • 系统调用:这是处于用户态的进程主动请求切换到内核态的一种方式。用户态的进程通过系统调用申请使用操作系统提供的系统调用服务例程来处理任务。
  • 产生异常:CPU执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会切换到内核态,如缺页异常。
  • 外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换   

更多阅读

计算机操作系统概述
linux用户态和内核态理解
What is Linux System Calls and Library Functions?