操作系统笔记

操作系统笔记总篇

一、什么是操作系统<9.20>

(一). 操作系统的概念(定义)

  1. 一台电脑的诞生过程

    • Step 1:厂家组装裸机
    • Step 2:出售前安装操作系统
    • Step 3:用户安装应用程序
    • Step 4:用户使用软件进行操作
  2. 得到计算机系统的层次结构

    1. 裸机(计算机硬件)
    2. 操作系统
    3. 应用程序
    4. 用户

    其层级结构大致如图所示

    图9-20-1

    注意:

    1. 操作系统是连接裸机和应用程序甚至用户的桥梁,用户使用应用程序调用硬件设备等都需要借助于操作系统的协调。这也是操作系统不可或缺的重要原因。

    2. 图片中用户的部分区域可以跨过应用程序直接与操作系统连接,意味着:

      可以使用连接命令接口或者脱机处理接口调用使用操作系统。

      编写程序是可以通过程序接口调用操作系统。

    3. 计算机的构成是建立在该模型之上的,并且是自下而上建立的。

  3. 给出定义!

    操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。

    Tips:执行一个程序前需要把该程序放到内存中,才能被CPU处理。

    1. OS作为用户与计算机硬件系统之间的接口,负责向上层提供方便易用的服务。
      1. 通过命令方式系统调用方式图标—窗口方式来实现与操作系统的通信,取得服务
      2. 底层硬件提供的交互接口是只听得懂二进制指令,而操作系统可向上提供操作更友好的交互接口,向下传达二进制指令。
      3. 把难懂的指令封装成简单的操作单元,提供给上层。
    2. OS作为计算机系统资源的管理者
      1. 功能:处理及管理,存储器管理,文件管理,设备管理
      2. 目标:安全高效
    3. OS实现了对计算机资源的抽象,是最接近硬件的一层软件。
      1. 连接各种硬件,使其功能得到拓展,功能更强大,使用更加方便。
      2. 虚拟机:通常把覆盖了软件的机器成为扩充机器,即虚拟机

(二). 操作系统的发展过程<9.21>

  1. 未配置操作系统的计算机系统

    1. 人工操作方式
    2. 脱机输入输出(Off-Line I/O)方式

    未配置操作系统的计算机系统就像没有灵魂的躯壳,存在解决人机矛盾和CPU与I/O设备速度不匹配的矛盾,可以完成计算任务但是效率不高。

  2. 单道批处理系统

    单道批处理系统需要把所有需要处理的任务依次输入到磁带上,可以一个接一个的处理这批作业,形成了早期的批处理操作系统,但是内存中只保持一道作业,仍不能充分的利用系统资源。

  3. 多道批处理系统

    1. 用户提交作业先存放在外存,排队形成队列,称为“后备队列”,然后由作业调度程序按照一定算法在后备队列中选取多个作业调度进入内存,使他们共享CPU和系统中的各种资源。
    2. 这种操作系统下,资源的利用率得到了提高,系统的吞吐量更大。
    3. 但是由于算法和资源的限制,作业要依序处理,周期变得更长,而且一旦提交便没法与作业交互,修改和调试程序极其不方便。
  4. 分时系统

    分时系统引入满足对人机交互的需求,但是仍处于共享主机的状态

    主要优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。

    案例:前些年转账往往会延时到账,转账人和收款人不在同一个分时管理下,由于银行的资源不足导致的不得不使用分时的方法处理大量的操作,在A时区转账时,B时区不在服务区开放的时间,B只能等待时区服务开放才能收到转账。

  5. 实时系统

    发出任务后即刻执行,按照预先设定好的程序,接收到信号后可以继续操作,不需要等待人工回复才执行,提高了执行的速度。

    主要优点:能够优先响应一些紧急任务,某些紧急任务不需时间片排队
    在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性

    案例:无人机远程打击目标,发现目标后不需要等待无人机操作人员回应即可执行操作步骤,避免因延迟导致的目标离开打击范围,即无人机实时操作系统很关键。

  6. 微操作系统

(三). 操作系统的特征

冯·诺伊曼体系

分析总结特征之前,先说一下“冯·诺伊曼体系”

  1. 存储程序概念:程序指令和数据都存储在同一类型的内存中,CPU可以直接访问内存来读取指令和数据。

  2. 二进制系统:所有数据和指令都以二进制形式表示。

  3. 顺序执行:计算机按照程序中指令的顺序执行。

  4. 中央处理单元(CPU):包含算术逻辑单元(ALU)和控制单元(CU),负责执行指令和处理数据。

  5. 存储器:用于存储程序和数据,通常是随机访问存储器(RAM)。

  6. 输入/输出(I/O)设备:用于与外部世界通信,如键盘、鼠标、显示器、打印机等。

  7. 控制流:程序的执行由控制单元控制,它根据程序计数器(PC)中的地址来获取下一条指令。

  8. 数据流:数据在CPU、存储器和I/O设备之间流动。

简单来讲就是冯·诺伊曼体系下要求计算机必须要有处理器CPU、存储器内存和外存。其主体结构简化为:

输入/输出接口  <=>  CPU  <=>  内存  <=>  外存
操作系统的特征
  1. 并发

    1. 并发和并行

      并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。

      并行:指两个或多个事件在同一时刻同时发生。

    2. 单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行。

      多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行。

  2. 共享

    1. 互斥共享

      系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。

    2. 同时访问

    生活实例:

    互斥共享方式:使用QQ和微信视频。同一时间段内摄像头能分配给其中一个进程。

    同时共享方式:使用QQ发送文件A,同时使用微信发送文件B。

    ​ 宏观上看,两边都在同时读取并发送文件,说明两个进程都在访问硬盘资源,从中读取数据。

    ​ 微观上看,两个进程是交替着访问硬盘的。

  3. 虚拟

    虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。

    1. 时分复用技术
    2. 空分复用技术
  4. 异步

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

操作系统的特征
  1. 并发

    1. 并发和并行

      并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。

      并行:指两个或多个事件在同一时刻同时发生。

    2. 单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行

      多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行

  2. 共享

    1. 互斥共享

      系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源

    2. 同时访问

    生活实例:

    互斥共享方式:使用QQ和微信视频。同一时间段内摄像头能分配给其中一个进程。

    同时共享方式:使用QQ发送文件A,同时使用微信发送文件B。

    ​ 宏观上看,两边都在同时读取并发送文件,说明两个进程都在访问硬盘资源,从中读取数据。

    ​ 微观上看,两个进程是交替着访问硬盘的。

  3. 虚拟

    虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。

    1. 时分复用技术
    2. 空分复用技术
  4. 异步

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

(四).操作系统运行机制<10.9>

1. 预备知识:程序是如何运行的?

eg: C语言的代码 通过编译器“翻译” 转换为机器识别的二进制代码。

一条高级语言的代码翻译过来可能会对应多条机器指令。

程序运行的过程其实就是CPU执行一条一条的机器指令的过程。

指令是处理器CPU能识别执行的最基本的命令,本节“指令”指的是二进制的机器指令。

cmd 启动的是交互式命令接口,输入的与这里所提到的指令有所不同。

我们普通程序员写的程序是应用程序

2. 操作系统内核

操作系统内核是操作系统的核心部分,它负责管理计算机硬件资源,包括CPU、内存、磁盘、输入输出设备等。内核提供了操作系统的基本功能,如进程管理、内存管理、文件系统管理、设备驱动等。

微软、苹果有一帮人负责实现操作系统,他们写的是“内核程序”由很多内核程序组成了“操作系统内核”,或简称“内核(Kernel)“,内核是操作系统最重要最核心的部分,也是最接近硬件的部分。

操作系统实现的功能都是在内核中完成的。

3. 特权指令
  1. 应用程序只能使用非特权指令,操作系统内核作为”管理者“才可以使用特权指令。

    eg: 内存清空指令,影响重大的指令会影响整个程序的执行。

  2. CPU在设计和生产是就划分了特权指令和非特权指令,所以可以判断这两种类型,但是无法区分这条指令来自于内核程序还是应用程序

4. 内核态和用户态
  1. 为了区分正在运行的程序,设定了两种状态。处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。
  2. 拓展:CPU 中有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示“用户态"。
  3. 别名:内核态=核心态=管态;用户态=目态

内核态和用户态的转换:

一个故事:
① 刚开机时,CPU为“内核态”,操作系统内核程序先上CPU运行。
②开机完成后,用户可以启动某个应用程序。
③ 操作系统内核程序在合适的时候主动让出CPU,让该应用程序上CPU运行。
操作系统内核在让出CPU之前,会用一条特权指令把 PSW 的标志位设置为“用户态”
④应用程序运行在“用户态”。
⑤ 此时,一位黑客在应用程序中植入了一条特权指令,企图破坏系统。
⑥ CPU发现接下来要执行的这条指令是特权指令,但是自己又处于“用户态”。
⑦ 这个非法事件会引发一个中断信号
CPU检测到中断信号后,会立即变为“核心态”,并停止运行当前的应用程序,转而运行处理中断信号的内核程序。
⑧“中断”使操作系统再次夺回CPU的控制权。
⑨ 操作系统会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序。

  • 内核态→用户态:执行一条特权指令——修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权

  • 用户态→内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。

除了非法使用特权指令之外,还有很多事件会触发中断信号。一个共性是,但凡需要操作系统介入的地方,都会触发中断信号

(五).中断和异常<10.11>

  1. 中断的作用:中断是让操作系统内核夺回CPU使用权的唯一途径

    操作系统工作时会在合适的时机将CPU的运行让权给应用程序,如果没有中断机制,那么一旦程序在CPU上运行,CPU就会一直运行这个程序,在这样的前提下,并发将不复存在。

  2. 中断的类型:内中断和外中断

    中断(广义中断)包括内中断(异常)和外中断(狭义中断)

    1. 内中断(也称异常):与当前执行的指令有关,中断信号来自于CPU内部。

      • 陷入:由陷入指令引发,是应用程序故意引发的。

        应用程序需要让权给操作系统,执行特殊指令(不是特权指令),应用程序想要请求操作系统内核服务,执行特殊指令——陷入指令,会引发内部中断信号。

      • 故障:由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把 CPU使用权还给应用程序,让它继续执行下去。如:缺页故障,

      • 终止:指令是非法的或者指令的参数是非法的。

        用户态执行应用程序非特权指令的过程中,突然出现一条特权指令,产生中断信号,CPU自动转换成内核态,并执行处理异常的程序。

        由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:整数除0、非法使用特权指令。

    2. 外中断(狭义中断):与当前执行的指令无关,中断信号来自于CPU外部

      • 时钟中断:时钟部件间隔一个时间片给CPU发送一个中断信号,收到中断信号后,CPU自动转换成内核态,并执行处理中断的程序,重新分配应用程序让权。
      • I/O中断:由输入/输出设备发出的中断信号,输入输出任务完成时,会向CPU发出中断信号。
  3. 中断处理基本原理

    **不同的中断信号,需要用不同的中断处理程序来处理。**当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。

(六).系统调用

  1. “系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。

    普通应用程序可直接进行系统调用,也可使用库函数有的库函数涉及系统调用,有的不涉及
    编程语言向上提供库函数。有时会将系统调用封装成库函数,
    以隐藏系统调用的一些细节,使程序员编程更加方便。
    操作系统向上提供系统调用,使得上层程序能请求内核的服务
    裸机
  2. 不涉及系统调用的库函数:如的“取绝对值”的函数

    涉及系统调用的库函数:如“创建一个新文件”的函数

  3. 系统协调的必要性:由操作系统内核对共享资源进行统一的管理,并向上提供“系统调用”,用户进程想要使用共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。

  4. 应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。

  5. 如何使用系统调用:

    CPU用户态执行传参指令,将参数传入寄存器,查找相应的系统调用指令,执行陷入指令,执行中断,CPU进入内核态依据寄存器内容处理或调用系统,处理完成之后归还用户态,继续程序的执行。

注意:

  1. 陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态

  2. 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行

(七).操作系统体系结构<10.12>

操作系统内部的层次结构大致由一下结构。

图10-12-1

ps:时钟管理——利用时钟中断实现计时功能
中断处理——产生中断时,执行处理中断的程序
原语——是特殊的程序,具有原子性,执行不可被中断

1. 大内核和微内核

两者主要区别是上图中间部分运行在内核态还是用户态。

  1. 大内核的体系结构

图10-12-2

  • 优点:高性能
  • 缺点:内核代码庞大,结构混乱,难以维护
  1. 微内核的体系结构

图10-12-3

  • 优点:内核功能少,结构清晰,方便维护
  • 缺点:需要频繁地在核心态和用户态之间切换,性能低

eg:现在,应用程序想要请求操作系统的服务,这个服务的处理同时涉及到进程管理、存储管理、设备管理。

在大内核操作系统体系下只需要两次状态切换,而微内核体系下需要六次状态切换

注意:状态切换的过程是有成本的,要消耗不少时间,频繁地状态切换会降低系统性能

2.其他体系结构的对比
  1. 分层结构

    1. 结构图

      图10-12-4

      最底层是硬件,最高层是用户接口
      每层只能调用更低一层

    2. 特征思想
      内核分为多层,每次可单向调用更低一层提供的接口,清晰的单层依赖

    3. 优点

      • 便于调试和验证,自底向上逐层调试验证
      • 易扩充和易维护,各层之间调用接口清晰固定
    4. 缺点

      • 仅可调用相邻低层,难以合理定义各层的边界
      • 效率低,不可跨层调用,系统调用执行时间长
  2. 模块化

    1. 结构图

      图10-12-25

    2. 特征思想
      将内核划分为多个模块,各模块之间相互协作
      内核 = 主模块 + 可加载内核模块
      主模块:只负责核心功能,如进程调度、内存管理
      可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核

    3. 优点

      • 模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发
      • 支持动态加载新的内核模块(如:安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性
      • 任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高
    4. 缺点

      • 模块间的接口定义未必合理、实用
      • 模块间相互依赖,更难调试和验证
  3. 宏内核(大内核)

    1. 结构图同上

    2. 特征思想
      所有的系统功能都放在内核里(大内核结构的OS通常也采用了"模块化”的设计思想)

    3. 优点

      • 性能高,内核内部各种功能都可以直接相互调用
    4. 缺点

      • 内核庞大功能复杂,难以维护
      • 大内核中某个功能模块出错,就可能导致整个系统崩溃
  4. 微内核

    1. 结构图同上

    2. 特征思想
      只把中断、原语、进程通信等最核心的功能放入内核。进程管理、文件管理、设备管理等功能以用户进程的形式运行在用户态

    3. 优点

      • 内核小功能少、易于维护,内核可靠性高
      • 内核外的某个功能模块出错不会导致整个系统崩溃
    4. 缺点

      • 性能低,需要频繁的切换 用户态/核心态。 用户态下的各功能模块不可以直接相互调用,只能通过内核的”消息传递”来间接通信
      • 用户态下的各功能模块不可以直接相互调用,只能通过内核的"消息传递"来间接通信
  5. 外核

    1. 结构图:(不是很明确)

    2. 特征思想
      内核负责进程调度、进程通信等功能,外核负责式为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全

    3. 优点

      • 外核可直接给用户进程分配“不虚拟、不抽象”内的硬件资源,使用户进程可以更灵活的使用硬件资源
      • 减少了虚拟硬件资源的"映射层",提升效率
    4. 缺点

      • 降低了系统的一致性
      • 使系统变得更复杂

(八).操作系统引导<10.17>

开机时,如何让操作系统运行起来?-> 引导问题

  1. 磁盘中会有一段主引导记录MBR,包含磁盘引导程序和分区表。

  2. 分区表是一种数据结构(DS),包含整个磁盘每个分盘(分区)分别占多大空间,以及每个的地址范围。

  3. 操作系统是安装在C盘中的,C盘是这个磁盘的活动分区,C盘内部有:
    引导记录PBR,负责找到“启动管理器”。
    根目录部分,包含文件夹及其他文件。
    其他。

  4. 主存:

    CPU连接内存(主存)。
    主存包含RAM和ROM。

    • BIOS在ROM中,是基础输入输出系统
    • ROM还包含ROM引导程序,又叫自举程序

    ps: RAM会因为断电导致数据丢失,ROM不会

  5. 操作系统引导

    1. 当计算机开机之后CPU通电就可以到固定的ROM中找到并执行自举程序,先自检然后再开机。
    2. 引导CPU去磁盘主引导程序把MBR转移到RAM,CPU运行MBR根据MBR中的分区表确定C盘的位置和边界。
    3. 找到活动分区(C盘)读取PBR执行启动管理器,在根目录下启动执行其中的程序。
    4. 然后启动管理器就会开始启动操作系统,完成系统启动的初始化,完成开机的一系列动作。

(九). 虚拟机

一台强大的物理机也只能运行一套操作系统,会造成系统资源的浪费,两个较复杂的进程或应用运行在同一个操作系统下也会存在不同程度的安全隐患,所以引入了虚拟机,每个虚拟机都可以独立运行一个操作系统。

  1. 虚拟机:使用虚拟化技术,将一台物理机器虚化为多台虚拟机器(Virtual Machine,VM),每个虚拟机器都可以独立运行一个操作系统。又叫虚拟机管理程序,虚拟机监控程序,VMM等。

  2. 虚拟机管理程序,会把内核空间划分为多个空间,分配给虚拟机使用,每台虚拟机可以安装独立的操作系统,以运行不同的应用程序。

  3. 第一类虚拟机管理程序

    1. 资源分配:
      CPU分配:单核CPU,每个虚拟机分配若干的时间片,上层看来就是分配了均等的CPU
      磁盘和内存:只需要把空间划分出来分配就好。

    2. 分配的结果就是每台虚拟机都可以拥有独立的硬件资源

    3. 只有虚拟机管理程序是运行在内核态。上层的操作系统“以为”自己运行在内核态,也会使用一些特权指令,虚拟机管理程序截获特权指令回复特权指令的执行结果。

    4. 结构图:
      图10-19-1第一类VMM

  4. 第二类虚拟机管理程序

    1. 运行在宿主操作系统上,在已有的操作系统上运行虚拟机管理程序(软件),通过管理程序,可以下载其他的操作系统
      VirtualBox,VMware

    2. 资源分配:
      借助管理程序,可以指定虚拟机使用多大内存和磁盘空间。
      硬件资源的分配管理者依然是宿主操作系统

    3. 结构图:
      图10-19-2第二类VMM5. 两种VMM对比:

    第一类VMM第二类VMM
    对物理资源的控制权直接运行在硬件之上,能直接控制和分配物理资源运行在宿主操作系统之上,依赖于宿主操作系统为其分配物理资源
    资源分配方式在安装虚拟机时,VMM要在原本的硬盘上自行分配存储空间,类似于”外核“的分配方式,分配未经抽象的物理硬件每台虚拟机拥有自己的虚拟磁盘,该盘实际上是宿主操作系统文件系统中的一个大文件。虚拟机分配到的内存是虚拟内存
    性能性能更好性能更差,需要宿主操作系统作为“中介"
    可支持的虚拟机数量更多,不需要和 Host OS 竞争资源,相同的硬件资源可以支持更多的虚拟机更少,宿主操作系统本身需要使用物理资源,宿主操作系统上运行的其他进程也需要物理资源
    虚拟机的可迁移性更差更好,只需导出虚拟机镜像文件即可迁移到另一台宿主操作系统上,商业化应用更广泛
    运行模式第一类VMM运行在最高特权级(Ring0),可以执行最高特权的指令。第二类VMM部分运行在用户态、部分运行在内核态。虚拟机发出的系统调用会被 VMM 截获,并转化为 VMM 对宿主操作系统的系统调用

    注意:特权指令分级Ring0等级最高,又叫0环,数字越大等级越低,把特权敏感的指令放在特权更高的分区,提高虚拟机使用时的安全性。

二、进程的描述与控制<10.26>

(一). 进程的概念、组成、特征

1. 有关进程的基本信息
  1. 程序:是静态的,存放在磁盘里的可执行文件,是一系列指令的集合。

  2. 进程:是动态的,是程序的一次执行过程。
    同一个程序可以多次执行,对应多个进程。

  3. 当进程被创建时,操作系统会给进程分配一个唯一的、不重复的PID(进程ID)。

    基本的进程描述信息,可以让操作系统区分各个进程
    操作系统也会记录进程的其他信息,用于实现操作系统对资源的管理,和操作系统对进程的控制和调度

    1. 分配的资源:分配的内存,正在使用什么I/O设备,正在使用什么文件
    2. 进程执行情况:CPU使用时时间,磁盘使用情况,网络流量使用情况等

    这些信息都被保存在一个**数据结构PCB(进程控制块)**中。 操作系统对并发运行的程序进行管理,但凡管理时用到的信息,都会被存放在PCB中。

  4. 程序运行的过程

    1. 程序文件存放在硬盘之中,运行前操作系统将其转存到内存中。
    2. 操作系统为其创建对应的进程,创建PCB,分配PID
      内存中存放指令的代码段——程序段,包含程序指令
      数据段——包含运行过程中产生的各种数据
      一个进程实体由PCB、程序段、数据段组成。进程是动态的,进程实体是静态的。
    3. CPU从内存中取出指令,然后等待资源执行
2. 进程的定义

进程是进程实体的运行过程,是系统进行资源分配调度的独立个体。

PCB是进程存在的唯一标志!

3.进程的特性
  1. 动态性,最基本特征
    进程是程序的一次执行过程,是动态地产生、变化和消亡的。
  2. 并发性
    内存中有多个进程实体,各进程可并发执行
  3. 独立性
    进程是能独立运行独立获得资源独立接受调度的基本单位。
  4. 异步性
    各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题。
    会导致并发程序执行结果的不确定性。
  5. 结构性
    每个进程都会配置一个PCB。结构上看,进程由PCB、程序段、数据段组成。

(二). 进程的状态与转换、进程组织

1. 进程的状态
  1. 创建态:进程正在被创建
    操作系统为程序分配PID和其他资源,初始化PCB。
  2. 就绪态:进程完成创建之后在就绪队列等待
    已经具备了程序运行的条件,等待空闲CPU,暂时不可用执行。
  3. 运行态:正在CPU上运行
    当CPU空闲下来之后,系统会在就绪态的进程中选择进程进入CPU运行,CPU执行该进程对应的程序(程序段指令序列)。
  4. 阻塞态:请求等待某个事件发生
    等待系统资源分配,等待其他进程响应。
    会让该进程先下CPU等待,等资源足够或者其他进程响应了之后回到就绪队列排队
  5. 终止态:程序请求操作系统终止进程
    进程完成或者出现exit系统调用,操作系统会让进程下CPU,并回收进程资源和PCB。
    终止态结束之后,进程PCB被回收,进程彻底消失。
2. 进程状态的转换

进程状态的转换的结构如图:

图10-26-1进程状态转换

注意:

  1. 进程不能直接从阻塞态进入运行态,需要先进入就绪队列等待CPU空闲,才能再次进入运行。
  2. 运行态可以反向进入就绪态等待,比如时间片用完但是进程未完成,再次进入运行态继续原先未完成的操作。
3.进程的组织方式<10.27>

为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来。

  1. 链式方式,有多个指针
    执行指针——指向正在运行的进程,单CPU计算机中同一时刻只有一个进程处于运行态。
    就绪队列指针——指向处于就绪态的进程,通常会把优先级高的进程放在队头
    阻塞队列指针——指向当前处于阻塞状态的进程,很多操作系统还会根据阻塞原因不同再分为多个阻塞队列。
  2. 索引方式,操作系统会在各个状态下创建索引表,在索引表下在依次指向各个进程的PCB

(三). 进程控制

进程控制的实现指的就是实现进程状态的转换

1. 基本概念
  1. 进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

  2. 如何实现进程的控制?——原语,使用具有原子性的原语实现。
    如果不能一次连续的完成,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作

  3. 如何实现原语的原子性?

    原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断,可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性。

    正常情况:CPU每完成一段指令都会检查是否有中断信号需要处理,如果有中断信号,则会暂停运行当前程序,转而执行相应的中断处理程序。
    关中断及开中断:CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查

2. 进程控制的相关原语
  1. 进程的创建

    1. 创建原语:
      • 申请空白PCB
      • 为新进程分配所需的资源
      • 初始化PCB
      • 将PCB插入到就绪队列
    2. 引起进程创建的事件:用户登录、作业调度、提供服务、应用请求等。
  2. 进程的终止

    1. 撤销原语——就绪态/阻塞态/运行态—>终止态,移除进程队列
      • 从PCB集合中找到终止进程的PCB
      • 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
      • 终止其所有子进程
      • 将该进程拥有的所有资源归还给父进程或操作系统
      • 删除PCB
    2. 引起进程终止的事件:正常结束、异常结束、外界干预
  3. 进程的阻塞

    1. 阻塞原语——运行态—>阻塞态
      • 找到要阻塞的进程对应的PCB
      • 保护进程运行现场,将PCB状态信息设置为阻塞态,暂时停止进程运行
      • 将PCB插入相应事件的等待队列
    2. 引起进程阻塞的事件:等待系统分配资源,等待其他进程提供数据
  4. 进程的唤醒

    1. 唤醒原语——阻塞态—>就绪态
      • 在等待队列中找到PCB
      • 将PCB从等待队列移除,设置进程为就绪态
      • 将PCB插入就绪队列,等待被调度
    2. 引起进程唤醒的事件:等待的事件发生
  5. 进程的切换

    1. 切换原语——运行态—>就绪态/就绪态—>运行态
      • 运行环境信息存入PCB
      • PCB移入相应队列
      • 选择另一个进程执行,并更新其PCB
      • 根据PCB恢复新进程所需的运行环境
    2. 引起进程切换的事件:当前进程时间片到、有更高优先级的进程到达、当前进程主动阻塞、当前进程终止等
3. 进程的切换<11.11>
  1. 切换原语
    1. 将运行环境信息存入PCB
    2. PCB移入相应的队列
    3. 选择另一个进程执行,并更新其PCB
    4. 根据PCB恢复新进程所需的环境
  2. 引起进程切换的事件
    1. 当前时间片到
    2. 有更高优先级的进程到达
    3. 当前进程主动阻塞
    4. 当前进程终止
  3. CPU中的寄存器
    1. PSW:程序状态字寄存器
    2. PC:程序计数器,存放下一条指令的地址
    3. IR:指令寄存器,存放当前正在执行的指令
    4. 通用寄存器:其他的一些必要信息
    5. 等…

(四). 进程通信

进程间通信IPC是指两个进程之间产生数据的交互。

进程通信需要操作系统支持?

​ 进程是分配系统资源的单位,因此个进程拥有的内存地址空间相互独立,为了保准安全,一个进程不能相互访问其他的进程的地址空间。

1. 共享存储

两个进程之间建立共享存储区,用于读写交换信息。

进程P发起与进程Q之间通信,P申请一块共享存储区,把通信内容写入到共享存储区,然后Q来访问,完成通信。

进程如果通过共享存储的方式相互通信,为避免出错,需要保证各个进程对共享空间的访问应该是互斥的

分类:

  • 基于存储区的共享
  • 基于数据结构的共享

注意:基于存储区的共享,操作系统在内存中划出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统。这种共享方式速度很快,是一种高级通信方式。
基于数据结构的共享,比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式

2. 消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的**“发送消息/接收消息”两个原语**进行数据交换。

格式化的消息=消息头+消息体:

  • 消息头:发送进程ID、接受进程ID、消息长度等格式化信息。
  • 消息体:具体要传送的信息。

分类:

  • 直接通信方式:指明接受进程的ID。
  • 间接通信方式:通过“信箱”间接通信,又称“信箱通信方式”。
3. 管道通信

在一端写入数据,在另一端读取数据,只能是单向的。
“管道”是一个特殊的共享文又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区。消息是先进先出的。

注意:

  • 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
  • 各进程要互斥地访问管道(由操作系统实现)。
  • 当管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。
  • 当管道读空时,读进程将阻塞,直到写进程往管道中写入数据,即可唤醒读进程。

管道中的数据一旦被读出,彻底消失。因此,当多个进程读同一个管道时,可能会错乱。对此,通常有两种解决方案:
一个管道允许多个写进程,一个读进程(2014年408真题官方答案);
②允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据(Linux的方案)。

王道书有误

​ 管道可以理解为共享存储的优化和发展,因为在共享存储中,若某进程要访问共享存储空间则必须没有其他进程在该共享存储空间中进行写操作,否则访问行为就会被阻塞。而管道通信中,存储空间进化成了缓冲区,缓冲区只允许一边写入、另一边读出,因此只要缓冲区中有数据,进程就能从缓冲区中读出,而不必担心会因为其他进程在其中进行写操作而遭到阻塞,因为写进程会先把缓冲区写满,然后才让读进程读,当缓冲区中还有数据时,写进程不会往缓冲区写数据。当然,这也决定了管道通信必然是半双工通信。

错误修正:
写进程往管道写数据,即便管道没被写满,只要管道没空,读进程就可以从管道读数据。
读进程从管道读数据,即便管道没被读空,只要管道没满,写进程就可以往管道写数据

(五). 线程的概念

有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。传统的进程是程序执行流的最小单位。为此,引入了“线程”,来增加并发度,引入线程后,线程成为了程序执行流的最小单位

  • 可以把线程理解为“轻量级进程”。线程是一个基本的CPU执行单元,也是程序执行流的最小单位

  • 并发性:引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务。

  • 资源分配调度:引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。

  • 系统开销:线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小。

线程的属性
  1. 线程是处理机调度的单位
  2. 多CPU计算机中,各个线程可占用不同的CPU
  3. 每个线程都有一个线程ID、线程控制块(TCB)
  4. 线程也有就绪、阻塞、运行三种基本状态
  5. 线程几乎不拥有系统资源
  6. 同一进程的不同线程间共享进程的资源
  7. 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
  8. 同一进程中的线程切换,不会引起进程切换
  9. 不同进程中的线程切换,会引起进程切换
  10. 切换同进程内的线程,系统开销很小;切换进程,系统开销较大

(六). 线程的实现<11.13>

1. 用户级线程

早期的操作系统只支持进程不支持线程。当时的“线程”是由线程库实现的

从代码的角度看,线程其实就是一段代码逻辑。上述多段代码逻辑上可以看作三个“线程”,while 循环就是一个最弱智的“线程库”。

线程库相当于是对进程的整合,完成了对线程的管理工作。

  1. 线程管理的工作由谁完成?

  2. 线程切换是否需要CPU变态?

  3. 操作系统是否能意识到用户级别的线程存在?

    线程是由线程库,即应用程序完成的,在用户态即可完成线程的切换,在操作系统看来,经由线程库整合的多进程是同一个进程,所以它意识不到用户级线程的存在。

其结构图如下:

图11-13-1用户级线程

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

2. 内核级线程

经过发展,操作系统可以承受多道程序并行,真正意义上的线程出现。

内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。操作系统会为每个内核级线程建立相应的TCB,通过TCB对线程进行管理。操作系统可以意识到内核级线程。

其结构图如下:

图11-13-2内核级线程

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

3. 多线程模型

注意:操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位

  1. 一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
    优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
    缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
  2. 多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
    优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
    缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
  3. 多对多模型:n用户及线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。
    克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞);
    又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

待续

课程学习中,本学期完成该部分主要笔记,因为老师讲的内容太少接下来会根据王道的考研课程总结笔记,不定期更新,大概一周一到三次

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值