操作系统 - 概述
基本特性
操作系统是一组控制和管理计算机硬件和软件资源、合理地对各类作业进行调度、以及方便用户使用的程序的集合
1. 并发性(最基本)
并发是指宏观上在一段时间内能同时运行多个程序,即多个程序在一段时间内交替运行
而并行则指同一时刻能运行多个指令,现代OS一般都具有并行性,需要硬件支持(多核处理器、多流水线技术或者分布式计算)
操作系统通过引入进程,使得程序能够并发运行。(引入线程是为了更好的并发运行,详见“进程管理章节”)
2. 共享性(最基本)
共享是指系统中的资源可以被多个进程(线程)在同一时刻(时间段)使用。有两种共享方式:
互斥共享:不允许进程同时访问的资源(临界资源或独占资源),需要互斥共享
同时共享:允许进程同时访问的资源,可以同时共享
3. 虚拟性
虚拟技术指通过某种技术(时分复用、空分复用)把一个物理实体转换为多个逻辑实体。例如:
- 采用了时分复用技术的处理器,每次只执行一小个时间片并以很小的代价快速切换,使得多个进程能轮流占用处理器。
- 采用了空分复用技术的虚拟内存,进程的页面在执行时并不需要全部装入内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。
- 虚拟设备技术(假脱机技术)
4. 异步性
进程是以人们不可预知的速度向前推进。
我们希望在运行环境相同的情况下,作业经多次运行能够获得相同的结果,所以操作系统中需要配置有完善的进程同步机制。
5. 四种特性间的关系
共享和并发是互为条件的;如果失去并发性,OS 中只有一个程序,那么共享也就没有意义了;如果失去共享性,程序不能同时访问想要的资源,那么也不能正常进行并发。
虚拟是以并发和共享为前提条件。
异步是并发和共享所导致的必然结果。
基本功能
OS 作为计算机系统资源的管理者,基本功能有:(即后面的四大章节,这也是我们能感知到的)
1. 进程管理
进程控制、进程同步、进程通信、死锁处理、处理机调度等。
2. 内存管理
内存分配、地址映射、内存保护与共享、虚拟内存等。
3. 文件管理
文件存储空间的管理、目录管理、文件读写管理和保护等。
4. 设备管理
完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。
5. 用户接口
OS 实现了对计算机资源的抽象,并向用户提供了与计算机硬件系统之间的接口。例如,想要删除一个文件有三种方式,可以在资源管理器下右键删除;在命令行中删除;或者在C语言中通过系统调用进行删除。这些都是操作系统给用户提供的接口。
运行机制
时钟管理
CPU会定时发出时钟脉冲信号是来“同步”系统各器件(CPU、内存、总线等)的工作
中断机制
程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求, CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。
这里给的定义是外中断,是狭义上的中断,也是我们通常指的中断,因为内中断(异常)并不一定能够回到程序的断点处继续执行。
中断与异常
中断请求一般来自于CPU以外的事件,异常一般发生在CPU内部。中断是进程切换的必要不充分条件,即进程切换一定发生中断,中断不一定导致进程切换。
1. 内中断(异常)
陷入 trap
由陷入指令(又叫trap指令、自陷指令、访管指令)引起的,发生用户申请系统调用时。
故障 fault
硬件故障(优先级最高的中断),可能被修复,修复故障后,内核会把CPU使用权还给应用程序。例如:缺页故障
终止 abort
软件中断,一般由致命错误引起,不可恢复,内核会终止改程序,例如:除数为0,非法使用特权指令,浮点数上溢(注意下溢做机器零处理,不需要中断来处理)
2. 外中断(中断)
由 CPU 执行指令以外的事件引起,如人工干预强制停止一个进程、时钟中断、I/O中断请求。
3. 可屏蔽与不可屏蔽中断
一般来说硬中断是可屏蔽的(NMI硬中断不可屏蔽,比如掉电),软中断不可屏蔽
INTR Interrupt Require 可屏蔽中断
对于可屏蔽中断,除了受本身的屏蔽位的控制外,还都要受一个总的控制,即CPU标志寄存器中的中断允许标志位IF(Interrupt Flag)的控制,IF位为1,可以得到CPU的响应,否则,得不到响应。
NMI Nonmaskable Interrupt 不可屏蔽中断
不可屏蔽中断就是CPU必须响应的外中断,它的中断类型码固定为 2 ,所以由它引发的中断过程中没有取得中断类型码的那一步。不过后面三步还是一样的。
4. 开中断与关中断
关中断是为了保护一些不能中途停止执行的程序而设计的,例如中断处理时CPU恢复现场的过程是不允许被其他的程序打扰的,此时就要启动关中断,不再相应其他的请求。当现场恢复完毕后,CPU启动开中断。
关中断期间,不响应可屏蔽中断
CPU 执行状态
为了让 OS 正常安全的运行,有一些权力不能赋予用户,只能让 OS 来代替执行,于是便有了系统态与用户态之分,用户可以在应用程序中通过使用系统调用的方式来申请一些特权功能,CPU 通过中断进行状态切换,执行完成后,再切换回用户态。
1. 系统态
也叫管态、核心态、特权态。操作系统运行在系统态,CPU在管态下可以执行指令系统的全集。
2. 用户态
也叫目态、常态、,应用程序运行在用户态。
调用“系统调用”在目态,执行“系统调用”在管态。
3. 状态切换
CPU 通过状态切换交替执行操作系统程序和用户程序。
CPU 状态由程序状态字 PSW 的一位标记。
从目态到管态
用户调用系统调用;程序发生异常;用户在用户态下试图使用特权指令。
从目态到管态,切换原因不同,但切换方式都需要通过中断。
从管态到目态
中断处理程序的最后一条指令都是中断返回指令(特权指令),通过修改程序状态字 PSW 中的标志位来实现。
操作系统结构
1. 宏内核
也叫巨内核,传统的操作系统结构,是将操作系统功能进行分层/模块,并作为一个紧密结合的整体放到内核。
**好处:**各层/模块间互相调用无需进行状态的切换,因此有很高的性能。
**问题:**操作系统功能不断复杂,内核越做越大,在设计与开发上存在困难。
2. 微内核
鉴于宏内核结构出现的问题,考虑将一部分操作系统功能移出内核,降低内核的复杂性。
这便是微内核结构,内核只包括能实现 OS 最基本的核心功能的部分,更多具体的工作扔到用户态去做。
**好处:**相较于聚内核,复杂度降低了,设计开发容易了。并且更加稳定,内核东西少了,自然就不容易出错。
**问题:**很多原来内核做的工作放到用户态,需要频繁地在用户态和核心态之间进行切换,例如,以前各模块都在一个大内核中,网络模块想要使用磁盘模块,只是一次调用而已,而在微内核中,就需要多次用户态与内核态的切换。
3. 当下主流操作系统结构
从上面的分析可以看出,微内核和宏内核都有其独到之处,但也都有无法解决的问题。
所以,目前三大主流操作系统事实上都属于混合内核。
Windows NT 发布之初宣称是微内核,但是慢得无法容忍,后期更新不断向内核中加东西。
Mac OS具有两个内核,一个是BSD巨内核,一个是Match微内核。
一些概念
特权指令
只允许在管态下使用的指令,应用程序非法使用特权指令导致的中断(“终止”)
访管指令
又叫trap指令、自陷指令、陷入指令,访管指令是一种非特权指令,在目态下执行时会将CPU转换管态
系统调用(广义指令)与特权指令
特权指令是一类只能在核心态下执行的指令,这儿的指令是指机器指令。而系统调用不是机器指令,它往往以函数调用的形式出现,实现操作系统提供的子功能,它是操作系统与用户的编程接口。在用户程序中可以使用系统调用来获得操作系统服务,在系统调用的实现会用到机器指令,其中往往会有特权指令
系统调用与原语
系统调用可以在用户态下执行,而原语只能在系统态下执行。
原语的执行是不可分割的,而广义指令所包含的程序段是允许被中断的。
系统调用库函数
高级语言中,通常提供了与各系统调用一一对应的库函数,用户程序通过调用对应的库函数来使用系统调用,但通常我们会把这个过程模糊掉,可以直接说应用程序调用了一个系统调用。但也并不是所有的库函数都会使用系统调用,未使用系统调用的库函数,执行效率会更高(因为使用系统调用涉及到状态的切换)
不过,在许多现代操作系统中,系统调用本身已经采用 C 语言编写,并以函数形式提供,所以在使用 C语言编写的用户程序中,可以直接使用这些系统调用。
终止与访管中断
访管指令是一条可以在用户态下执行的指令。在用户程序中,因要求操作系统提供服务而有意识地使用访管指令,从而产生一个中断事件(自愿中断,属于“陷入”),将操作系统转换为核心态,称为访管中断。
非法使用特权指令导致的中断属于“终止”