一、操作系统的概念功能

一、计算机硬件系统概述

计算机系统自下而上可粗分为四个部分:硬件、操作系统、应用程序和用户(与计算机组成原理的分层不同)。操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便地接口和环境的程序集合。它是计算机系统中最基本的系统软件。

1.1、计算机硬件系统结构

1.1.1 大、中、小型计算机的硬件组织。这类计算机以存储器为中心,CPU和各种通道都与存储器相连。

在这里插入图片描述

1.1.2、微型计算机的典型组织。

微型计算机是以总线为纽带来构成计算机系统,中央处理机(CPU)、存储器、 I/O设备(包括外存磁盘、磁带)都挂接在总线。
在这里插入图片描述

1.2、现代操作系统的硬件基础

现代计算机系统为了提高计算机资源利用率,采用多道程序设计技术,它在主存中存放多道用户的作业,计算机系统硬件支持作业并行操作,使多道作业同时处于运行状态共享系统资源。在现代批处理系统中支持并行操作的硬件是通道和中断。

1.2.1 通道

通道是可以与CPU并行操作的专门用来控制输入输出设备数据传送的处理机。当CPU需要输入数据时,只要发命令给通道去完成,通道进行I/O操作和CPU操作可并行异步执行,在通道完成I/O操作后,它用中断方式向CPU报告其完成I/O情况。

1.2.2 中断

中断是指CPU对系统中发生的异步事件的响应,异步事件是指无一定时序关系的随机发生的事件。中断的含义是当这些异步事件发生后,打断了处理机对当前程序的执行,而转去处理该异步事件,即执行该事件的中断处理程序,直到处理完了之后,再转向原程序的中断点执行。中断技术的应用范围不断扩大,它使得通道具有中断主机工作的能力,以支持多道程序设计技术,它作为所有要打断处理机正常工作并要求其去处理某一事件的一种常用手段。中断的应用能充分发挥处理机的使用效率,提高系统实时处理能力。

二、操作系统特征和功能

2.1、操作系统特征

2.1.1 并发(Concurrence)

并发是指两个或多个事件在同一时间间隔内发生。引入进程的目的是为了是程序能并发执行。

并发和并行的区别:并发是指多个事件在同一时间间隔内执行(某一个时间点只执行行一个任务),并行是指多个事件在同一时间执行(某一个时间点执行多个任务),并行需要硬件支持。

2.1.2 共享(sharing)

共享指系统中的资源可供多个并发执行的进程共同使用。

  • 互斥共享。一段时间内只允许一个进程访问该资源。 同时把这种共享的资源成为临界资源或独占资源。
  • 同时访问。与短时间内允许多个进程“同时”访问该资源。宏观上同时,但在微观上,这些进程是交替对资源进行访问。这种资源的例子有:磁盘设备。

并发与共享的关系:

并发性指计算机系统中同时存在多个运行着的程序

共享性之系统中的资源可供内存中国歌并发执行的进程共同使用

2.1.3 虚拟(virtual)

虚拟是指把物理上的实体变为若干个逻辑上的对应物。例如:虚拟处理器、虚拟内存和虚拟外部设备等。
虚拟处理技术是通过多道程序设计基础让多到程序并发执行,来分时使用一个处理器。虽然只有一个处理器,但它能同时为多个用户服务,让每个用户都觉得有一个cpu专门为他服务。(把一个物理上的cpu虚拟为多个逻辑上的cpu)
虚拟存储技术可以将一台机器的物理存储器变为虚拟存储器,以便从逻辑上来扩充存储器的容量。
虚拟设备技术可以将一台物理I/O设备虚拟为多台逻辑上的I/O设备,并允许每个用户占用一台逻辑上的I/O设备,以便多个用户共享一个设备(原来是临界资源)。

2.1.4 异步(asynchronism)

异步指在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。异步性使操作系统运行在一种随机的环境下,可能导致进程产生与时间有关的错误(就像对全局变量的访问顺序不当会导致程序出错一样)。但是只要运行环境相同,操作系统必须保证多次运行进程,都获得相同的结果。

2.2、操作系统功能模块

2.2.1 处理机(进程)管理

处理机管理的主要任务是对处理机进行分配,并对其运行进行有效的控制和管理。在多道程序环境下,处理机的分配和运行以进程为基本单位,因而对处理机管理可归纳为对进程的管理。进程管理包括进程控制、进程同步、进程通信和调度等。

2.2.2 存储器管理

存储器管理的主要任务是为多道程序的运行提供良好的环境,方便用户使用存储器,提高存储器的利用率,以及能从逻辑上来扩充内存,为此存储管理应具有内存分配、内存保护、地址映射和内存扩充等功能。

2.2.3 I/O设备管理

设备管理体制的任务是登记各I/O设备状态,管理并完成用户提出的I/O请求,按一定的策略为用户分配I/O设备。同时提高CPU和I/O设备的利用率,提高I/O速度,方便用户使用I/O设备,为此设备管理应具有缓冲器管理、设备分配、设备处理及虚拟设备等功能。

2.2.4 信息管理(文件系统管理)

计算机系统的软件信息都以文件形式进行管理,操作系统中负责此任务的部分是文件系统,文件系统的任务是对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性,为此文件系统管理应具有对文件存储空间的管理、目录管理、文件共享和保护等功能。
用户接口

为了方便用户使用OS,OS向用户提供了“用户与OS的接口”,该接口分成二种:一种是作业级接口,它提供一组键盘命令,供用户去组织和控制作业的运行。另一种是程序级接口,它提供一组系统调用供其它程序调用。

三、 操作系统类型

3.1、批处理系统

特点:多道、宏观上并行、微观上串行。

分类:
单道批处理系统:无须作业调度和进程调度;内存仅有一道作业;顺序完成
多道批处理系统:作业调度和进程调度;内存有多道作业;非顺序完成
远程批处理系统

优点:
系统吞吐量大
资源利用率高
缺点:
平均周转时间长
不能提供交互作用能力

3.2、分时系统

在操作系统中采用分时技术就形成了分时操作系统。把计算机的系统资源(尤其是CPU时间)进行时间上分割,即将整个工作时间分成一个个的时间片,按时间片轮转把处理器分配给各联机作业使用。若某个作业在分配给他的时间段内不能完成计算,则该作业暂时停止运行,把处理器让给其他作业使用,等待下一轮在继续运行。作业运行轮转很快,每个用户都感觉自己是独占一台计算机。

3.3、实时系统

为了提高系统的响应时间,对随机发生的外部事件作出及时响应并对其进行处理。

实时控制系统
此类实时控制系统主要用于生产过程的自动控制,实验数据自动采集,武器的控制、包括火炮自动控制、飞机自动驾驶、导弹的制导系统。
实时信息处理系统
这类系统主要用于实时信息处理,象飞机订票系统、情报检索系统。

3.4、微机操作系统

配置在微机上的OS称为微机操作系统。常用的微机OS有MS-DOS、MS Windows、OS/2、SCO UNIX、 Linux等。

3.4.1 单用户单任务操作系统MS-DOS

MS-DOS是Microsoft公司开发的首先在IBM-PC机上使用的微机OS,MS-DOS操作系统现成了事实上的16位微机单用户单任务操作系统的标准。

3.4.2 多任务操作系统MS Windows

Windows98/2000/XP是Microsoft公司开发的一个图形用户界面的多任务、多线程、全32位的操作系统。

3.4.3 多用户多任务操作系统SCO UNIX

SCO公司将运行于大、中、小型机上UNIX操作系统移植到微机上,UNIX是多用户多任务操作系统。

3.4.4 Linux

Linux操作系统是一个遵循标准操作系统界面的标准免费操作系统,具有UNIX BSD和UNIX SYS V的扩展特性。它的版权所有者是芬兰籍的Linus B.Toroalds先生和其它开发人员,并且遵循GPL(GNU General Pablic License)声明。Linux可以在基于Intel处理器的个人计算机上运行,它可以将一台普通的个人电脑变成功能强劲的UNIX工作站。

3.5、网络操作系统

计算机网络的定义
计算机网络可以定义为一些互连的自主计算机系统的集合,所谓自主计算机是指计算机具有独立处理能力,而互连则表示计算机之间能够实现通信和相互合作。按网络所覆盖的地理范围大小可把计算机网络分成广域网WAN(Wide Area Network)和局域网LAN(Lacal Area Network)两类。
网络操作系统定义
网络操作系统是使网络上各计算机能方便地进行网络通信、有效地共享网络资源,为网络用户提供所需各种服务的软件和有关规程的集合。

3.6、分布式操作系统

分布式计算机系统是为分散处理、协同完成任务而将多个分散的计算机经互连网络连接而成的计算机系统,分布式操作系统是在它上配置的操作系统。分布式操作系统是能直接对系统中各类资源进行动态分配和管理,有效控制和协调诸任务的并行执行,允许系统中的处理单元无主、次之分,并向系统提供统一的、有效的接口的软件集合。
它基于两种环境:多处理器(CPU)系统或多计算机系统(网络),它是网络操作系统的更高级的形式,它保持了网络操作系统的全部功能。

3.7、嵌入式操作系统

嵌入式系统是在各种设备、装置或系统中,完成特定功能的软硬件系统。它们是一个大设备、装置或系统中的一部分,这个大设备、装置或系统可以不是“计算机”。通常工作在反应式或对处理时间有较严格要求环境中,由于它们被嵌入在各种设备、装置或系统中,因此称为嵌入式系统。

嵌入式操作系统通常配有源码级可配置的系统模块设计、丰富的同步原语、可选择的调度算法、可选择内存分配策略、定时器与计数器、多方式中断处理支持、多种异常处理选择、多种通信方式支持、标准C语言库、数学运算库和开放式应用程序接口。

四、操作系统的运行机制与体系结构

4.1 运行机制

两种指令,两种处理器状态,两种程序

指令与代码的区别
例如C语言中的代码经过编译器翻译,得到机器语言指令。其中高级语言的代码翻译的结果可能会对应多条指令。简单来说,指令就是处理器CPU能识别、执行的最基本的命令

4.1.1 两种指令

有的指令执行起来不会对操作系统或者其他的内容产生影响,而有的程序有着很高的权限,如果随意的使用,可能会对整个系统带来严重的影响。例如内存清零指令,如果用户程序可以随意使用这个指令,那么就意味着一个用户可以将其它用户的内存数据随意清零,显然这是很危险的

由此,可将指令划分为以下两类

  • 特权指令:不允许用户程序使用。例如内存清零指令
  • 非特权指令:允许用户程序随意使用。例如普通的运算指令

4.1.2 两种处理器状态

因为指令是被CPU所识别、执行的命令,所以上述根据指令是否可以被用户程序使用的划分方式就存在一个问题,CPU如何判断当前是否可以执行特权指令,即当前内存中存放的程序并交给CPU来处理的是否是用户程序。因此,操作系统给定了两种处理器状态

  • 用户态(目态):此时CPU只能执行非特权指令
  • 核心态(管态):此时CPU无论是特权指令还是非特权指令都可以执行

至于如何控制CPU的这两种状态:用程序状态字寄存器PSW中的某个标志位来标识当前处理器处于什么状态,比如0为用户态,1为核心态

用户态和内核态可通过中断来切换。
在这里插入图片描述

以下是一些由用户态转向核心态的例子。

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

只有在内核态下能使用特权指令,在用户态下只能使用非特权指令,如果在用户态使用特权指令,会产生一个中断以阻止用户使用特权指令。

从用户态到核心态的唯一转换途径是中断或异常。

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

4.1.3 两种程序

因为存在两种指令,所以对应的根据是否能使用特权指令,将程序划分为内核程序和应用程序

  • 内核程序:操作系统的内核程序是系统的管理者,既可以执行特权指令,又可以执行非特权指令,处理器运行在核心态
  • 应用程序:为了保证系统能安全运行,普通应用程序只能执行非特权指令,运行在用户态

上述的两种指令、两种处理器状态、两种程序都是人为进行划分的结果,所以会发现两种处理器状态和两种程序的划分具有一定的联系。两种处理器状态的是以内存中的程序是两种程序中的哪一种作为划分依据的。

操作系统内核工作在cpu的核心态,用户程序工作在用户态。系统不允许用户程序工作在核心态。在中断或异常发生时,运行用户态的cpu会立即进入核心态,这是通过硬件实现的(如用一个寄存器表示cpu工作状态,0为核心态,1为用户态。若要进入核心态,只需将该位置为0即可)。

4.2 操作系统内核体系

内核是计算机上配置的底层软件。大多数操作系统内核包括四个方面的内容。

4.2.1 时钟管理。

通过时钟中断的管理,可以实现进程的切换。(计时,还可利用时钟中断实现进程切换,如Java的sleep()方法 )

时钟的功能:

  • 计时
    • 提供标准的系统时间
  • 时钟中断
    • 实现进程切换
      • 分时OS:时间片轮转调度
      • 实时OS:按截止时间控制运行
      • 批处理:用时钟管理衡量一个进程执行的程度

4.2.2 中断机制。

现代OS是靠中断驱动的OS

中断机制的产生:

初衷是提高多道程序运行环境中cpu的利用率,且主要针对外部设备。中断机制中,只有一小部分功能属于内核,负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。引入中断机制,实现了多道程序的并发执行。本质:发生中断就意味着需要操作系统介入,开展管理工作。

中断的分类:

  1. 外中断

    中断也称外中断。指来自cpu执行指令意外的事件的发生,信号源自cpu执行指令外部的事件,

    如设备发出的I/O结束中断,表示设备输入输出处理已完成,希望处理机能向设备发出下一个输入/输出请求,同时让完成输入/输出后的程序继续运行。

  2. 内中断

    异常也称内中断、例外或陷入(trap),信号源自cpu执行指令内部的事件。

    如程序的非法操作码、地址越界、算术溢出、虚存系统的缺页以及专门的陷入指令等引起的事件。对异常的处理一般要依赖当前程序的运行现场,而且异常不能被屏蔽,一旦出现应立即处理。

    • 陷阱、陷入(trap): 有意而为之的异常,如系统调用
    • 故障(fault):由错误条件引起的,可能被故障处理程序修复,如缺页
    • 终止(abort):不可恢复的致命错误造成的结果,终止处理程序不再将控制返回给引发终止的应用程序,如整数除0
  3. 访管指令和访管中断

    访管指令本身并不是特权指令。如果用户程序向要完成在用户态下无法完成的工作,就可以使用访管指令使得程序拥有“自愿进管”,从而引起访管中断。

  4. 时钟中断

    表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。这一类终端通常是与当前程序运行无关的事件。

外中断的处理过程:

  1. 执行完每个指令之后,cpu都要检查当前是否有来自外部的中断信号
  2. 如果检测到外部的中断信号,则需要保护被中断进程的cpu环境(如程序状态字PSW,程序计数器PC,各种通用寄存器)
  3. 根据中断信号类型转入相应的中断处理程序
  4. 恢复原进程的cpu环境并退出中断,返回原进程继续往下执行

中断是OS各项操作的基础

  • 键盘或鼠标的输入
  • 进程的管理和调用
  • 系统功能的调用
  • 设备驱动
  • 文件访问

4.2.3 原语

原语是OS底层一些可悲调用的公用小程序。其在操作系统最底层,最接近硬件,有原子性,操作不可再分,运行时间较短,调用频繁。定义原语的直接方法是关闭中断,让他的所有动作不可分割的进行完再打开中断。

特点:

  • 处于OS的最底层,最接近硬件
  • 只能一气呵成
  • 时间短,调用频繁

定义原语最直接的方式是关闭中断

举个栗子

  • 设备驱动
  • CPU切换
  • 进程通信

4.2.4 系统控制的数据结构及处理

这类的数据结构有:作业控制块、进程控制块(PCB)、设备控制块、各类链表、消息队列、缓冲区、空闲区登记表、内存分配表等。为了实现有效的管理,常见的操作有三种:

  • 核心态指令实际上包括了系统调用指令和一些针对时钟、中断和原语的操作指令。进程管理进程状态管理、进程调度和分派、创建与撤销进程控制块等。
  • 存储器管理:存储器空间的分配和回收、内存信息保护程序、代码对换程序等。
  • 设备管理:缓冲区管理、设备分配和回收等。

常见操作:

  1. 进程管理:进程状态管理、进程调度和分派、创建和撤销PCB
  2. 存储器管理:存储器的空间分配和回收、内存信息保护程序、代码对换程序
  3. 设备管理:缓冲区管理、设备分配和回收

核心态指令实际上包括了系统调用指令和一些针对时钟、中断和原语的操作指令。

4.3 操作系统的运行环境

用户进程执行->中断、进入核心态(运行中依赖底层管理程序)->回到用户态(需要调用一种特权命令)

4.4 操作系统的体系结构

4.4.1 大内核

  • 将操作系统的主要功能模块都作为系统内核,运行在核心态
  • 具有高性能
  • 内核代码庞大,结构混乱,难以维护

4.4.2 微内核

将内核中的最基本的功能保留在内核,而将那些不需要在核心态执行的功能移到用户态执行,从而降低了内核的设计复杂性。一般来说,内核的服务越少,内核越稳定。

五、系统调用

所谓系统调用就是用户在程序中调用操作系统所提供的一些子功能,系统调用可以被看做特殊的公共子程序。在用户程序中,凡是与资源有关的操作(如存储分配、进行I/O传输以及管理文件等,都必须通过系统调用方式向操作系统提出户服务请求,并由操作系统代为完成。)

5.1 系统调用大致可分为以下几类

  • 设备控制:完成设备的请求/释放/启动 等功能
  • 文件管理:完成文件的 读/写/创建/删除 等功能
  • 进程控制:完成进程的 创建/撤销/阻塞/唤醒 等功能(凡是与资源有关的操作,会直接影响到其他进程的操作,一定需要操作系统介入,即需要通过系统调用来实现)
  • 进程通信:完成进程间的 消息传递/信号传递 等功能
  • 内存管理:完成内存的 分配/回收 等功能

在操作系统中,我们关心的的是用户态和内核态的软件实现和切换,而非硬件。
在这里插入图片描述

5.2 由用户态转向核心态的例子

  • 系统调用
  • 发生一次中断
  • 用户程序产生错误
  • 用户企图执行特权指令
  • 从核心态向用户态由一条指令实现,这也是特权指令,一般是中断返回指令

由用户态进入核心态,不只是状态需要切换,所使用的堆栈也可能需要由用户堆栈转为系统堆栈。

由用户态进入核心态时,需要用到访管程序,是在用户态使用的,所以不可能是特权指令。

5.3 系统调用与函数库的区别

  • 系统调用是操作系统向上层提供的接口
  • 有的库函数是对系统调用的进一步封装
  • 当今编写的应用程序大多是通过高级语言提供的库函数间接地进行系统调用
    在这里插入图片描述

5.4 系统调用背后的过程

  1. 传递系统调用参数
  2. 执行陷入指令(系统调用发生在用户态,对系统调用的处理发生在核心态。执行陷入指令会产生中断,使处理器从用户态进入核心态)
  3. 执行系统调用相应服务程序
  4. 返回用户程序