王道考研操作系统


文章详见
https://blog.csdn.net/m0_46610815/article/details/121324682

操作系统

操作系统特征

并发,共享,虚拟,异步

并发和并行

并发:多个事件在同一时间间隔内发生,宏观上是同时发生的,微观上是交替发生的

并行:两个或多个事件在同一时刻进行

并发性。共享性互为存在条件
只有系统拥有并发性,才有可能到导致异步性
中断

当中断发生时,cpu立即进入核心态

当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理

对于不同的中断信号,会进行不同的处理

cpu由用户态转换为核心态,是操作系统获取计算机的控制权

用户态和核心态通过中断实现,并且中断时唯一途径

核心态->用户态通过执行一个特权指令,将程序状态字(psw)的标志位转换为“用户态”

系统调用

系统调用会使处理器从用户态进入核心态

系统调用在用户态,对系统调用的处理发生在核心态

执行陷入指令会产生内中断,使处理器从用户态进入核心态

进程

进程控制块(PCB),程序段,数据段构成了进程实体(进程映象)

PCB是进程存在的唯一标志

定义

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位(严格的说,进程和进程实体并不一样,进程实体是静态的,进程是动态的)

进程的管理者所需的数据都在PCB中,程序段和数据段放置程序本身运行所需的数据

组成方式

连接方式

索引方式

特征

动态性,并发性,独立性,异步性,结构性

基本状态

运行态,就绪态,阻塞态 ,创建态,终止态

运行态:cpu+其他所需资源

就绪态:其他所需资源

阻塞态:无

进程状态的转换

进程是用系统调用的方式申请某种系统资源

就绪态->进程态 进程被调度

进行态->就绪态 时间片到,或者cpu被其他的高优先级的进程抢占

运行态->阻塞态 等待系统资源分配,或等待某事件发生(主动行为)

阻塞态->就绪态 资源分配到位,等待的事情发生(被动行为)

阻塞态不能直接转换为运行态,就绪态也不能直接转换为阻塞态

进程控制

实现进程之间的转换

如何进行进程控制

原语实现进程操作,原语的特点执行期间不允许被中断 ,原子操作

原语采用“关中断指令”和“开中断指令” 实现

关/开中断指令的权限非常打,只能在核心态下进行的特权指令

阻塞和唤醒要成对存在

进程通信

定义

进程之间的信息交换

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立

为了保证安全,一个进程不能直接访问另一个进程的地址空间,但进程之间的信息交换又是必须要实现的,为保证进程之间的安全通信,操作系统必须提供一些方法

实现方式
  1. 共享存储:
  • 基于数据结构的共享 (低级通信方式)

  • 基于存储区的共享(高级通信方式)

    互斥访问共享空间

  1. 消息传递

    以格式化的消息为单位,进程通过操作系统提供的“发送/接收消息”连哥哥原语进行数据交换

    • 直接通信方式
    • 间接通信方式
  2. 管道通信

  • 管道只能采用半双工通信

  • 各进程需要互斥访问管道

    写满时,不能再写,读空时,不能在读

    没写满,不能读,没读空,不能写

线程

定义

线程时基本的cpu执行单元,也是程序执行流的最小单位。引入线程之后,进程内的各线程之间可以并发,从而进一步提升了进程的并发度

引入线程后。进程只作为除cpu之外的系统资源的分配单位

线程是处理处理机调度的单位,进程是资源分配的单位

实现方式
  • 用户级线程
  • 内核级线程
  • 组合方式
多线程模型
  1. 多对一

    • 优:进程开销小效率高
    • 缺:一个线程阻塞会导致整个进程阻塞
  2. 一对一

    • 优:各个线程可分配到多核处理机并行执行,并发度高
    • 缺:进程管理开销大
  3. 多对多

作业调度

高级调度(作业调度)

  • 外存->内存

中级调度/内存调度(提高内存利用率和系统吞吐量)

  • 外存->内存

低级调度(进程调度)操作系统中最基本的调度

  • 内存->CPU
进程调度

进程在操作系统内核程序临界区中不能进行调度和切换

方式

非剥夺调度方式(非抢占方式)

剥夺调度方式(抢占方式)

cpu利用率
系统吞吐量

单位时间内完成作业的数量=总共完成了多少道作业/总共花了多少时间

周转时间

作业被提交给系统开始,到作业结束为止的这段时间间隔

=作业完成时间-作业开始时间(用户更关心)

平均周转时间=各作业周转时间/作业数 (操作系统更关心)

带权周转时间=作业周转时间/作业实际运行的时间

=(作业完成时间-作业提交时间)/作业实际运行的时间

带权周转时间越小,用户满意度越高

响应时间

用户提交请求到首次产生响应所用的时间

调度算法

方法
先来先服务 (FCFS)

短作业优先(SJF)非抢占式

最短剩余时间优先算法(SRTN)抢占式

需要注意的事项

对短作业有利,对长作业不利,可能产生饥饿现象

高响应比优先(HRRN)非抢占式

考虑等待时间和要求服务的时间

响应比=(等待时间+要求服务时间)/要求服务时间

时间片调度算法(RR)

抢占式算法

时钟中断

如果时间片太大,则会退化为先来先服务调度算法,并且会增大进程响应时间,一般来说,设计时间片时要让切换进程的开销占比不超过1%

优先级调度算法

设置优先级:

系统优先级高于用户进程

前台进程优先级高于后台进程

操作系统更偏好I/O型进程(I/O繁忙型进程)与I/O型进程相对的是计算型进程(CPU繁忙型进程)

多级反馈队列调度算法

进程同步和进程互斥

同步亦称直接制约关系。它是指为完成某个任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作。

我们把一个时间端内只允许一个进程使用的资源成为临界资源,对临界资源的访问,必须互斥的进行。互斥。亦称间接制约关系

互斥原则

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待(当进程不能进入临界区,应立即释放处理机,防止进程忙等待)

进程互斥软件实现方法

  • 单标志法

  • 双标志先检查

  • 双标志后检查

  • Peterson算法

    单标志法

双标志先检查法

双标后检查法

?

Peterson算法

进程互斥硬件实现

中断屏蔽算法

只适合操作系统内核进程,不适应用户进程

TestandSet指令
Swap指令

信号量机制

用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的进行了进程互斥,进程同步

信号量其实就是一个变量,可以用一个信号量表示系统中的某个资源的数量

一对原语:wait(S)和sijnal(S)简称P,V操作

整型信号量

记录型信号量

信号量实现进程互斥

信号量实现进程同步

信号量实现前驱关系

生产者消费者问题

缓冲区是临界资源,各进程必须互斥的访问

读者写者问题

问题 :写进程饥饿

改进

哲学家问题

管程

定义
  1. 管程是一种特殊的软件模块

  2. 局部于管程的共享数据结构说明

  3. 对该数据结构进行操作的一组过程

  4. 对局部于管程的共享数据设置初始值的语句

  5. 管程有一个名字

基本特征
  1. 局部于管程的数据只能被局部于管程

  2. 一次进程只有通过调用管程内的过程才能进入管程访问数据

  3. 每次仅允许一个进程在管程内执行某个内部过程

死锁

死锁,饥饿,死循环的区别

什么时候引起死锁
  1. 对系统资源的竞争

  2. 进程推进顺序非法

  3. 信号量的使用不当

  4. 总之,对不可剥夺的不合理分配,也可能导致

*死锁产生的必要条件
  1. 互斥条件 :对必须互斥使用的资源的争抢才会导致死锁
  2. 不剥夺条件:进程保持的资源只能进行主动释放,不可强行剥夺
  3. 请求和保持条件:保持者某些资源不放的同时,请求别的资源
  4. 循环等待条件:存在一种进程资源的循环等待链,循环等待未必死锁,死锁一定有循环等待
死锁的处理策略
  1. 预防死锁,破坏死锁的一个或几个

    • 破环互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁
      • 缺点:很多时候都无法破坏互斥条件
    • 破坏不剥夺条件:进程所获取的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放
      • 缺点:实现起来比较复杂
      • 释放已获得的资源可能造成前一阶段的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU
      • 反复的申请和释放资源会增加系统开销,降低系统吞吐量
    • 破环请求和保持条件:进程已经保持了一个资源,但又提出了新的资源请求,而该资源又被其他进程占用,此时请求进程被阻塞,但又对自己已有的资源保持不放
      • 缺点:资源利用率极低
      • 导致某些进程饥饿
    • 破环循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求
      • 缺点:不方便增加新设备,会导致资源浪费,用户编程麻烦
  2. 避免死锁,用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)

    安全序列

    不安全序列

    银行家算法

  3. 死锁的检测和解除,允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁

死锁检测

死锁解除
  1. 资源剥夺法
  2. 撤销进程法(终止进程法)
  3. 进程回退法

内存

装入方式

  1. 绝对装入

    ? 适用于单道程序环境

  2. 静态重定位

? 装入时对地址进行重定位必须分配其要求的全部内存,如果内存空间不够,就不能装入该作业,作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间

  1. 动态重定位

    把地址转换推迟到程序真正要执行时才进行,因为装入内存后所有的地址依然时物理地址,这种方式需要一个重定位寄存器的支持,允许程序在内存中发生移动

链接方式

  1. 静态链接
  2. 装入时动态链接
  3. 运行时动态链接

内存保护

  1. 设置一对上,下限寄存器
  2. 采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)进行越界检查,重定位寄存器中存放的时进程的起始物理地址,界地址寄存器中存放的时进程的最大逻辑地址

覆盖技术

将程序分为多个段

内存中分为一个“固定区”和若干个“覆盖区

固定区的程序段在运行过程中不会被调入调出

覆盖区的程序段在运行过程中会根据需要调入调出

缺点:对用户不透明

交换技术

交换技术设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存

通常把磁盘文件分为文件区和对换区,文件区追求存储空间的利用率,采用离散分配方式,对换区追求换入换出速度,采用连续分配方式

连续分配

内部碎片,分配给某进程的内存区域中,如果有些部分没有用上

外部碎片,是指内存中的某些空闲分区由于太小而难以利用

单一连续分配

内存被分为系统区和用户区

内存中只能有一道用户程序

无外部碎片,有内部碎片

固定分区分配

整个用户空间划分为若干个固定大小的分区

  1. 分区大小相等

  2. 分区大小不等

无外部碎片,有内部碎片

动态分区分配

动态分配没有内部碎片,但是有外部碎片,通过紧凑技术来解决外部碎片

首次适应算法

从低地址开始查找,找到第一个满足大小的空闲分区

最佳适应算法

空闲分区按容量递增次序链接,每次分配内存时顺序查找空闲分区链(或空闲分区表)

最坏适应算法(最大适应算法)

空闲分区按容量递减次序链接

邻近适应算法

每次分配内存从上次查找结束的位置开始查找空闲分区链

分页存储管理

基本地址变换结构

快表

又称联想寄存器(TLB),是一种访问速度比内存块很多的高速缓冲存储器,内存中的页表常称为慢表

两级页表

各级页表的大小不能超过一个页面

两级页表的访存次数分析

分段

分段系统的逻辑机制结构由段名和段内地址所组成

段号的位数决定了每个进程最多可以份几个段

段内地址位数决定了每个段的最大长度是多少

分段相比于分页更容易实现共享和保护

段页式管理方式

段页式访问一个逻辑地址所需要访问次数

第一次——查段表 第二次——查页表 第三次——访问目标单元

虚拟内存

主要特征

  • 多次性:无需再作业运行时一次性全部装入内存,而是允许被多次调入内存
  • 对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入,换出
  • 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量

如何实现虚拟内存

页面置换算法

最佳置换算法(OPT)

先进先出置换算法(FIFO)

最近最久未使用算法(LRU)

逆向检查

时钟置换算法(CLOCK)

改进型时钟置换算法

情况1

情况2

总结

页面分配策略

驻留集,固定分配,可变分配,局部置换,全部置换

抖动(颠簸)现象

工作集

文件管理

文件属性

  • 文件名
  • 标识符
  • 类型
  • 位置
  • 大小
  • 创建时间,上次修改时间
  • 保护信息

文件分配

连续分配

链接分配--隐式链接

链接分配--显式链接

链式分配

索引分配

存储空间管理

文件的基本操作

文件共享

文件保护

文件系统

磁盘结构

磁盘调度算法

一次磁盘读/写所需要的时间

先来先服务算法(FCFS)
最短寻找时间优先(SSTF)

扫描算法(SCAN)

LOOK调度算法

循环扫描算法(C-SCAN)

C-LOCK调度算法

磁盘结构设计

磁盘结构管理

I/O设备

I/O基本概念

I/O控制器

I/O控制方式

程序直接控制方式

中断驱动方式

DMA方式(直接存储器存取)

通道控制方式

总结

I/O软件层次结构

假脱机技术

设备的分配与回收

设备的固有属性可分为三种:独占设备,共享设备,虚拟设备

进程的安全性可分为两种方式:安全分配方式,不安全分配方式

设备分配管理中的数据结构

设备分配

总结

缓冲区

单缓存

双缓冲

缓冲池

总结