操作系统(复习版本)

第一章 操作系统概述

定义

操作系统是位于硬件层(HAL)之上,所有其它软件层之下的一个系统软件,是管理系统中各种软硬件资源,方便用户使用计算机系统的程序集合。

简言之,位于软件层之下,硬件层之上,整合管理所有软硬件资源,提供给用户方便使用计算机系统的程序集合。

操作系统的发展

手工操作阶段
成批处理阶段
执行系统阶段

多道批处理系统
分时系统
这两种是一道分割线,标志操作系统已经进入完善阶段
实时处理系统 (和分时的区别是,可交互性较差,主要用于服务端,比如订票系统,或者环境监控系统,用于实时的处理反馈的数据)
通用操作系统(整合了前三种较为完善的操作系统的特点)


网络操作系统
分布式操作系统
多处理机操作系统
单用户操作系统
面向对象操作系统
嵌入式操作系统
智能卡操作系统

特性

  • 并发

  • 共享

  • 异步

  • 虚拟

类型(发展阶段类似)

多道批处理操作系统(batch processing system)
分时操作系统(time-sharing system) 
实时操作系统(real time system)
通用操作系统(multi-purpose system) 
单用户操作系统(single user system)
网络操作系统(network operating system)
分布式操作系统(distributed operating system)
多处理机操作系统(multi-processor system)
嵌入式操作系统(embedded operating system)
多媒体操作系统(MultiMedia operating system )
智能卡操作系统(smart-card operating system)

操作系统的运行环境

定时装置
系统栈
特权指令与非特权指令
处理机状态及状态转换
地址映射机构
存储保护设施
中断装置
通道与DMA控制器

定时

时钟分为绝对和间隔,绝对用作记载时间,可修改,文件的修改时间等都根据绝对时间来决定,间隔用于发生中断的记时,到一个间隔时间就进入中断状态,便于切换程序运行。

系统栈

保存中断现场,返回点,参数,局部变量,返回值

处理机状态及状态转换

系统态(管态,核态)

OS运行时的状态,可以执行特权指令,比如置程序状态字,可运行所有指令

用户态 (目态,常态)

用户程序运行所处状态,,只能执行非特权指令,比如计算等,如果要使用特权指令,调用设备等,需要通过中断进入管态

管态 -> 目态(置程序状态字)
目态 -> 管态(中断)

中断

发现中断:

响应中断,将当前运行程序的PSW和PC都压入系统栈,然后根据中断原因,到指定的内存单元取出新的中断向量送到寄存器中,转到相应的中断处理程序。

    当中断发生时,由中断源自己引导处理机进入中断服务程序的中断过程称为向量中断。

    中断向量就是该类型中断的中断服务例行程序的入口地址和处理器状态字。

通道与DMA控制器

通道
专门负责处理输入输出
具有自己的指令系统
完成CPU委托的输入输出的操作任务
DMA
没有独立指令系统
一次只能传输一个数据块
它能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。

体系结构

image-20230212222149474

第一章习题

1.什么是操作系统?操作系统有哪些特征?

答:操作系统是位于硬件层之上,所有其他软件层之下的一个系统软件,是管理系统中各种软硬件资源,使用户能方便使用计算机系统的程序集合。
操作系统的特征包括:(1)并发性;(2)共享性;(3)异步性;(4)虚拟性。

2.硬件将处理器划分为两种,即管态和目态,这样做会给操作系统的设计带来什么好处?

答:便于设计安全可靠的操作系统。管态和目态是计算机硬件为保护操作系统免受用户程序的干扰和破坏而设置的两种状态。通常操作系统在管态下运行,可以执行所有机器指令;而用户程序在目态下运行,只能执行非特权指令。如果用户程序企图在目态下执行特权指令,将会引起保护性中断,由操作系统终止该程序的执行,从而保护了操作系统。

3.何谓特权指令?如果允许用户进程执行特权指令,会带来什么后果?举例说明。

答:在现代计算机中,一般都提供一些专门供操作系统使用的特殊指令,这些指令只能在管态执行,称为特权指令。这些指令包括停机指令,置PSW指令,中断操作指令(开中断、关中断、屏蔽中断),输入输出指令等。用户程序不能执行这些特权指令。如果允许用户程序执行特权指令,就有可能干扰操作系统的正常运行,甚至有可能使整个系统崩溃。

4.中断向量在计算机中的存储位置是由硬件决定的,还是由软件决定的?

答:中断向量在机器中的存放位置是由硬件决定的。例如,在Intel 80x86 CPU中,内存空间0x00000 ~0x003FF为中断向量空间。

5,中断向量的内容是由操作系统程序决定的,还是由用户程序决定的?

答:由操作系统程序决定的。向量的内容包括中断处理程序的入口地址和程序状态字(中断处理程序运行环境),中断处理程序是由操作系统装入内存的,操作系统将根据装入的实际地址和该中断处理程序的运行环境来填写中断向量。

6,中断向量内的处理器状态字应当标明管态还是目态?为什么?

答:应当标明是管态。该状态由系统初始化程序设置,这样才能保证中断发生后进入操作系统规定的中断处理程序。

7,系统如何由目态转换为管态?如何由管态转换为目态?

答:目态程序被中断时,现行PSW被压入系统栈,中断向量PSW被送入寄存器。由于后者状态位为管态,系统状态由目态转换为管态。
当处于管态的中断处理程序执行完且没有嵌套中断时,将系统栈中的PSW弹出送入寄存器。由于后者状态位为目态,即实现了由管态到目态的转换。

8,中断与程序并发之间的关系是什么?

答:中断是程序并发的前提条件。如果没有中断,操作系统不能获得系统控制权,也就无法按照调度算法对处理器进行重新分配,一个程序将一直运行到结束而不会被打断。

9,根据用途说明“栈”和“堆”的差别。

答:栈是一块按后进先出(Last In First Out,LIFO)规则访问的存储区域,用来实现中断嵌套和子程序嵌套(保存调用参数和返回断点)。
堆虽然是一块存储区域,但是对堆的访问是任意的,没有后进先出的要求,堆主要用来为动态变量分配存储空间。

10.何谓系统栈?何谓用户栈?系统栈有何用途?用户栈有何用途?

答:系统栈是内存中属于操作系统空间的一块固定区域,其主要用途为:(1)保存中断现场,对于嵌套中断,被中断程序的现场信息被依次压入系统栈,中断返回时逆序弹出;(2)保存操作系统子程序之间相互调用的参数、返回值、返回点,以及子程序(函数)的局部变量。
用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序之间相互调用的参数、返回值、返回点,以及子程序(函数)的局部变量。

11.为何无法确定用户堆栈段的长度?

答:用户堆栈段的长度主要取决于两个因素:(1)用户进程(线程)中子程序(函数)之间的嵌套调用深度;(2)子程序参数和局部变量的数量及类型;(3)动态变量的使用。这些在进程(线程)运行前无法确定,由此导致用户堆栈段的长度无法预先准确确定。

12.为何堆栈段的动态扩充可能导致进程空间的变迁?

答:堆栈段的扩充需要在原来进程空间大小的基础上增添新的存储区域,而且通常要求新的存储区域是原来存储区域的连续区域。如果原来存放位置处的可扩展区域已经被其他进程占用,则需要将整个进程空间搬迁到另外一个区域,以实现地址空间扩展要求。

13.何谓并行?何谓并发?在单处理器系统中,下述并行和并发现象哪些可能发生,哪些不会发生?(1)进程与进程之间的并行;(2)进程与进程之间的并发;(3)处理器与设备之间的并行;(4)处理器与通道之间的并行;(5)通道与通道之间的并行;(6)设备与设备之间的并行。

答:所谓并行是指在同一时刻同时进行,进程并行需要多处理器的支持;所谓并发,是指在一段时间内,多个进程都在向前推进,而在同一时刻,可能只有一个进程在执行,多个进程轮流使用处理器。
在单处理器系统中,不可能发生的并行现象是:(1)进程与进程之间的并行。
在单处理器系统中,可能发生的并行和并发现象如下:(2)进程与进程之间的并发。例如,在 Windows 操作系统中,MP 3 播放进程和 Word 字处理进程可以并发执行,这样用户就可以边听音乐边写文章了。(3)处理器与设备之间的并行。例如,当处理器进行科学运算时,打印机可以打印文档。(4)处理器与通道之间的并行。通道程序的执行可与处理器的操作并行。(5)通道与通道之间的并行。通常一个系统中有多个通道,这些通道可以并行地执行相应的通道程序。(6)设备与设备之间的并行。例如,打印机打印文档时,磁带机在输入数据。

14,何谓作业?它包括哪几个部分?各个部分的用途是什么?

答:所谓作业是指用户要求计算机系统为其完成的计算任务的集合。一个作业通常包括程序、程序所处理的数据以及作业说明书,程序用来完成特定的功能,数据是程序处理的对象,作业说明书用来说明作业处理的步骤和控制意图。15,试述批处理操作系统与分时操作系统的差别。答:批处理系统采用脱机操作模式,追求系统效率,界面是作业控制语言(JCL);分时系统采用联机操作模式,追求交互性,界面是交互终端命令或GUI。

15,试述批处理操作系统与分时操作系统的差别。

答:批处理系统采用脱机操作模式,追求系统效率,界面是作业控制语言(JCL);分时系统采用联机操作模式,追求交互性,界面是交互终端命令或GUI。

16,从透明性和资源共享两个方面说明网络操作系统与分布式操作系统之间的差别。

答:从透明性上看,分布式操作系统优于网络操作系统。在网络操作系统中,用户能够感觉在本地。分布式操作系统掩盖了资源在地理位置上的差异。到所访问的资源是在本地还是在异地;而在分布式操作系统中,用户感觉不到所访问的资源是否在本地。分布式操作系统掩盖了资源在地理位置上的差异。
从资源共享上看,分布式操作系统比网络操作系统能够共享更多的资源。在网络操作系统中,一个计算任务不能由一台主机任意迁移到另外一台主机上运行;而在分布式操作系统中,所有作业都可以由一台主机任意迁移到另外一台主机上处理,即可实现处理器和存储资源的共享,从而达到整个系统的负载平衡。

17.为什么构成分布式系统的主机一般都是相同的或兼容的?

答:这样更有利于进程的动态迁移。如果主机不兼容,则在一台主机上能够运行的进程,因所用指令系统不同在另一台主机上可能无法运行,导致进程难以在不同主机之间迁移,使得分布式操作系统难以实现负载平衡。

18.为什么嵌入式操作系统通常采用微内核结构?微内核结构包括哪些内容?

答:嵌入式操作系统与一般操作系统相比具有比较明显的差别:(1)嵌入式操作系统规模一般较小。因为其硬件配置一般较低,而且对操作系统提供的功能要求也不高;(2)应用领域差别大。对于不同应用,其硬件环境和设备配置情况有着明显的差别。所以,嵌入式操作系统一般采用微内核(micro kernel)结构。微内核包括如下基本成分:(1)处理器调度;(2)基本内存管理;(3)通信机制;(4)电源管理。在这些基本成分之上可进行扩展,以适应不同的应用目标。

19,微内核结构有哪些优点和缺点?

答:微内核结构的明显优点是可靠性高,可移植性好,适用范围广。缺点是效率低,因为许多系统功能(如文件系统)被放置在核外,调用这些功能会导致两次上下文切换。
  1. 操作系统为用户和上层软件提供哪种界面形式?相应的界面形式适用于哪种应用环境?答:界面形式包括:
(1)交互终端命令或 GUI;(2)作业控制语言;(3)系统调用命令。交互终端命令或GUI适合动态编辑和调试程序,作业控制语言适合计算量大的程序,系统调用命令是,应用程序与操作系统交互的界面。

第二章 进程、线程与作业

单道程序设计的缺点

处理机利用率低
设备利用率低
内存利用率低

多道程序设计的提出

提高系统效率(吞吐量)

image-20230508174838290

加同时运行程序的道数可以提高资源利用率,从而提高系统效率,但道数应与系统资源数量相当。
道数过少,系统资源利用率低。
道数过多,系统开销(system overhead)增大,程序响应速度下降。

处理机资源的管理
  程序个数>处理机个数(如何分配?)
存储资源的管理
  地址空间的相对独立性、共享性
  内存、外存(swap space)的分配与去配
设备资源管理
  分配策略 

并发与并行

并发在宏观上是多道程序一起执行,但是微观上是共享同一个处理机,程序交替执行

并行是真正意义上的程序一起执行,

进程

可参与并发执行的程序称为进程,进程是具有一定独立功能的程序关于一个数据集合的一次运行活动。

进程的状态

运行态(RUN): 占有CPU正在向前推进
就绪态(READY): 具备运行条件,但未得到CPU
等待态/挂起态(WAIT):不具备运行条件,等待某一事件发生
就绪->运行:获得处理机
运行->就绪:时间片用完或高优先级进程剥夺处理机
运行->等待:申请资源未得到,启动IO,实际上是被调度(抢夺)了,暂时不分配资源
等待->就绪:得到资源

状态转换图:

image-20230508175257105

image-20230508175317106

PCB块

标志进程存在的数据结构,其中保存系统管理进程所需的全部信息

进程标识(pid) :整数 家族联系
进程状态 程序地址
现场信息 打开文件
调度参数 消息队列指针
用户标识(uid) :整数 进程队列指针
资源使用情况

一个PCB实际上标识着一个进程,保存着该进程运行的所有相关内容

进程的组成和上下文

进程控制块+程序

程序包含代码和数据等

PCB中存放着程序在内存中的位置和在硬盘中的位置,方便定位调用

进程的物理实体与支持进程运行的物理环境统称为进程上下文

进程的程序被称为进程的映像,这个东西是相对静态的,一个存放在硬盘中的映像可以启动多个进程

系统进程/守护进程与用户进程

系统进程通常是一个无限循环的程序,运行操作系统程序,完成一些功能,也被称为是守护进程。运行于管态,可以执行特权指令。

运行操作系统程序,完成系统管理(服务)功能.
完成的任务相对独立和具体,在生存周期不变,通常对应一个无限循环程序,系统启动后一直存在,直到系统关闭。运行于管态

用户进程运行用户程序,直接为用户服务。

运行用户(应用)程序,为用户服务。
在操作系统之上运行的所有应用程序称为用户进程

特征:

并发性:可以与其它进程一道向前推进;
动态性:动态产生、消亡,生存期内状态动态变化;
独立性:一个进程是调度的基本单位;
交互性:同其他的进程可能发生相互作用;
异步性:进程以各自独立,不可预知的速度向前推进;
结构性:每个进程有一个PCB。

进程间相互联系与相互作用

相互联系

  相关进程
    同一家族的进程
    可以共享文件,需要相互通讯,协调推进速度…
    父进程可以监视子进程,子进程完成父进程交给的任务。
  无关进程
    没有逻辑关系、同时执行的进程。
    有资源竞争关系,互斥、死锁。

相互作用

直接相互作用:发生在相关进程之间,不需要通过媒介而发生的相互作用  互相发送消息

间接相互作用:发生在任何进程之间,需要通过媒介而发生的相互作用   抢夺一个资源

进程与程序的联系与差别

联系

进程包括一个程序
进程存在的目的就是执行这个程序

差别

程序静态,进程动态
程序可长期保存,进程有生存期
一个程序可对应多个进程,一个进程只能执行一个程序

线程

概念以及跟进程间的对比

进程的上下文涉及的内容多,切换需要的开销大,且进程间的相互关心并不紧密,耦合性差,因此引入线程的概念,减少我们需要并发操作时,进程间的上下文切换

Multi-threading
同一进程中包含多个线程
上下文只涉及寄存器和用户栈,切换速度快
相关线程之间涉及相同的代码或数据,通讯方便、快捷

线程:又称轻进程,是进程中一个相对独立的执行流。

进程是资源分配单位
线程是执行单位,即CPU的调度单位

优点:

上下文切换速度快(包括程序和数据在内的地址空间不变)
系统开销小:创建线程
通讯容易(共享数据空间)

线程控制块(TCB)

标志线程存在的数据结构, 其中包含对线程管理需要的全部信息

线程标识
线程状态
调度参数
现场(通用寄存器,PC,SP)

存放的位置:

用户级线程:目态空间
核心级线程:系统空间

用户级线程:

实现方法:
基于library函数,系统不可见
线程创建、撤销、状态转换由library函数在目态完成
TCB在用户空间,因此系统调度以进程为单位,每个进程一个系统栈
优点:
不依赖于操作系统,调度灵活
同一进程中的线程切换不需进入OS,切换速度快
缺点:
同一进程中多个线程不能真正并行
由于调度在进程级别,一个线程进入OS受阻,进程中其它线程不能执行

系统级线程:

实现方法:
基于系统调用由OS创建
创建、撤销、状态转换由操作系统完成
TCB保存在OS空间,线程是CPU调度的基本单位,每个线程一个核心栈
优点:
多cpu环境中,同一进程内多线程可以并行执行
一线程进入核心等待,其它线程仍可执行
缺点:
系统开销大,同一进程内多线程切换需进入OS,速度慢

混合线程:

User level thread:用户级
	由Lib程序支持(创建.调度)
Light weighted process(LWP): 轻进程
	由Lib程序支持
	每个task至少一个LWP
	用戶级别线程与LWP可以多对多
		只有与LWP相联系的用户线程向前推进
Kernel level thread:
	由kernel 支持
	每个核心线程与唯一一个LWP对应
	核心线程可与CPU多对多,可对一

轻进程也就是普通线程,由系统库产生,对用户线程和系统线程都可见,一个用户线程可调用多个轻进程,一个轻线程与一个系统线程联系,方便了用户线程与系统线程的联系。为方便,一个task必须包含一个轻进程,否则用户线程与系统线程彼此无法联系。

因为用户进程的调度是在进程级别,进程未被调度,该进程下的所有用户线程都没法被调度,且无法并行,不能共享多个CPU资源,因为进程被调度一般只给一个CPU资源。

加入了系统线程后,可以占用多个CPU资源进行并行。

image-20230213230411978

线程的应用

内在的多控制流,具有合作性质,需共享内存
多线程优于多进程
提高处理机与设备的并行性
多处理机环境

提高处理机利用率,加快进程推进速度
采用多线程的条件:同一进程中的多个线程具
有相同的代码和数据,这些线程之间或者是合
作的(执行代码的不同部分),或者是同构的
(执行相同的代码)

例子:
Word字处理(不同代码)
交互编辑(T1)
词法检查(T2)
定时保存(T3)


HTTP server(相同代码)
对每个http请求,pop up一个线程

作业

用户要求计算机系统为其完成的计算任务集合。

作业步

作业处理过程中一个相对独立的步骤
一般一个作业步可由一个进程完成
某些作业步之间可以并行

作业分类

批处理作业
交互式作业

批处理作业

类似于进程控制块,作业也有自己的控制块JCB

作业控制块是标志作业存在的数据结构,其中包含系统对作业进行管理所需要的全部信息

作业由假脱机输入程序控制进入输入井,经操作系统的作业调度程序选择进入内存,并为其建立作业控制进程。作业控制进程解释作业说明书的雨具,根据作业步的要求为其建立进程。

交互式作业

分时用户的一次登录

帐户管理
/etc/passwd文件
(用户名,口令,用户根目录,同组用户,注册资金…)

创建与撤销

创建:
用户提供(用户名,口令,资金)
系统操作员建立(根目录/usr/zhang, 填写passwd文件)


撤销:
删除该用户目录及所有文件
在passwd文件中清除对应entry

进程线程与作业

作业与进程
作业进入内存后变为进程
一个作业通常与多个进程相对应
进程与线程
不支持多线程的系统,可视为单线程进程
一个进程一般包含多个线程,至少包含一个线程

JAVA线程

四种基本状态

New:新建线程
Runnable:可运行状态
Blocked:封锁状态
Dead:终止状态. 

Linux线程

线程进程内部表示统一,通过fork和clone创建,fork创建出来的进程会共享父进程代码的下一句语句,clone出来的进程可以指定一个函数执行。

第二章习题

为何引入多道程序设计?在多道程序系统中,内存中作业的道数是否越多越好?请说明原因。

答:引入多道程序设计技术是为了提高计算机系统资源的利用率。在多道程序系统中,内存中作业的道数并非越多越好。一个计算机系统中的内存、外设等资源是有限的,只能容纳适当数量的作业,作业道数增加将导致对资源的竞争激烈,进程切换频繁,系统开销增大,从而导致作业的执行缓慢,系统效率下降。

2.多道程序设计带来哪些问题?如何解决?

答:(1)处理器资源管理:将CPU资源按照调度原则分派给可以运行的程序;(2)内存资源管理:进程空间既相互独立,又可共享;(3)设备资源管理:多个进程使用同一个设备时不发生冲突。

3.什么是进程?进程具有哪些主要特性?试比较进程与程序之间的相同点与不同点。

答:进程是具有一定独立功能的程序关于一个数据集合的一次运行活动。
进程具有以下主要特性:(1)并发性:可以与其他进程一道在宏观上同时向前推进。(2)动态性:进程是执行中的程序。此外,进程的动态性还体现在如下两个方面:首先,进程是动态产生、动态消亡的。其次,在进程的生存期内,其状态处于经常性的动态变化之中。(3)独立性:进程是调度的基本单位,它可以获得处理器并参与并发执行。(4)交往性:进程在运行过程中可能会与其他进程发生直接或间接的相互作用。(5)异步性:每个进程都以其相对独立、不可预知的速度向前推进。(6)结构性:每个进程都有一个进程控制块PCB。
进程和程序的相同点:程序是构成进程的组成部分之一,一个进程存在的目的就是执行其所对应的程序,如果没有程序,进程就失去了其存在的意义。
进程与程序的不同点:(1)程序是静态的,而进程是动态的;(2)程序可以写在纸上或在某一存储介质上长期保存,而进程具有生存期,创建后存在,撤销后消亡;(3)一个程序可以对应多个进程,但一个进程只能对应一个程序。例如,一组学生在一个分时系统中进行C语言实习,他们都需要使用C语言的编译程序对其源程序进行编译,为此,每个学生都需要有一个进程,这些进程都运行 C 语言的编译程序。另外,一个程序的多次执行也分别对应着不同的进程。

4.有人说,用户进程所执行的程序一定是用户自己编写的。这种说法对吗?如果不对,试举例说明之。

答:这种说法不对。例如,C语言编译程序以用户进程身份运行,但 C 语言编译程序一般并不是用户自己编写的。此外,还有调试程序、字处理程序等工具软件。

5,什么是进程上下文?进程上下文包括哪些成分?哪些成分对目态程序是可见的?

答:进程是在操作系统支持下运行的,进程运行时操作系统需要为其设置相应的运行环境,如系统堆栈、地址映射寄存器、打开文件表、PSW与PC、通用寄存器等。在UNIX System V中,进程的物理实体与支持进程运行的物理环境合称为进程上下文(process context)。进程上下文包括以下三个组成部分。(1)用户级上下文。是由用户进程的程序块、用户数据块(含共享数据块)和用户堆栈组成的进程地址空间。(2)系统级上下文。包括进程控制块、内存管理信息、进程环境块,以及系统堆栈等组成的进程地址空间。(3)寄存器上下文。由程序状态字寄存器、各类控制寄存器、地址寄存器、通用寄存器、用户堆栈指针等组成。其中,用户级上下文和部分寄存器上下文对目态程序是可见的。

6,进程一般具有哪3个主要状态?举例说明状态转换的原因。

答:进程在其生存期内可能处于如下3种基本状态之一。(1)运行态(run):进程占有处理器资源,正在运行。显然,在单处理器系统中任一时刻只能有一个进程处于此种状态。(2)就绪态(ready):进程本身具备运行条件,但由于处理器的个数少于可运行进程的个数,暂未投入运行,即相当于等待处理器资源。
(3)等待态(wait):也称挂起态(suspended)、封锁态(blocked)、睡眠态(sleep)。进程本身不具备运行条件,即使分给它处理器也不能运行。进程正等待某一个事件的发生,如等待某一资源被释放、等待与该进程相关的1/0传输的完成信号等。进程的3 个基本状态之间是可以相互转换的。具体地说,当一个就绪进程获得处理器时,其状态由就绪变为运行;当一个运行进程被剥夺处理器时,如用完系统分给它的时间片、出现更高优先级别的其他进程,其状态由运行变为就绪;当一个运行进程因某事件受阻时,如果所申请资源被占用、启动1/0传输未完成,其状态就由运行变为等待;当所等待事件发生时,如果得到申请资源、1/0传输完成,其状态就由等待变为就绪。

7,对于时间片轮转进程调度算法、不可抢占处理器的优先数调度算法、可抢占处理器的优先数调度算法,分别画出进程状态转换图。

image-20230509122549103

8.有几种类型的进程队列?每种类型各应设置几个队列?

答:系统中的进程队列通常分为如下三类。(1)就绪队列:整个系统只有一个就绪队列。所有处于就绪状态的进程按照某种组织方式排在这一队列中,进程入队列和出队列的次序与处理器调度算法有关。在某些系统中,就绪队列可能有多个,用以对就绪进程进行分类,以方便某种调度策略的实施。(2)等待队列:每个等待事件有一个等待队列。当进程等待某一事件时,进入与该事件相关的等待队列;当某事件发生时,与该事件相关的一个或多个进程离开相应的等待队列,进入就绪队列。(3)运行队列:在单 CPU系统中只有一个运行队列,在多 CPU 系统中每个 CPU 各有一个运行队列。每个队列中只有一个进程,指向运行队列头部的指针被称为运行指示字。

9,什么是进程控制块?进程控制块一般包含哪些内容?

答:进程控制块是标识进程存在的数据结构,其中包含系统管理进程所需要的全部信息。

image-20230509122732189

10,什么是线程?图示进程与线程之间的关系。

答:进程内一个相对独立的执行流称为线程。进程与线程之间的关系如图2.2所示。

image-20230509122758487

11,试比较进程状态与该进程内部线程状态之间的关系。

答:对于用户级别线程,若同一进程中的多个线程中至少有一个处于运行态,则该进程的状态为运行态;若同一进程中的多个线程均不处于运行态,但是至少有一个线程处于就绪态,则该进程的状态为就绪态;若同一进程中的多个线程均处于等待态,则该进程的状态为等待态。

12.什么是线程控制块?线程控制块中一般包含哪些内容?

答:线程控制块(Thread Control Block,TCB)是线程存在的标志,其中保存有系统管理线程所需要的全部信息。一般TCB中的内容较少,因为有关资源分配等多数信息已经记录于所属进程的PCB中。TCB中的主要信息包括线程标识、线程状态、调度参数、现场、链接指针。其中,现场信息主要包括通用寄存器、指令计数器PC以及用户栈指针。对于操作系统支持的线程,TCB中还应包含系统栈指针。

13,同一进程中的多个线程有哪些成分是共用的,哪些成分是私用的?

答:同一进程中的多个线程共享进程获得的主存空间和资源,包括代码区、数据区、动态堆空间。线程的私有成分包括:(1)线程控制块;(2)一个执行栈;(3)运行时动态分给线程的寄存器。

14,试比较用户级别线程与核心级别线程在以下几个方面的差别和各自的优、缺点。(1)创建速度;(2)切换速度;(3)并行性;(4)线程控制块的存储位置。

答:用户级别线程由系统库支持。线程的创建、撤销以及线程状态的变化都由库函数控制并在目态完成,与线程相关的控制结构线程控制块保存在目态空间并由运行系统维护。由于线程对操作系统不可见,系统调度仍以进程为单位,核心栈的个数与进程个数相对应。用户级别线程的优点在于:(1)线程不依赖于操作系统,可以采用与问题相关的调度策略,灵活性好;(2)同一进程中的线程切换不需进入操作系统,因而实现效率较高。缺点在于:(1)同一进程中的多个线程不能真正并行,即使在多处理器环境中;(2)线程对操作系统不可见,调度在进程级别。如果某进程中的一个线程通过系统调用进入操作系统受阻,那么该进程的其他线程也不能运行。核心级别线程通过系统调用由操作系统创建,线程的控制结构TCB保存于操作系统空间,线程状态转换由操作系统完成,线程是CPU调度的基本单位。另外,由于系统调度以线程为单位,操作系统还需要为每个线程保持一个核心栈。核心级别线程的优点是并发性好,在多CPU环境中同一进程中的多个线程可以真正并行执行。缺点是线程控制和状态转换需要进入操作系统完成,系统开销比较大。

15,试比较Linux系统中fork()与clone()两个系统调用之间的差异。

答:fork()用于创建子进程,子进程与父进程具有各自独立的地址空间。子进程地址空间内容通过从父进程处复制得到。clone()用于创建子进程(线程),父子之间可以共享存储空间。

16,何谓作业?何谓作业步?作业何时转变为进程?

答:作业是早期批处理系统引入的一个概念。用户要求计算机系统为其完成的计算任务的集合称为作业,分时用户在一次登录后所进行的交互过程也常被看做一个作业。一般来说,作业是比进程大的一个概念。一个作业通常包含多个计算步骤,作业中一个相对独立的处理步骤称为一个作业步。当作业被作业调度程序选中并调入内存时,将按作业步创建相应进程。作业步骤之间具有顺序或并发关系。一个作业步通常可以由一个进程来完成,这样一个作业在内存处理时通常与多个进程相对应,即作业与进程具有一对多的关系。
  1. 试分析作业、进程、线程三者之间的关系。
答:一个作业被调入内存执行时可能要为其创建多个进程,进程是资源分配的基本单位,一个进程可能对应若干个线程,线程是处理器调度的基本单位。

18.何谓系统开销?试举 3 个例子说明之。

答:运行操作系统程序,实现系统管理所花费的时间和空间称为系统开销。例如,操作系统的内核要占用内存空间,页面调度时需占用设备资源并消耗处理器时间,进程切换时也要占用处理器时间。

第三章 中断与处理机调度

中断

处理机在运行过程中,出现了某一事件,必须中止正在运行的程序,转去处理这个事件,然后再返回原来运行的程序,这一过程称为中断。

中断装置

发现并响应中断的硬件机构
识别中断源,当有多个中断源时,按紧迫程度排队;
保存现场;将正在执行的程序的PSW及PC压入系统栈
引出中断处理程序。

中断源和中断字

中断源
引起中断的事件。
中断寄存器
保存与中断事件相关信息的寄存器。
中断字
中断寄存器的内容。协助中断处理程序进一步分析触发中断的原因并采取相应的处理措施。

例:IO中断:设备状态寄存器。

中断类型和中断向量

中断向量:中断处理程序的运行环境与入口地址(PSW,PC)
每类中断事件有一个中断向量,
中断向量的存放位置是由硬件规定的,存放在内存的固定单元处
中断向量的内容是OS在系统初始化时设置好的。

image-20230509125813595

中断嵌套与系统栈

一般原则:
高优先级别中断可以嵌入低优先级中断
实现方法:
中断响应后立即屏蔽不高于当前中断优先级的中断源。

处理步骤

步骤:
(1)发生溢出中断
(2)保存旧PSW和PC
(3)取中断向量
(4)转到中断处理程序
(5)访问中断续元表(假定非0)
(6)系统栈中现场转移到用户栈
(7)中断续元入口送寄存器(OS中断处理完成)
(8)执行中断续元
(9)用户栈PSW和PC送寄存器
(10)返回中断断点

太多了,烦,开摆,直接处理机调度算法

处理器调度

调度算法的评价指标

  • CPU利用率 ; (max)
  • 吞吐量 ; (max)
  • 周转时间 ; (min)
  • 响应时间 ; (min)
  • 系统开销 ; (min)

周转时间为 等待时间+处理的时间,也就是执行结束的时间 - 进入等待队列的时间

平均周转时间为 所有作业的周转时间之和 / 作业数

带权周转时间为 W = T/R 周转时间为T 运行时间为R

平均带权周转时间为 所有作业的带权周转时间之和 / 作业数

先到先服务算法(FCFS)

由名,先到的进程先执行,直至执行完执行下一个先到的进程,需要画出甘特图!

最短作业优先(SJF)

由名,当前进程执行完,CPU空闲时,选择需要执行的时间最短的作业执行,画出甘特图、

最短剩余时间优先(SRTN)

其实跟最短作业优先差不多,但是他是可剥夺调度算法,当一个新进程到达时,即使处理机上有进程在运行,也会先比较当前新进的进程的执行时间和当前执行中的进程的剩余时间,如果新到的进程的执行时间较短,那么会剥夺处理机,让新到的进程先执行。后面都是一样,处理完这个进程就选择最短剩余时间的进程上处理机。

最高响应比优先算法(HRN)

先到先服务和最短作业优先算法的折中

响应比的计算公式:

RR = (BT + WT) / BT = 1+ WT/BT

RR 响应比 BT为CPU阵发时间

WT为等待时间

对于同时到达的任务,处理时间较短的任务将会被优先调度,等待时间长的WT会逐渐增长,提高权重

image-20230222154748153

多级调度

高级调度

将作业调度到内存中

中级调度

内存不足时,将内存中的一块调度到外存,需要时重新从外存中调度到内存

低级调度

从内存调度到寄存器,上处理机执行,前面所说的处理机调度就是低级调度,分配CPU资源

实时调度

最早截止期优先调度(EDF)

运行时间短的先上处理机执行。可抢占

可调度的充分条件是 : 累加起来的 ci/ti 要小于等于1

说明在平均周期时间中,能够在一个平均时间块执行完成,不会占满所有时间却有任务在当前周期的时间片未执行完,进入到下一个周期的执行

image-20230509171813087

单调速率调度(RMS)

非剥夺式,选择当前等待队列中,周期最短的任务上处理机

image-20230509171949808

这玩意是真不大好算:

n n(2^(1/n)-1)
1 1.0
2 0.828
3 0.780
4 0.757
5 0.743
6 0.735
... ...
ln 2 = 0.693

第三章习题

28.对于下述处理器调度算法分别画出进程状态转换图。

(1)时间片轮转算法;

image-20230509172747302

(2)可抢占处理器的优先数调度算法;

image-20230509172812401

(3)不可抢占处理器的优先数调度算法。

image-20230509172833718

32.设有按P、P2、P、P次序到达的 4个进程,CPU阵发时间如表 3.1 所示,采用先到先服务算法和最短作业优先算法,画出 Gantt图,并计算各自的平均等待时间。

image-20230509172946869

image-20230509220238008

周转时间 = 截止时间 - 进入等待队列的时间 = 等待时间 + 运行时间

因为运行时间已知,进入等待队列的时间已知,在我们画出甘特图后,结束时间也已知,因此我们可以先算出比较方便计算的周转时间,然后算出等待时间。


然后是最短作业优先,因为这玩意也有抢占式的,但是题目没说,默认是非抢占式。而且抢占式的叫法一般是最短剩余时间优先。

image-20230509220725501

进入等待队列的时间其实都是0时刻,直接按照他们的在一开始排列好执行的顺序即可。

P3最短,然后P2。。。。

然后这题的思路也跟上题一样 等待时间 = 周转时间-运行时间

32,设有周期性实时任务集合如表3.2所示,用最早截止期优先算法和速率单调调度算法是否可以调度?画出相应的Gantt 图。

image-20230509221151493

先回忆下实时任务的最早截止期优先和速率单调是怎样的

最早截止期优先是根据Ci的时间大小来安排调度的,也就是单次CPU的阵发时间,ci小的可以先执行,且是可抢占式的。也就是如果新周期加入的任务的ci更小,ci是跟当前正在处理的任务的剩余时间相比较的,则直接抢夺处理机,跟前面的处理机调度算法低级调度的最短剩余时间优先类似。

然后可调度的条件是 ci/ti的累加和 是小于等于1的,为什么要这个公式前面概念有讲,翻。

image-20230509222427044

ci是C最小,然后A然后B,根据这个画出甘特图,

第二个速率单调是根据ti的时间来调度的,属于不可剥夺,ti越小越优先执行,

判断可调度的条件是 ci/ti的累加和 <= n(2^(1/n)-1)

image-20230509222703016

36,设有4个作业J,J2、J、J4,其提交时间与运行时间如表3.3所示。试采用先到先服务、最短作业优先、最高响应比优先调度算法,分别求出各作业的周转时间、带权周转时间,以及所有作业的平均周转时间、平均带权周转时间。

image-20230509222841910

这题也是处理机调度算法的题目

先到先服务就是先来的作业先抢占处理机,然后最短作业优先就是执行完一个任务,当前等待队列最短处理时间的作业先上处理机,然后是最高响应比优先,响应比的算法是(处理时间+等待时间)/ 处理时间,有点像周转时间/处理时间,带权周转时间?。。。

先到先服务:

image-20230509224343083

甘特图没啥好说的,J1到J4 ,

周转时间就是执行完成时间 - 到达时间

带权周转时间就是 周转时间/运行时间

这里带权周转时间需要加上单位 min

平均的话就是直接/作业数咯

剩下的就是按照规则来

但是最高响应比优先需要注意的是,每次执行完一个任务,都得重新计算当前等待队列的作业的响应比,因为响应比是要更新的。

image-20230509224710643

带权周转时间和平均带权周转时间记得带单位

然后过第二遍的时候纸上再写一遍吧,思路先记住。

第四章 互斥、同步与通讯

这章主要的是画出前驱图,然后会同步操作,会根据场景设置互斥变量,然后同步是先V后P,互斥是先P后V。

同步变量一般是设置为0,然后后执行的进程会被P锁住,直到另一个前执行的进程V之后,同步变量才会大于等于0,然后被P锁住的需要后执行进程能够解开阻塞,继续往下执行。

互斥变量一般是设置的资源数,在消费这个资源的时候,需要先P锁住这个资源,然后进入临界区,执行完临界区的代码后,在退出区V这个资源,归还。

P、V操作都是原语,原语是通过关中断指令,让其不可被打断,然后执行原语的代码,然后执行完代码使用开中断指令,这样保证了原语执行的原子性。

四个实现软件互斥算法的原则

忙则等待 临界区资源被占需要在外面等待,不能进去执行代码

空闲让进 临界区空闲的时候得让它进去执行

有限等待 等待不能无限期等待,不然会饿死

让权等待 当进程不能进入临界区的时候,要放弃占用处理机,防止无意义的浪费资源,类似于休眠

如果是CAS的那种自旋锁模式的话,就会一直占用处理机的资源了。

然后还有几种算法:

单标志法,双标志先检查法,双标志后检查法,Peterson算法,但是其实都会违背四个原则中的一个或多个,因此最完美的实现其实还是硬件层面来搞,用开/关中断执行来实现

实现互斥的硬件算法

image-20230224212020090

image-20230224212319911

尝试加锁,然后返回原来是否有锁,如果没锁说明这个进程加锁成功了,直接进入临界区,如果原来有锁,说明我们新加的锁其实是无效的,没有加锁成功,因此继续循环。

image-20230224213628096

执行完一个进程后,会把lock置为false,这时候交换就会让old变成false了,其实也是加锁的想法。但是因为是硬件实现的,因此他们的交互,也就是加锁和解锁的过程,是原子性的。

信号量机制

目前为了方便都是直接用信号量机制了。

整型信号量是单纯用一个变量来标识资源数,但是这样会变成多个进程抢这个资源,如果运气不好,一个进程一直没抢到会饿死。

然后就提出了一个记录型信号量,在标识资源数的基础上,封装成一个数据结构,然后变量加上一个等待队列,解锁后则唤醒等待队列的一个进程。这样所有进程都能获取到处理机,不容易寄。

然后是关于信号量的几个结论

必须置一次初值,只能置一次初值,初值>=0;
只能执行P操作和V操作,所有其它操作非法。


当s.value>=0时,s.queue为空;
当s.value<0时,|s.value|为队列s.queue的长度;
当s.value初=1时,可以实现进程互斥;
当s.value初=0时,可以实现进程同步。
因为同步需要起作用只会P一次,而互斥进程起作用会P 2次以上

生产者-消费者问题

设置一个互斥变量mutex,对缓冲区互斥访问

然后再设置两个同步变量,一个是S2表示产品数量,也是非空缓冲区的数量,另一个表示空闲缓冲区的数量S1。

缓冲区是环形的

这里有个小技巧,如果是双方操作的变量,且一方只加锁,另一方只做解锁,这个就是同步变量

如果一方加锁使用,然后用完自己解锁,这个是互斥变量

生产者

while(1)
{
	生产一个产品;
	P(mutex);
	P(S1);
	将产品放入缓冲区 buffer[in] = item; in = (in+1)%k;
	V(S2);
	V(mutex);
}

消费者

while(1)
{
	P(mutex);
	P(S2);
	从缓冲区取出产品消费 ,  buffer[out] = item; out = (out+1)%k;
	V(S1);
	V(mutex);
}

读者-写者问题

多个写进程并行,写进程与任何进程都互斥

semphore rw = 1;//表示写进程的互斥

int count = 0; // 读进程数量,实现第一个读进程加锁,最后一个读进程解锁

semphore mutex = 1;//对count 进行互斥访问

写者

while(1)
{
	P(rw);
	写
	V(rw);
}

读者

while(1)
{
	P(mutex);
	count ++;
	if(count == 1)
	{
		P(rw);
	}
	V(mutex);
	读
	P(mutex);
	count --;
	if(count == 0)
	{
		V(rw);
	}
	V(mutex);
}

但是这样会造成一个问题,会让读进程优先,写进程容易饿死,因此还需要增加一个锁,让写者和读者公平的竞争。

semphore x = 1;

写者

while(1)
{
	P(x);
	P(rw);
	写
	V(rw);
	V(x);
}

读者

while(1)
{
	P(x);
	P(mutex);
	count ++;
	if(count == 1)
	{
		P(rw);
	}
	V(mutex);
	读
	P(mutex);
	count --;
	if(count == 0)
	{
		V(rw);
	}
	V(mutex);
	V(x);
}

哲学家进餐问题

使用一个变量,实现互斥的取叉子,然后每次取叉子要取左右两边的,如果左边的叉子在别人那边,因为前面加了互斥变量的锁,会把所有人的取叉子的请求都锁住,因此左边的叉子到位后能直接取出来,不会被别人抢走

设有五个人

semaphore chopstick[5] = {1,1,1,1,1};
semaphore mutex = 1;
Pi(){
	while(1){
		P(mutex);
		P(chopstick[i]); //左边筷子
		P(chopstick[(i+1)%5]); //右边筷子
		干饭
		V(chopstick[i]);
		V(chopstick[(i+1)%5]);
		V(mutex);
	}

}

管程

集中式同步工具:共享变量及其所有相关操作集中在一个摸块中。
优点:
可读性好;
正确性易于保证;
易于修改。
缺点:
不甚灵活,效率略低。

例如java中的sychronize关键字,实现了一个互斥的管程。

就是不需要我们自己管理加锁的变量啥的,只需要使用这个东西即可。

会合

后面倒回来看

第四章习题

18.公共汽车上有司机和前、后门的两个售票员,其活动分别如下。

image-20230510175225078

看题,可以想到用一个同步变量来规定是否可以启动车辆,因为到站后才能开启前门后面,

因为有两个售票员,给这两个售票员加个变量,规定能否开前后门

然后

semphore start = 0;

semphore q = 0;

semphore h = 0;

三个同步变量的意思看上面。

司机:

while(1)
{
	P(start)
	P(start)
	启动车
	走
	停车
	V(q)
	V(h)
}

售票员

关前后门
V(start)//让车车先跑
售票
P(q)or P(h)
开门

前驱图

image-20230510180502259

35,设有父、母、子、女4人,通过一个盘子传递水果,活动内容如下。

image-20230510180700519

盘子只能放一个东西,设置为1

水果开始是没有的,需要一前一后,因此设置为0

semphore plate = 1;

semphore apple = 0;

smephore orange = 0;

如果盘子可以放多个,需要专门设置一个变量来对盘子进行互斥访问,然后可能导致盘子的盛放量变成负数,这里为1就不需要了,因为同步量plate在第二次P时就直接上锁了

父亲:

while(1)
{
	P(plate);
	放苹果
	V(apple);
	V(plate);
}

母亲:

while(1)
{
	P(plate);
	放橘子
	V(orange);
	V(plate);
}

然后儿子:

while(1)
{
	P(apple);
	取苹果
	V(plate);
	吃苹果
}

女儿:

while(1)
{
	P(orange);
	取橘子
	V(plate);
	吃橘子
}

第五章 死锁和饥饿

死锁与饥饿
死锁: indefinite wait.
可察觉
饥饿: not necessarily in wait state.
?
死锁和饥饿都是由于进程竞争资源而引起的 . 

死锁是可以被察觉的,如果资源分配的图是连通图,说明申请的资源是存在有回路,这时就发生了死锁,而饥饿是无法被察觉的。

死锁的类型

竞争资源引起的
进程间通信引起的
其他原因引起的         互相谦让过

死锁的定义

一组进程中的每一个进程,均无限期地等待此组进程中某个其他进程占有的,因而永远无法得到的资源,这种现象称为进程死锁。
定义死锁时刻:
无限等待发生时;
等待发生前(已注定死锁)。

死锁的结论

几个有用的结论:
参与死琐的进程至少有二个;
每个参与死锁的进程均等待资源;
参与死锁的进程中至少有两个进程占有资源;
死锁进程是系统中当前进程集合的一个子集。

死锁的条件

资源独占
不可抢占
保持申请
循环等待

破坏四个条件中的任意一个都可以消除死锁

死锁的处理

死锁预防(deadlock prevention)-静态
死锁避免(deadlock avoidance)--动态
死锁检测(deadlock detection)
死锁恢复(deadlock recovery)

资源分配图

申请边:由进程到资源类;
分配边:由资源实例到进程

例1. P={p1,p2,p3}, R={r1(1),r2(2),r3(1),r4(3)}
E={(p1,r1),(p2,r3),(r1,p2),(r2,p1),(r2,p2),(r3,p3)}

image-20230510210908309

如图,图中的关系是 p1申请r1资源,画出一条申请边,p2申请r3,r1分配给p2,r2分配给p1,r2分配给p2,r3分配给p3,如果此时再来一条,p2申请r2,那么会构成回路 p1->r1->p2->r2->p1,因此p2的申请边不能被画出,申请拒绝,这就是无环路即可无死锁的原理。

再来一个有环路的例子:

image-20230510211204658

此时p2 -> r3 -> p3 -> r2 -> p2 构成了回路,会形成死锁

资源分配图约简

寻找一个非孤立且没有请求边的进程节点pi,若无则算法结束;
去除所有pi的分配边使pi成为一个孤立节点
寻找所有请求边均可满足的进程pj,将pj的请求边全部改为分配边
转步骤1
算法结束时,所有节点均为孤点,则称资源分配图是完全可以约简的,否则为不可完全约简。
系统处于死锁状态的充分必要条件是资源分配图不可完全约简

死锁的预防

对进程有关资源的活动加限制,所有进程遵循这种限制,即可保证没有死锁发生。
优点:简单,系统不需要做什么。
缺点:对进程的约束,违反约束仍可能死锁。


预防方法:
预先分配法;
有序分配法。

这里直接往后跳了,银行家算法

银行家算法中,有两个重要内容 , 一个是资源分配算法,另一个是安全性检测算法。其实就是检测分配完资源后,是否安全状态的算法

然后是鸵鸟算法,直接开摆,重启,没啥好说的

饥饿与饿死

当等待时间给进程的推进和响应带来的明显的影响时,就称发生进程饥饿。
当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时,称该进程被饿死。

例题 过河问题

image-20230510213816182

东边西边的人踩石头 1-8过河,西边过去要1-2-5-6-4-3,图中有标出

因此,12 ,43 是两边需要互斥的资源

两边同时有三个人上去,必定会占用到 12 34,会导致死锁

限定最大过河人数为5人,理想状态下,两个同方向的在56或者78,另外一个方向的3个人

semaphore Smax = 5;
semaphore S1 - S8 = 1;

西岸

P(Smax)
P(S1)
P(S2)
V(S2)
P(S5)
V(S2)
P(S6)
V(S5)
//申请对面一条路,堵住对面,不能让对面到3堵住
P(S3)
P(S4)
V(S6)
V(S4)
V(S3)
V(Smax)
成功过岸

东岸

P(Smax)
P(S3)
P(S4)
V(S3)
P(S7)
V(S4)
P(S8)
V(S7)
//申请对面一条路,堵住对面,不能让对面到3堵住
P(S1)
P(S2)
V(S8)
V(S2)
V(S1)
V(Smax)
成功过岸

还有一个增加并行度的,开摆。大概意思是控制一边极限人数,实现一边站到两块的人数刚好,另一边则可以安排4个人,总共并行度6个人过河

第五章习题

7.设有一个T形路口,其中A、B、C、D处各可容纳一辆车,车行方向如图 5.2 所示,试找出死锁并用有序分配算法消除之。要求资源编号合理。

image-20230510214940667

AB一辆车E方向,D一辆W方向,C一辆S方向,形成死锁

一个三个方向的车车W S E ,然后资源有四个A B C D

然后E方向 B -> A ->D

W方向 D->C

C方向 C ->B -> A

然后 开始

设置ABCD的信号量

semaphore s1 = s2 = s3 = s4 = 1;

W方向

//先申请C。不然容易堵
p(s3)
p(s4)
驶入D
驶入C
V(s4)
驶出
V(s3)

E方向

p(s2)
驶入B
p(s1)
驶入A
V(s2)
P(s4)
驶入D
v(s1)
驶出
v(s4)

S方向

p(s3)
驶入C
P(s2)
驶入B
V(s3)
P(s1)
驶入A
V(S2)
驶出A
V(S1)

9,在银行家算法中,出现如下资源分配情况:

image-20230510215823515

(1)当前状态是否安全?

检测是否符合银行家安全性检测算法

Work = Avaliable = (1,6,2,3)。

先肉眼看哪个能分配的,可分配的为1 6 2 3

然后刚好p0的need满足,那就先分配p0

Finish[0] = false Need[0] = {0,0,1,2} < Work ,Work = Work + Allocation[0] = (1,6,5,5) Finish[0] = true

往下找,1不符合,2不符合,3符合

Finish[3] = false Need[3] = {0,6,5,2} < Work ,Work = Work + Allocation[3] = (1,9,8,7) Finish[3] = true

Finish[4] = false Need[4] = {0,6,5,6} < Work ,Work = Work + Allocation[4] = (1,9,9,11) Finish[4] = true

Finish[1] = false Need[1] = {1,7,5,0} < Work ,Work = Work + Allocation[1] = (2,9,9,11) Finish[1] = true

Finish[2] = false Need[2] = {2,3,5,6} < Work ,Work = Work + Allocation[2] = (3,12,14,15) Finish[2] = true

因此可以找到一个安全序列<p0,p3,p4,p1,p2>对于所有 0 <=i <=4 Finish[i] = true,因此当前处于安全状态

(2)如果进程P2提出请求Request[2] =(1,2,2,2),系统能否将资源分配给它?试说明原因。

Request[2] = (1,2,2,2) <Need[2]=(2,3,5,6) , 因而请求是合法的,不会申请超过预期的资源。

Request[2] = (1,2,2,2) < Available(1,6,2,3) , 因此请求可以被满足,尝试分配

Allocation Need Avalible
A B C D A B C D A B C D
P0 0 0 3 2 0 0 1 2 0 4 0 1
P1 1 0 0 0 1 7 5 0
P2 2 5 7 6 1 1 3 4
P3 0 3 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6

运行安全检测算法,就是第一题的这个算法

Work = Avilable= (0,4,0,1)

然后找need,发现没一个 Need[i] < Work , 无法运行,因此不存在安全序列,系统处于不安全状态,不能同意Request[2]。

第六章 主存储器管理

存储管理功能

存储分配和去配
分配去配对象
	内存、外存(相同方法)
分配去配时刻
	进程创建、撤销、交换、长度变化

存储共享
目的:节省内存、相互通讯
内容:代码、数据

存储保护
防止地址越界
防止操作越权

存储扩充
内存、外存结合,虚拟存储体系
速度接近内存,容量相当外存

地址映射
逻辑地址=>物理地址
硬件支持
	基址寄存器(base)、限长寄存器(limit)、快表;
	使用上述寄存器完成地址映射过程;
	不能正常完成地址映射时产生中断。

内存资源管理

6.2.1 内存分区
分区时刻
静态分区:系统初始化时分;
动态分区:申请时分。
分区大小
等长分区:2i
异长分区:依程序、程序单位、对象大小。
通常作法
静态+等长(页式、段页式)
动态+异长(段式、界地址)

 静态等长分区的分配
 字位映象图
 空闲页面表
 空闲页面链
 
动态异长分区的分配
最先适应 (First Fit)
最佳适应 (Best Fit)
最坏适应 (Worst Fit)
下次适应(Next Fit)

字位映象图

image-20230510224741798

空闲页面表

空闲页表中有页首号和页数

然后分配的时候可以连续分配

空闲页面链

空闲的页面串起来,用一个链表

动态异常分配

有最先适应,

空闲区的数据结构是 一个空闲区首地址,一个长度

然后最先适应,找到就分配

下次适应,记录上次分配的内存地址,然后往下找最先适应的,概率相同,都能轮到一次

最佳适应,找到最小的分配

最坏适应,找到最大的分配

碎片处理

移动,将大块内存往前移动,并且使得所有内存连续,这样会导致资源大量消耗

存储管理方式

界地址管理

    1. 内存空间划分:动态异长;
    2. 进程空间划分:一个进程一个区域,逻辑地址0l-1
    3. 进程空间与内存空间对应关系(可以浮动):

  4. 所需表目:
         (1)内存分配表--在PCB中;
         (2)空闲区域表:array of (addr,size)。
    5. 所需寄存器:
          (1)基址寄存器:保存正在运行进程的起始地址
          (2)限长寄存器:保存正在运行进程的长度。

image-20230510230006171

跳跳跳烦

页式存储管理

内存空间划分:静态等长,2i, 称为一个页架。

物理地址=页架首址+页内地址
=页架号x 2i +页内地址
物理地址由两部拼接,前面i长度是页架号,后面的是页内的偏移地址

进程内自己也会维护一个逻辑地址的页

原理跟主内存的一样 , 但是页内存的东西不大一样,页内存的是映射的主内存的页框号

因此 我们逻辑地址需要根据这个特性来映射

逻辑地址=逻辑页首址+页内地址
=逻辑页号x2i +页内地址

image-20230510230521875

页表通过页逻辑地址的前几位,找到对应的物理页号,然后拼接上逻辑地址的页内地址,就是真实的物理地址了

快表其实就是页表,但是这玩意存的内容比较少,查找的速度比较快

image-20230510230715545

段式存储管理

内存空间划分:动态异长,每区一段

物理地址 = 段首址 + 段内地址

image-20230510231145461

image-20230510231150626

image-20230510231256161

段式可以加共享的次数,加访问权限,便于保护

段页式

段式优于页式
便于共享和保护

页式优于段式
消除“碎片”问题

段页式:结合二者优点
每个进程包含若干段
每个段包含若干页

第六章习题

14.在某个页式存储管理系统中,某进程页表如图 6.2(a)所示。已知页面大小为 1KB,试将逻辑地址1012、2 248、3 010,4 020、5 018转换为相应的物理地址。

image-20230510232500793

然后开始转换

页面大小为1KB , 说明后面的页内地址是有10位的

1012 = 0 + 1012 逻辑页号为0 页内偏移量为1023 - 1012 = 11 = 1+2+8

因此1012 = 11 1111 0100

对应物理页框号为 5 101

物理地址为 = 1 0111 1111 0100 = 17 F4H

2248 :

页号 2 对应页框号8 1000 页内地址 2248-2048 = 200 = 128 +64 + 8 00 1100 1000

10 0000 1100 1000 = 20 c8H

3010:

页号2 1000 页内地址3010 - 2048 = 962 = 512 + 256 = 768 + 128 = 896 + 64 = 960 +2

11 1100 0010

10 0011 1100 0010 = 23 c2

4020:

4020 - 3072 = 948 = 512 + 256 + 128 + 32 = 928 + 16 + 3 = 11 1011 0100

页号3对应1 01

0111 1011 0100 = 7 b4

5018:

5018 - 4x1024 = 4096 = 922 = 512 + 256 + 128 + 16 + 8 + 2 = 11 1001 1010

页号4 对应6 110

1 1011 1001 1010 = 1B 9A

\25. 在某个段式存储管理系统中,进程 P 的段表如图 6.1(a)所示,求图 6.1(b)中各逻辑地址所对应的物理地址。

image-20230511000106299

段号 0 偏移量<段长 物理地址 250+430 = 680

段号1 偏移量<段长 2365

段号2 偏移量>段长越界

段号3 偏移量<段长 1750

段号4 偏移量大于段长 越界

第七章 虚拟存储系统

前面的原理性部分跟内存的存储一样,方便内外存交换

颠簸(thrashing)

    页面在内存与外存之间频繁换入换出。
    原因:(1) 分给进程物理页架过少;
                (2) 淘汰算法不合理。
              (3)程序结构
    处理:(1) 增加分给进程物理页架数;
    (2) 改进淘汰算法。
              (3)改进程序结构


7.2.12 例子,省时间直接写了,打字好烦

第八章 文件系统

第八章习题

1.为什么将文件定义为信息项的序列,而不是信息项的集合?

答:因为构成文件的信息项之间是有次序关系的,这与数据库中的记录不同。数据库中同一关系的记录之间没有次序关系,因而关系是记录的集合。

2,试举例说明何种文件长度是固定不变的,何种文件长度是动态变化的。

答:某些系统可执行程序(如shell、vi)的长度通常是固定不变的;而用户正在编辑的文本文件或源代码文件的长度通常是动态变化的。

3.试比较文件名、文件号、文件描述符之间的关系。

答:文件名是文件的外部名字,通常是一个符号名(字符串),同一文件可以有多个文件名(如通过link命令建立连接)。
文件号是文件的内部名字,通常是一个整数,文件号与文件具有一对一的关系。
文件描述符是文件打开时返回的整数(入口地址),对应用户打开文件表(如UNIX中的u_ofile)中的一个入口。同一个文件可以被多个用户同时打开,此时返回的文件描述符一般不同。同一个文件也可以被同一个用户多次打开,每次打开时返回的文件描述符一般也不同。

4.将文件控制块分为两个部分有何好处?此时目录项中包含哪些成分?

答:将文件控制块(FCB)划分为主部和次部两部分具有如下两个主要优点。(1)提高查找速度。查找文件时,需用欲查找的文件名与文件目录中的文件名相比较。由于文件目录保存于外存,比较时需要将其以块为单位读入内存。由于一个FCB包括许多信息,一个外存块中所能保存的FCB个数较少,这样查找速度较慢。而将FCB分为两部分之后,文件目录中仅保存FCB的次部,这样一个外存块中可容纳较多的FCB,从而大大地提高了文件的检索速度。(2)实现文件连接。所谓连接就是给文件起多个名字,这些名字都是路径名,可为不同的用户所使用。次部仅包括一个文件名和一个标识文件主部的文件号,主部则包括除文件名之外的所有信息和一个标识该主部与多少个次部相对应的连接计数。当连接计数的值为0时,表示一个空闲未用的 FCB 主部。


5,为何文件在使用之前需要打开?多个进程共享同一文件时,其文件控制块为何在内存中只能保持一个副本?

答:当一个文件被使用时,其FCB中的信息需要被经常地访问。如果每次访问FCB都去读写外存,则速度会大大地降低。为了解决这一问题,在内存中设立系统打开文件表,将文件对应的FCB读入内存并保存在该表中,以备读写时使用,因而文件在使用前必须打开。由于文件是可共享的,多个进程可能会同时打开同一个文件,而其打开方式可能是不同的,当前的读写位置通常也是不一样的。为了防止信息冗余,将这些个性化信息记录在另外一个表中,该表称为用户打开文件表,每个进程有一个。表中包含以下内容:

image-20230511005411541

表中的系统打开文件表入口为一指针,指向该文件FCB在系统打开文件表中的入口地址。当多个进程共用同一个文件时,不同进程的用户打开文件表项可能指向相同的系统打开文件表入口。
这样共享文件的 FCB 在内存中只有一个副本,其好处在于:(1)节省了存储空间;(2)避免了对于多副本一致性维护的困难:(3)减少了I/Q交换次数,提高系统效率。

6,使用文件描述符存取打开文件与直接使用文件名称相比,有何优点?

答:首先,文件名是一个字符串,操作速度慢且所占空间大,而文件描述符为一整数,其处理效率明显高于字符串。其次,文件被打开后其控制信息(FCB)被缓冲到内存系统空间,文件描述符作为用户打开文件表中的入口地址直接与内存FCB建立起联系,而文件名则无法做到这一点。

7,用户打开文件表中包含哪些内容?为何不能将其合并到系统打开文件表中?

答:用户打开文件表中包含以下内容:

image-20230511005847236

由于文件是可共享的,多个进程可能会同时打开同一文件,而其打开方式可能是不同的,当前的读写位置通常也不一样。如果将这些信息合并到系统打开文件表中,就会导致一个共享文件占用多个系统打开文件表表目,这些表目的大部分内容是重复的。若一个进程对文件的操作导致FCB内容变化,该进程关闭文件时就要将FCB回写到外存中。这样增加了内外存传输的次数,也容易导致FCB内容的不一致。因此,通常将打开方式和读写指针记录在另外一个表,即用户打开文件表中。

第九章 设备输入与输出管理

习题

\12. 什么叫缓冲(buffering)?什么叫缓存(caching)?缓冲与缓存有何差别?

答:利用存储区缓解数据到达速度与离去速度不一致而采用的技术称为缓冲,此时同一数据只包含一个副本。例如,操作系统以缓冲方式实现设备的输入和输出操作主要是为了缓解处理器与设备之间速度不匹配的矛盾,以提高资源利用率和系统效率。
缓存是为提高数据访问速度而将部分数据由慢速设备预取到快速设备上的技术,此时同一数据存在多个副本。例如,远程文件的一部分被取到本地。
当然,在有些情况下,缓冲同时具有缓存的作用。例如,UNIX系统对于块型设备的缓冲区,在使用时可保持与磁盘块之间的对应关系,既有缓冲的作用也有缓存的作用,通过预先读与延迟写技术,进一步提高了输入输出效率。

参考资料

高等教育出版社.计算机操作系统教程(第4版).左万利,王英编著

 posted on 2023-05-08 16:52    阅读(223)  评论(0编辑  收藏  举报