# 操作系统概论

# 计算机系统的层次结构

  1. 软件层次:操作系统层、系统程序层、应用程序层
  2. 硬件层次:提供可计算性资源,包括处理器、寄存器、存储器和 I/O 设备

# 计算机系统的定义和目标

操作系统是管理系统资源、控制程序执行、改善人机界面、提供各种服务、合理组织计算机工作流程和为用户计算机提供良好运行环境的一种系统软件。

操作系统和上层软件的区别
操作系统有权分配资源,其他程序只能使用资源

# 操作系统资源管理技术

资源管理技术的目标是

  1. 解决物理资源有限与竞争使用资源的应用程序众多之间的矛盾,即资源数量不足的问题
  2. 实现资源的易用性

# 资源复用

# 空分复用

  • 资源可以进一步分割成更多和更小的单位,供进程使用
  • 资源的不同单位同时分配给不同的进程
  • 例如,主存,磁盘

# 时分复用

  • 进程可以在一个时间片内以独占方式使用整个物理资源,其它进程则在另外的时间片内使用此资源
  • 例如,磁带机,CPU

# 资源虚拟化

对资源进行转化、模拟或整合,把一个物理资源转变成逻辑上的多个对应物,创建无需共享的多个独占资源的假象,以达到多用户共享一套计算机物理资源的目的

# 资源抽象

  • 资源抽象软件对内封装实现细节,对外提供应用接口
  • 通过分层实现

# 进程抽象

  • 对于进入主存的当前运行程序在处理器上操作的状态集的一个抽象
  • 是并发和并行操作的基础
  • 透明地时分复用一个(或多个)处理器
  • 处理器虚化,每个进程都认为独自拥有一个处理器

# 虚存抽象

  • 物理主存被抽象成虚拟主存,给每个进程造成一种假象,认为它正在独占和使用整个主存
  • 每个进程可以使用连续的虚拟地址来引用物理内存单元
  • 进程虚拟内存中的内容可以被透明地交换到磁盘,从而为每个用户提供的虚拟存储空间可以远大于主存的大小

# 文件抽象

  • 文件是磁盘、磁带、光盘等设备的抽象,通过将文件中的字节映射到存储设备的物理块中来实现文件抽象

# 操作系统的作用与功能

  1. 操作系统作为用户接口和服务提供者
  2. 操作系统是计算机系统的资源管理者和控制者
  • 资源
    • 硬件资源:处理器、存储器、I/O 设备
    • 信息资源:程序和数据
  • 操作系统的任务
    • 对资源进行抽象
    • 为用户提供简单的资源使用手段

# 操作系统的功能

# 处理机管理 / 进程管理

  1. 处理中断事件
  2. 处理器调度

# 存储管理

管理存储器资源,为多道程序运行提供有力的支撑,便于用户使用存储资源,提高存储空间的利用率

# 设备管理

管理各类外围设备,完成用户提出的 I/O 请求,加快 I/O 信息的传送速度,发挥 I/O 设备的并行性,提高 I/O 设备的利用率,提供每种设备的设备驱动程序和中断处理程序,为用户隐藏硬件细节,提供方便简单的设备使用方法

# 文件管理

对用户文件和系统文件进行有效管理,实现按名存取;
实现文件的共享、保护和保密,保证文件的安全性;
并提供给用户一整套能方便使用文件的操作和命令。

# 网络与通信管理

联网操作系统应具备的功能

  • 网上资源管理功能
  • 数据通信管理功能
  • 网络管理功能

# 操作系统的主要特性

# 并发性 Concurrence

并发性(concurrence)是指两个或两个以上的事件或活动在同一时间间隔内发生

并发和并行的区别

  1. 并发(Concurrency):
    • 定义: 并发是指多个任务在同一时间段内执行,但不一定是同时执行。在并发中,任务之间可能是交替执行的,每个任务都在进展,但并不一定同时执行。
    • 例子: 多个进程或线程在一个时间段内交替执行,共享系统资源,但不一定是同时进行。
  2. 并行(Parallelism):
    • 定义: 并行是指多个任务在同一时刻同时执行。在并行中,多个任务在同一时刻使用不同的处理单元(例如多个 CPU 核心)并行执行,以加速整体处理速度。
    • 例子: 多个 CPU 核心同时执行不同的任务,或者使用 GPU 并行处理大规模数据。
  3. 关键区别:
    • 并发: 强调任务之间的交替执行,即使在同一时刻只有一个任务执行,也能通过任务切换迅速交替执行多个任务。
    • 并行: 强调任务在同一时刻同时执行,需要多个处理单元(如多个 CPU 核心)来实现真正的同时性。
  4. 应用场景:
    • 并发: 适用于多任务环境,例如操作系统中的多进程或多线程,以提高系统资源的利用率。
    • 并行: 适用于需要更快处理速度的任务,例如科学计算、图形处理等,通过并行执行可以加速任务的完成。
  5. 复杂性和开销:
    • 并发: 相对较容易实现,但可能需要处理同步和竞态条件,以确保数据的一致性。
    • 并行: 相对较复杂,因为需要考虑任务之间的通信和同步,而且通常需要更多的硬件资源。

# 共享性

共享指操作系统中的资源(包括硬件资源和信息资源)可被多个并发执行的进程共同使用,而不是被一个进程所独占。

资源共享方式有透明资源共享和显式资源共享

# 透明资源共享

  • 允许同一时间段内多个进程对资源进行访问,好像每个进程都独占资源
  • 访问的次序对结果无影响
  • 如 CPU、主存、磁盘、打印机

# 显式资源共享

  • 同一时间段内只允许一个进程访问资源,这类资源称为临界资源,如磁带机、扫描仪,以及某些数据和表格
  • 操作系统必须提供显式资源共享机制(申请 / 释放资源的系统调用,或锁机制),将资源的互斥访问下放给用户决策

# 异步性

  • 在多道程序环境中,允许多个进程并发执行,由于资源有限而进程众多,多数情况,进程的执行不是一贯到底,而是 “走走停停”。
  • 异步性给系统带来了潜在的危险,有可能导致进程产生与时间有关的错误,但只要运行环境相同,操作系统必须保证多次运行进程,都会获得完全相同的结果。

# 多道程序设计

中断和通道技术的产生使 CPU 和 I/O 设备并行工作成为可能,为多道程序奠定了基础

image-20240116110449817

假设内存中有 n 道程序,程序平均等待 I/O 操作的时间比例为 p, 且等待操作相互独立,则所有程序都等待 I/O 操作的概率是pnp^n, 从而,

CPU 利用率 =1pn1-p^n

优点:

  1. 提高了 CPU、内存和 I/O 设备的利用率
  2. 改进了系统的吞吐率
  3. 充分发挥系统的并发性

缺点:

  1. 延长了作业的周转时间

# 中断和通道技术

通道是一个独立于 CPU 的专管输入 / 输出控制的处理机,它控制设备与内存直接进行数据交换。引入通道的目的是:使数据的传输独立于 CPU, 使 CPU 从繁重的 I/O 工作中解脱出来。它有自己的通道指令,这些通道指令受 CPU 启动,并在操作结束时向 CPU 发中断信号。通道技术又称 I/O 处理机。

早期 CPU 与通道的联络方法是由 CPU 向通道发出询问指令来了解通道工作是否完成(中间过程还是需要 CPU 参与)。若未完成,则主机就循环询问直到通道工作结束为止。因此,这种询问方式是无法真正做到 CPU 与 I/O 设备并行工作的

中断,就是在输入输出结束时,或硬件发生某种故障时,由相应硬件(即中断机构)向 CPU 发出信号(解决了上面的问题:通道工作完成时由中断向 CPU 发出信号,而不需要 CPU 不断发信号给通道去询问工作是否完成)。这时 CPU 立即停下手头的工作而转向处理中断请求,道处理完中断后再继续原来手头的工作。

# 操作系统的服务和用户接口

操作系统提供的服务

  • 提供给程序和用户的共性服务包括:
    • 创建 / 执行程序
    • I/O 设备访问
    • 信息存取
    • 通信服务
    • 错误检测和处理
  • 为保证自身效率和正确性提供的功能
    • 资源分配
    • 统计
    • 保护

操作系统提供的用户接口

  • 程序接口
    • 可被应用程序直接使用
    • 由一组系统调用组成
  • 操作接口
    • 通过实用程序提供
    • 用户借助命令管理或 shell 来请求执行

# 系统调用

  • 系统调用是用户程序或其他系统程序获得操作系统服务的唯一途径。
  • 应用程序和系统调用分别在用户空间和内核空间运行,在逻辑上相互隔离,起到了保护系统的作用

image-20240116114942817

# API 和系统调用

  • 不同操作系统提供的系统调用功能类似,但实现细节不尽相同
  • 系统调用属低层接口,接口复杂,跨平台移植困难
  • API 对系统调用及其它复杂功能进行封装,提供用户所需的服务,标准化,易于使用,易于移植
    • POSIX API 标准
    • Win32 API
    • Java API
  • API 为函数定义,仅说明获得给定服务的方式,不规定过程的实现

# 系统调用分类

  • 进程管理:创建和撤销进程、终止或异常终止进程、阻塞和唤醒进程、挂起和激活进程等
  • 文件操作:建立文件、删除文件、打开文件、关闭文件、读写文件等
  • 设备管理:申请设备、释放设备、设备 I/O 操作和重定向、获得和设置设备属性等
  • 内存管理:申请和释放内存
  • 信息维护:获取和设置日期及时间、获取和设置系统数据、生成诊断和统计数
  • 进程通信:建立和断开通信连接、发送和接受消息、链接和断开共享内存等

# 系统调用的实现 - 陷入机制

  • 系统调用将引起处理器中断,相应的机器指令称为访管指令
  • 每个系统调用都事先规定了编号,称功能号,在陷入指令中必须指明。

实现系统调用步骤

  1. 编写系统调用处理程序
  2. 设计系统调用入口地址表
  3. 陷入处理机制,开辟现场保护区,保存发生系统调用时的处理器现场

# 系统调用和普通函数调用区别

  • 调用形式不同:系统调用按功能号调用
  • 被调用代码位置不同:系统调用是一种动态调用,系统调用的处理代码在调用程序之外(在操作系统中)
  • 提供方式不同:系统调用由操作系统提供,给定的操作系统上系统调用的功能、种类和数量固定不变
  • 调用实现不同:系统调用是通过陷入机制实现,需要从用户态转变为核心态

# 中断与陷入机制的区别

中断由与现行指令无关的中断信号触发,通常在两条机器指令之间才可以响应中断。

陷入由处理器正在执行现行指令而引起的,通常,陷入处理程序提供的服务是为当前进程所用的。

# 操作系统结构设计

# 操作系统构件

  • 内核:内核是提供支持系统运行的基本功能和基本操作的一组程序模块
  • 进程:进程操作系统资源分配的基本单位
  • 线程:进程之间的通信和切换开销相当大,限制了系统中并发执行的进程数目,于是引入了更细粒度的线程,系统调度的基本单位不再是进程而是线程
  • 管程:管程管理共享资源的程序(一种进程同步机制),对管程的调用表示对共享资源的请求与释放
  • 类程:类程管理私有资源,对类程的调用表示对私有资源的操作。它仅能被进程及起源于同一进程的其他类程或管程嵌套调用链所调用。

# 内核

内核是操作系统对裸机的第一次改造,内核运行在核心态

内核可分为单内核、微内核和虚拟机

# 单内核

  • 运行时是一个大二进制映像
  • 模块之间的交互通过直接调用其他模块中的函数来实现
  • Unix 和 Linux 都是单内核结构,但 Linux 引入了动态加载模块和卸载模块机制
# 整体式结构
  • 整体式结构的特性
    • 模块是操作系统的基本单元
    • 按照功能将系统分解为若干具有一定独立功能的模块
    • 模块间可不加控制地自由调用
    • 各模块分别设计、编码、调试,最后将所有模块连接成一个整体
  • 缺点
    • 模块独立性差,调用关系复杂
    • 系统结构不清晰,正确性难以保证
  • 优点
    • 结构紧密,组合方便
    • 系统效率较高
# 层次式结构
  • 层次式结构的特点
    • 模块按照功能的调用次序排列成若干层次
    • 各层次之间是单向调用关系
  • 优点
    • 接口少而简单
    • 下层模块的正确性为上层模块的正确性提供了基础,使系统的正确性大大提高
    • 增加、修改或替换一个层次不会影响其它层次
  • 缺点
    • 合理地定义不同层次的功能较为困难
    • 系统的效率会降低。每一层都可能需要修改参数,传递数据。每一层都可能增加系统调用的开销。

# 微内核

操作系统分为核心态和用户态

  • 优点:
    • 提供一致性接口
    • 可扩充性和易修改性强
    • 可移植性好
    • 对分布式系统提供有力的支撑
  • 缺点
    • 效率低,进程之间必须通过内核的通信机制才能进行通信

# 虚拟机

将单台计算机的硬件(CPU, 内存,磁盘驱动,网卡等)抽象成多个不同的执行环境,从而创造每个不同的执行环境都运行在自己的私有计算机上的幻觉。

# 操作系统运行模型

# 独立运行的内核模型

# 操作系统功能在用户进程内执行的模型

# 操作系统功能作为独立进程执行的模型