SDU操作系统复习笔记

本文最后更新于:2022年7月7日 上午

名词解释

操作系统 operating system

操作系统是为应用程序提供运行环境的资源管理软件

虚拟机 virtual machine

通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统

运行时系统 runtime system

编译程序除了把用户程序中的语句翻译成机器代码外,还要为用户程序的运行提供管理工作,这部分代码就是运行时系统

装入程序 loader

将装入模块装入内存的程序,实现虚拟地址到内存地址的映射,分为绝对装入、静态重定位、动态重定位

运行栈 execution stack

存放有关正在运行的子程序消息的栈,存放子程序的返回地址、传递给子程序的参数、局部运行环境

系统调用 system call

操作系统提供给用户程序的一组接口,用于获取内核提供的服务

应用程序接口 API

由操作系统或高级语言提供,为应用程序提供跨平台的I/O服务

特权指令 privileged instruction

能对系统中关键资源进行操作的指令,为保证计算机系统的安全可靠特权指令只能在核心态下使用

线程 thread

程序在虚拟CPU上的执行过程,是操作系统能够进行调度的最小单位。

线程控制块 TCB

操作系统描述和管理线程的数据结构

进程 process

一组线程及其所依赖的虚拟运行环境,是操作系统进行资源分配的最小单位。

进程控制块 PCB

操作系统描述和管理进程的数据结构。主要内容有线程TCB、资源描述、虚实资源映射关系、进程的档案

多线程进程

进程中可以包含多个线程,所有线程共享进程的虚拟运行环境,进程内线程之间并发执行,每个线程有自己的线程控制块、运行栈

僵尸进程 zombie process

子进程已经结束,但父进程并不执行wait()为子进程释放资源

孤儿进程 orphan process

父进程已经退出,剩下的子进程被init进程收留

进程上下文 process context

进程执行活动全过程的静态描述,包括用户进程传递给内核的参数、CPU的所有寄存器中的值、进程的状态以及堆栈内容

CPU调度器 scheduler

按调度算法选择一个就绪线程并将CPU分配给它运行,是操作系统中关键的程序模块

抢占式调度 preemptive scheduling

进程还没有执行完成就被剥夺CPU,切换执行其他的进程

对换技术 swapping

内存空间紧张时,将内存中某些进程暂时调出到外存,腾出足够的内存空间后把具备运行条件的进程调入内存

多道程序设计 multiprogramming

允许多个程序同时装入计算机内存中,在管理程序控制下宏观上并行、微观上串行

请求调页 demand paging

执行一个进程前仅将PCB装入内存,程序和数据并没有实际装入内存;程序执行过程中,如果访问到的页还没有装入内存就通过缺页异常处理将其装入内存

局部模式 locality model

进程执行过程中,其访问的内存空间从一个局部迁移到另一个局部,这种运行方式被称为局部模式

颠簸 thrashing

在页面置换过程中频繁的页面调度导致CPU利用率极低的现象

工作集 working model

进程在某个时刻t之前$\Delta$次访问中所访问页的集合

临界区 critical section

进程中访问临界资源的代码段,临界区不能并发执行

字符设备 character device

指在I/O传输过程中以字符为单位进行传输的设备,例如键盘,打印机等,数据没有地址

块设备 block device

将信息存储在固定大小的块中,每个块都有自己的地址,I/O传输过程中以块为单位

物理格式化 physical formatting

将磁盘划分出一系列同心圆磁道,各个磁道划分为扇区

逻辑格式化 logical formatting

在磁盘上建立一个空文件系统,使操作系统对其进行后续文件读写的过程

磁盘冗余阵列 RAID

通过在多个磁盘上存储相同的数据改善性能、增加可靠性的技术

设备驱动程序 device driver

直接控制设备的程序

设备依赖的 device-dependent

指程序只能在特定的设备环境下运行,也称设备相关的

中断服务例程 ISR

驱动程序的一部分,处理中断信号,检查自己负责的设备是否发出中断以处理中断事件

假脱机 SPOOLing

外围设备同时联机操作,是低速I/O设备与主机交换的一种技术。利用程序模拟脱机输入输出技术中外围控制机的功能,提高了输入输出速度、将独占设备改造为共享设备、实现了虚拟设备的功能

守护进程 daemon

开机时启动,后台运行,无交互,直至关机

文件 file

由操作系统管理的、存储在外存上的、数据的逻辑单元,位程序提供了按名存取的外存使用模式

索引节点 i-node

存放文件属性和文件的位置,每个文件有唯一的索引节点号。整个系统有一个索引节点表,存放全部文件属性和位置

文件分配表 FAT

用于文件的链接分配,每个磁盘有一张文件分配表FAT,行号对应块号,每个FAT表项中存放对应磁盘块的下一块链接指针

文件共享 file sharing

在不同的目录下访问同一个文件;不同的进程访问同一个文件

保护域 protection domain

对一组对象访问权限的集合{(对象,操作), …},表示一种身份

访问矩阵 Access Matrix

定义了系统中所有的保护域

访问控制表 ACL

从文件的角度描述用户的权限,访问矩阵按列压缩

用户权限表 Capability List

从用户的角度描述对文件的操作,访问矩阵按行压缩

虚拟文件系统 VFS

是物理文件系统与服务之间的一个接口层,为各类文件系统提供了一个统一的操作界面和应用编程接口

同步 synchronization

并发环境下,保持操作之间偏序关系的行为

互斥 mutual exclusion

某一资源同时只允许一个访问者对其进行访问

信号量 semaphore

同步工具,通过PV原子操作控制多线程对共享资源的访问

管程 monitor

由高级语言提供的同步方法,将共享变量及对其的所有操作封装在一个对象中,通过每次只允许一个进程在管程内部执行实现进程的互斥,通过设置条件变量及等待、唤醒操作实现进程的同步

竞争条件 race condition

由于两个或者多个进程竞争使用不能被同时访问的资源,使得这些进程有可能因为时间上推进的先后原因而出现问题

安全状态 safe state

系统能按安全序列P1, P2, …, Pn的顺序为每个进程分配其所需的全部资源,使每个进程都能顺利完成,则称系统处于安全状态

简答论述

操作系统的结构

  • 简单结构

    • 无核:操作系统内核和应用程序的权限没有区分
    • 单核:全部内核代码运行在同一个地址空间中,权限相同
  • 分层

    系统分成若干层,每层建立在底层基础上,只能高层程序调用低层的程序

  • 微内核

    讲内核功能尽量从内核空间移到用户空间,内核尽量小

    更容易扩充、移植,更可靠,更安全;内核与核外程序之间的通信降低性能

  • 模块化

    使用面向对象的技术,模块之间通过接口通信

内核、应用程序与用户的关系

内核为应用程序运行提供管理和服务

内核和用户无直接关系,用户感觉不到内核的存在

用户直接/间接执行应用程序

系统调用的工作机制及其参数传递方法

工作机制

  • 正在运行的进程先传递系统调用参数,然后由陷入(trap)指令负责将用户态转化为内核态,并将返回地址压入堆栈以备后用,接下来CPU执行相应的内核服务程序,最后返回用户态。

参数传递方法

  • 通过寄存器传递参数
  • 若参数数量比寄存器多,参数通常存在内存的块和表中,并将块的地址通过寄存器来传递
  • 参数通过程序压入堆栈中,通过操作系统弹出

逻辑地址和物理地址绑定的时间有哪几种及优缺点(装入的三种方式)

  • 编译时(绝对装入):编译时就知道程序将在内存中的驻留位置,则可以生成绝对代码

    执行速度快

    只适用于单道程序的运行环境

  • 加载时(静态重定位):装入时对地址进行重定位,地址变换在装入时一次性完成

    适用于多道程序的运行环境

    作业装入时需要分配所有要求的内存空间,一旦进入内存不能移动和申请空间

  • 执行时(动态重定位):程序要执行时才进行地址转换

    可以把程序放在不连续的存储区中;程序运行前只装入部分代码即可运行;便于程序段的共享

    需要硬件支持:基地址寄存器、限长寄存器、MMU

进程转换图

进程转换图

进程与线程的区别和联系

一个线程只能属于一个进程,而一个线程可以有多个线程且至少有一个线程

线程是操作系统最小的调度单位,进程是操作系统最小的资源分配单位

同一进程的所有线程共享该进程的所有资源

同一进程的多个线程共享代码段、数据段、堆,但每个线程拥有自己的栈段

同一进程的线程可以并发执行,进一步提高资源利用率和系统吞吐量

对于系统创建/撤销/切换的开销,进程大于线程

用户级线程和内核级线程及关系

用户级线程:线程的管理由用户程序(线程库)控制。非抢占式,线程切换速度快,对于操作系统内核透明,若一个线程阻塞则导致整个进程阻塞 ,不适用于多CPU

内核级线程:线程的管理(创建、撤销、调度)需要由内核控制。可以抢占,切换代价高,若一个线程阻塞则不会影响进程中其他线程的运行,适用于多CPU

多对一:程序创建的所有线程为用户级线程

一对一:程序创建的所有线程为内核级线程

多对多:多个内核级线程共同分担多个用户级线程的任务

一个进程中能否既有内核级线程又有用户级线程

当采用多对多方式时,一个进程中既有内核级线程又有用户级线程。每个进程有自己的内核线程池,运行时库分派并标记可运行的用户级线程为准备好执行的线程,操作系统选择用户线程并将它映射到线程池中的可用内核线程,多个用户级线程可以分配给相同的内核级线程

Java线程属于内核级线程

何时执行调度器

非抢占式调度

  • 当前线程执行结束

  • 当前线程主动放弃CPU

  • 当前线程阻塞

抢占式调度

  • 就绪队列中出现高优先级的线程

  • 时间片结束

操作系统需要考虑的调度及目标、方法

  • 作业调度:将外存中的作业调入内存,为其创建进程、分配资源

    先来先服务FCFS 短作业优先SJF 最高响应比优先HRN 优先级 轮转法 多级反馈队列

  • 内存调度:为提高内存利用率和系统吞吐量,将内存中的进程暂时挂起,选择部分程序或数据留在内存,这种技术称为交换

  • 进程调度:从就绪队列中选择进程获得CPU

    先进先出FIFO 时间片轮转RR 优先级 多级反馈队列

  • 磁盘调度:当多个进程要求访问磁盘时,使平均访问时间最小

    先来先服务FCFS 最短寻道时间优先SSTF 电梯调度SCAN LOOK C-SCAN C-LOOK

// ???不懂算不算调度

  • 空闲分区的分配:将磁盘中一组连续的块分配给文件存储

    首次适应 最佳适应 最坏适应

  • 请求分页存储管理中的页面置换:内存空间不足时,需要从内存中调出一页

    最佳置换OPT 先进先出FIFO 最近最久未使用LRU 时钟置换CLOCK

调度算法的目标

  • CPU利用率 高
  • 吞吐量 高:单位时间内完成进程的个数
  • 等待时间 短:线程在就绪队列中的时间
  • 响应时间 短:从用户提交请求到系统做出反馈的时间
  • 周转时间 短:进程等待时间+运行时间

进程调度中多级反馈队列调度算法的基本思想

将进程按类型分成不同的队列,每个队列采用适合自身的调度算法,从最高优先级队列开始调度,若该队列中的作业未完成则将其降级到更低优先级队列,若较低优先级队列中作业等待时间过长则将其升级到更高优先级队列,能够较好实现公平性与资源利用率之间的平衡。

进程通信IPC的两种模式

共享内存:多个进程都可以访问各自的虚拟内存区域,进程虚拟地址映射到相同的物理地址;共享数据过程的同步由应用程序负责

消息传输:以Message为单位,通过send()和receive()两个原语操作进行数据交换

  • 直接通信:要求对方在线,每个进程都有消息队列
  • 间接通信:对方可以不同时在线,通信前建立邮箱

图示说明页式存储管理系统对页面共享的方法,并说明共享代码和共享数据有何限制条件

不同作业指向相同的页框号

页式存储管理系统对页面的共享

由于页不是代码的逻辑单元,所以需要将逻辑单元对齐页边界

CPU和操作系统在分页中各自承担了哪些工作

CPU生成逻辑地址,分为页表和页偏移量两个部分;当一个进程可分配到CPU时,CPU调度程序可以根据页表副本来定义硬件页表

操作系统为每个进程维护一个页表的副本用于将逻辑地址转变成物理地址;管理物理内存,维护物理内存的分配信息保存在帧表中;

图文并茂的描述虚拟地址到物理地址的映射过程

基本分页式

带快表的分页式

① 根据逻辑地址计算页号、页内偏移量

② 比较页号和页表长度,检查页号合法性

③ 查快表,若命中则获得页面存放的内存块号,转⑤;若未命中,转④

④ 查页表,根据页表始址找到页号对应页表项,获得页面存放的内存块号,并将该页表项复制到快表中

⑤ 根据内存块号和页内偏移量得到物理地址

基本分段式

段页式

请求调页系统中页表项包含的数据项和作用

  • 页号(隐式):给页顺序编号
  • 内存块号:指出该页在内存中的位置
  • 状态位:该页是否已经调入内存
  • 访问字段:记录本页在一段时间内的访问次数或最近一次访问时间,用作置换算法的参考项
  • 修改位:该页在调入内存后是否被修改过
  • 外存地址:该页在外存中的位置

请求调页和纯分页的比较

  • ISA架构的改变:页故障异常、页表中增加存在位和脏位等设计
  • 操作系统的改变:页故障异常处理程序(页置换)
  • 硬盘的改变:对换区

采用工作集模型预防系统抖动的思想与过程

根据局部性原理,进程会在某段时间间隔内相对稳定地访问某些页面。所以引入工作集的概念,指在某段时间间隔内进程实际访问的页面的集合

操作系统跟踪每个进程的工作集,并为进程分配大于其工作集大小的物理块

颠簸产生的原因及解决方案

进程频繁访问的页面数多于可用的物理块数

应用工作集策略为进程分配足够多的物理块;修改页面置换算法;降低多道程序的数量;增加物理内存容量

I/O控制方式及特点

程序直接控制:程序直接对设备轮询

中断驱动:当设备准备完成时发生中断

DMA:在I/O设备与内存之间开辟直接数据通路

通道控制:引入专门的I/O处理机进行管理

输入输出过程举例

  • 线程T调用驱动程序Q的启动部分的代码,启动设备

  • 当前线程T等待设备完成操作;设备开始工作,线程T阻塞,CPU转去执行其他任务

  • 设备完成工作,发出中断信号,激活中断处理程序,调用驱动程序Q的中断服务例程处理中断,线程T就绪

  • 线程T被调度,继续执行

驱动程序、设备、中断服务程序、I/O子系统关系

  • 驱动程序与内核I/O子系统

    内核I/O子系统调用驱动程序,启动设备

    驱动程序可以调用内核,如阻塞、唤醒线程

  • 驱动程序与中断处理程序

    中断处理程序调用驱动程序,执行设备中断服务例程

  • 驱动程序与设备

    驱动程序向设备发送命令,检测设备状态,通过中断机制响应设备事件

缓冲区的作用

在内存中预留指定大小的存储空间用来临时存储I/O数据,可以缓和通信双方数据处理速度、单元的差异性,减少实际物理读写次数,提升并发性

缓冲区一直被重用,可以减少动态分配和回收内存的次数

缓冲机制的三种用途并举例

  • 处理数据流的生产者与消费者之间的速度差异

    从调制解调器接收文件要保存到硬盘上。由于调制解调器大约比硬盘慢数千倍,所以在内存中创建缓冲区累计从调制解调器接收到的字节,当整个缓冲区填满后,通过一次操作将缓冲区内容写入磁盘中

  • 协调传输数据大小不一致的设备

    计算机网络中,缓冲用来处理消息的分段与重组。在发送端,一个到消息分成若干小包;在接收端,将包放在重组缓冲区内,最终生成完成的消息

  • 支持应用程序I/O的复制语义

    当某应用程序需要将缓冲区内的数据写入到磁盘上时,操作系统将应用程序缓冲区复制到内核缓冲区中,让磁盘写操作在内核缓冲区中执行,这样后来应用程序缓冲区的改变就没有影响

使用cache的意义

解决数据读写速度不匹配的问题

高速缓存与缓冲区的区别

作用上:高速缓存为了提高效率;缓冲区用于通信双方数据的交换

内容上:高速缓存中的内容是另一个存储器内容的备份;缓冲区中的数据是唯一的

异步I/O 阻塞I/O 非阻塞I/O的区别,并举例

阻塞I/O:请求I/O系统调用后一直等待直到获得结果,进程变为就绪态 socket中的listen(), send(), recv()等

非阻塞式I/O:请求I/O系统调用后立即返回 socket中的select()

异步I/O:请求I/O系统调用后立即返回,I/O操作完成后向进程发出信号执行回调函数 aio_read()

访存操作可能会导致I/O的进行,某进程读写文件时可能并没有I/O设备执行,为什么

使用了假脱机技术。操作系统对于用户的读写文件请求,并没有真正把I/O设备分配给该用户进程,而是在磁盘缓冲区中为进程分配了空闲盘块和建立了一张I/O请求表,实现了虚拟设备的功能

批处理、脱机、假脱机为了解决什么问题

批处理阶段引入脱机技术(在外围控制机的控制下I/O设备的输入输出先被送到更快速的磁带上)缓解了CPU与慢速I/O设备的速度矛盾

假脱机技术用软件的方式模拟脱机技术(磁盘上开辟的输入输出井模拟磁带,输入输出进程模拟外围控制机)提高了I/O速度,把一台物理设备虚拟成逻辑上的多台设备,将独占设备改造为共享设备

磁盘分配的三种方式和各自优缺点

  • 连续分配

    每个文件在磁盘上占有连续的块

    优点:支持随机访问、顺序存取速度快

    缺点:不方便文件扩展、会产生外碎片

  • 链接分配

    每个文件对应一个磁盘块链表,每个磁盘块有指向下一个磁盘块的指针

    优点:方便文件扩展、无碎片

    缺点:不支持随机访问、磁盘块指针占用空间、存取速度慢、可靠性差

  • 索引分配

    每个文件建立一张索引表,放在索引块中

    优点:支持随机访问、方便文件扩展、无碎片

    缺点:索引表占用空间

三种磁盘分配方式中,FCB如何给出文件在磁盘上的物理位置

连续分配:FCB记录了文件起始块号和长度,文件物理位置=起始块号+逻辑块号

链接分配:FCB记录了文件起始块号和结束块号,从起始块开始访问,每个磁盘块都有指向下一个磁盘块的指针,直到访问到结束块

索引分配:FCB记录了索引块所在的物理块号,访问该物理块读取索引表,得到各个逻辑块对应的物理块号

FAT工作原理 链接分配中引入FAT的优点

每个磁盘建立一张文件分配表FAT,行号对应块号;每个FAT表项中存放对应磁盘块的下一块链接指针

支持随机访问

空闲存储空间管理

  • 连续空闲空间管理

    空闲区列表,每一项记录空闲区起始块号和空闲块数量

  • 空闲块链

    空闲块组成链表,指针放在空闲块中

  • 成组空闲块链

    每组100个空闲块,第一组索引在内存中,下一组索引在每组最后一块

  • 位图

    连续存储空间,每位对应一个盘块,存放在内存中

文件系统如何依据用户给出的文件名找到该文件对应的FCB

顺序检索目录表,找到文件名对应的目录项,该目录项就是FCB

文件共享的途径

硬连接(基于索引节点)方式中,不同文件的目录项指向同一个索引节点,索引节点中设置一个引用计数变量

软连接(基于符号链接)方式中,由系统生成一个LINK类型文件,包含被共享文件的路径名

如何实现多种文件系统的共存

文件系统的挂载,挂载表记录系统已安装文件系统的类型和指向文件系统的指针,挂载位置为目录节点或独立盘符

虚拟文件系统VFS,抽象出各种文件系统共有的部分,为各种文件系统提供一个统一的操作界面和应用编程接口

操作系统中打开文件的工作过程

使用open系统调用,提供文件存放路径、文件名、操作类型,操作系统在系统文件打开表中查找

  • 该文件已经打开

    检查操作类型是否合法

    在进程文件打开表中为文件分配一个表项,将该表项的指针指向系统文件打开表中该文件对应的一项

    在PCB中为文件分配一个文件描述符fd作为进程文件打开表项的指针,文件打开完成

  • 该文件没有打开

    根据文件存放路径查找相应的目录文件是否在内存中,若不在则装入内存

    从目录中找到文件名对应的目录项,检查操作类型是否合法,得到该文件的FCB在磁盘中的位置

    将该FCB装入内存中的Active Inode中

    在系统文件打开表中为文件分配一个表项,将该表项的指针指向Active Inode中对应的FCB

    在进程文件打开表中为文件分配一个表项,将该表项的指针指向系统文件打开表中该文件对应的一项

    在PCB中为文件分配一个文件描述符fd作为进程文件打开表项的指针,文件打开完成

临界区及其使用准则

进程在并发执行中可以共享系统中的资源,但对临界资源的访问必须互斥进行,一个进程中访问临界资源的代码段为临界区。

临界区的使用准则

  • 空闲让进:无进程处于临界区时,若有进程要求进入临界区应允许进入
  • 忙则等待:有进程处于临界区时,其他试图进入该临界区的进程必须等待
  • 有限等待:有进程等待进入临界区时,它的等待时间应该是有限的
  • 让权等待:等待进入临界区的进程应释放CPU

同步与互斥的异同

相同点

  • 都是并发环境下操作之间的时序关系
  • 不满足条件时线程等待
  • 运行过程中动态判定

不同点

  • 同步在时序上是固定的偏序关系
  • 互斥在时序上只要不同时执行即可

产生死锁的必要条件

  • 互斥:资源一次只能由一个进程使用
  • 非抢占:资源只能在进程完成任务后自动释放
  • 占有并等待:一个进程必须至少占用一个资源,并等待另一资源,且该资源被其他进程占有
  • 循环等待:有一组等待进程{P0, P1, …, Pn},P0等待的资源被P1占有,P1等待的资源被P2占有,……,Pn等待的资源被P0占有

CPU是进程运行必需的资源,为什么进程不会因等待CPU而发生死锁

CPU属于可剥夺性资源。只有不可剥夺资源才会因为竞争资源而产生死锁。

死锁预防思路

  • 破坏互斥条件

    一般不能破坏

    假脱机技术可以将独占设备在逻辑上改造成共享设备

  • 破坏占有并等待条件

    一次性申请需要的所有资源;申请新资源前释放已占有资源

    产生饥饿的概率增加

  • 破坏非抢占条件

    若进程请求资源不成功则回收其占有的所有资源

    一般适用于易保存和恢复的资源

  • 破坏循环等待条件

    将所有资源排序编号,进程只能按序号递增的顺序申请资源

简述银行家算法避免死锁的过程

变量定义

  • Allocation矩阵:当前已分配给各进程的各类资源数目
  • Max矩阵:各进程总共需要的各类资源数目
  • Need矩阵:各进程还需要的各类资源数目
  • Available向量:当前可供分配的各类资源数目
  • Work向量:用于安全检测算法中记录可供分配的各类资源数目
  • Finish数组:用于安全检测算法中记录是否能满足该进程所有资源请求

算法过程

​ 进程Pi提出申请资源的请求Request

  • 检查Request<=Need[i]

  • 检查Request<=Available

  • Allocation[i]=Allocation[i]+Request

    Need[i]=Need[i]-Request

    Available=Available-Request

  • 执行安全性算法

    • Work=Available Finish[:]=false

    • 查找i,使Work>=Need[i]且Finish[i]=false

      • 若找到,则Work=Work+Allocation[i] Finish[i]=true,继续查找

      • 若找不到,检查是否Finish数组全为true

        是则安全,否则不安全

    • 若产生的资源分配状态安全,则满足Request请求;否则不满足,恢复到原来资源分配状态

死锁避免、死锁预防并比较区别

死锁预防:通过破坏产生死锁的四个必要条件之一,严格的防止死锁的出现。是在进程申请资源的层面上进行的,系统预先确定资源分配策略,系统按照策略进行分配。

死锁避免:当进程提出资源申请时系统测试资源分配,仅当能确保系统安全的时候才把资源分配给进程,这样使得系统能一直处于安全状态。是在操作系统分配资源的层面上进行的。

死锁检测和恢复的思路

检测:资源分配图化简后形成环路;死锁检测算法

恢复:资源剥夺法;撤销进程法;进程回退法

阻塞、饥饿、死锁的区别

阻塞:一个正在执行的进程由于I/O请求等事件暂时无法继续执行,将其暂停执行

饥饿:一个进程因调度算法不合理而长时间等待;发生饥饿的进程既可能是阻塞态(长期得不到需要的I/O设备)也可能是就绪态(长期得不到CPU);等待会被释放但不会分配给自己的资源

死锁:多个进程因竞争资源而相互等待;发生死锁的进程一定处于阻塞态;等待永远不会被释放的资源

简述保护的概念

  • 硬件层面

    操作系统分为内核态和用户态,将可能引起损害的机器指令作为特权指令,且只能在内核态下执行特权指令

    操作系统使用定时器防止用户程序陷入死循环

  • 文件管理

    文件保护指避免文件拥有者或其它用户因错误操作使文件受到破坏,有三种方式:口令保护、密码保护、访问控制(每个文件和目录增加一个访问控制列表ACL,记录每个用户名及允许的访问类型)

  • 设备管理

    设备被看作文件,每个设备也会有对应的FCB,当用户请求访问某个设备时,系统根据FCB中的信息判断用户是否有访问权限,来实现设备保护的功能

  • 存储管理

    保护内存使各道作业互不干扰,可以设置一对上下限寄存器或基址寄存器和限长寄存器,当进行地址变换时检查是否出现越界

  • 进程同步

    为保护临界区资源同一时间只能由一个进程访问,可以采用硬件方法:关中断、TestAndSet指令、Swap指令,软件方法:Peterson算法

经典同步问题

m-n-k生产者-消费者问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Semaphore full=0, empty=k, mutex=1;
Item buffer[k];
int in=0, out=0;

producer:
while(1){
P(empty);
P(mutex);
buffer[in] = item;
in = (in+1)%k;
V(full);
V(mutex);
}

consumer:
while(1){
P(full);
P(mutex);
item = buffer[out];
out = (out+1)%k;
V(empty);
V(mutex);
}

读者写者问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Semaphore rw_mutex=1, r_mutex=1, w=1;
int r_count=0;

writer:
while(1){
P(w);
P(rw_mutex);
//writing...
V(rw_mutex);
V(w);
}

reader:
while(1){
P(w);
P(r_mutex);
if(r_count == 0){
P(rw_mutex);
}
r_count++;
V(r_mutex);
V(w);
//reading...
P(r_mutex);
r_count--;
if(r_count == 0){
V(rw_mutex);
}
V(r_mutex);
}

哲学家问题

1
2
3
4
5
6
7
8
9
10
11
12
Semaphore chopstick[5]={1,1,1,1,1}, mutex=1;
Philosopher_i:
while(1){
P(mutex);
P(chopstick[i]);
P(chopstick[(i+1)%5]);
//eating...
V(mutex);
V(chopstick[i]);
V(chopstick[(i+1)%5]);
//thinking...
}

本文作者: 31
本文链接: http://uuunni.github.io/2022/01/15/OSreview/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!