操作系统课程总结(进程的描述与控制,处理机调度与死锁)

本文主要是介绍操作系统课程总结(进程的描述与控制,处理机调度与死锁),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[1]操作系统引论

OS的目标

方便、有效、可扩充、开放

OS的作用

提供接口、资源管理、扩充(抽象)

OS发展过程

①没有操作系统的计算机,从人工操作方式->脱机输入输出
②单道批处理系统:自动性、顺序性、单道性
③多道批处理系统:多道性、无序性、调度性、并发性、成批性。追求吞吐量。
④分时系统:交互性、并发性、独立性、及时性。追求快速响应。
⑤实时系统:实时性、高可靠性、并发性、独立性。追求非常高的可靠性、时效性。

OS四大特性

并发、共享、虚拟、异步

OS五大功能

①处理机管理:进程控制、进程同步、进程通信、调度
②存储器管理:内存分配、内存保护、地址映射、内存扩充
③设备管理:缓冲管理、设备分配、设备处理
④文件管理:文件存储空间的管理、目录管理、文件读写管理和保护
⑤提供接口:用户接口(联机、脱机、图形)、程序接口(系统调用)

OS体系结构

①传统结构:无结构->模块化->分层式
②现代结构:微内核

微内核结构的优点

①提高系统可扩展性
②增强系统可靠性
③可移植性强
④提供了对分布式系统的支持
⑤融入了面向对象技术

[2]进程的描述与控制

进程概念

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。进程由程序段、数据段、PCB组成。

进程三种基本状态

这里写图片描述

PCB中的信息

①进程标识符
②处理机状态
③进程调度信息
④进程控制信息

PCB的组织方式

线性方式、链接方式、索引方式

一些原语

创建creat、终止exit、阻塞block、唤醒wakeup、挂起suspend、激活active。
这里写图片描述

核心态和用户态

①系统态:能执行一切指令(包括特权指令),访问所有寄存器和存储器,也称为管态。
②用户态:具有较低特权,也称为目态。

进程的终止

正常结束、异常结束、外界干预

同步机制应遵循的原则(进入临界区的约定)

空闲让进、忙则等待、有限等待、让权等待。

记录型信号量

每个信号量对象中有一个整数成员变量和一个等待队列。
P(wait)操作:整数变量减1以表示需要1个资源,如果减完后这个量小于0,说明没有拿到,自我阻塞(调用block)到等待队列去。
V(signal)操作:整数变量加1以表示释放1个资源,如果释放完后这个量小于等于0,说明队列中有进程在等,唤醒(调用wakeup)队列中的一个进程。

管程

代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程,所组成的管理程序,共同构成的一个操作系统的资源管理模块。
这里写图片描述

生产者-消费者问题
semaphore mutex=1;//互斥信号量:保护缓冲区
semaphore empty=n;//空缓冲区空间数目
semaphore full=0;//满缓冲区空间数目

生产者进程:

do{P(empty);P(mutex);//生产V(mutex);V(full);
}while(true);

消费者进程:

do{P(full);P(mutex);//消费V(mutex);V(empty);
}while(true);
哲学家进餐问题

这里写图片描述

semaphore cp[5]={1,1,1,1,1};//五根筷子

哲学家i执行的程序,五个哲学家并发:

do{P(cp[i]);//右边筷子P(cp[(i+1)%5]);//左边筷子//进餐V(cp[i]);//右边筷子V(cp[(i+1)%5]);//左边筷子//思考
}while(true);
读者-写者问题

从读者进程去考虑:只要有一个读者在读,就不允许写者去写;而没有读者在读时,还需要确保没有写者在写,才能读。
因此可以设定一个”读者数目”的信号量,一个”确保没有写者在写”的信号量。

int readcount;//读者数目
semaphore wmutex=1;//读写竞争以了解对方是否在做

对于readcount,因为可能有多个读者进程,需要用互斥信号量夹起来保护:

semaphore rmutex=1;

从写者进程去考虑:只要没有读者在读,就可以去写了。
这只需要竞争那个”没有写者在写”的信号量。

读者进程:

do{P(rmutex);if(0==readcount)//如果没有读者在读P(wmutex);//那么写者才有可能在写,要确保写者完readcount++;//记录读者数量+1V(rmutex);//读P(rmutex);readcount--;//读完后,记录读者数量-1if(0==readcount)//如果此时已经没有读者在读了V(wmutex);//唤醒一个正在等待的写者V(rmutex);
}while(true);

写者进程:

do{P(wmutex);//确保没有读者在读/写者在写//写V(wmutex);//唤醒一个正在等待的写者/读者
}while(true);
线程

引入线程,使进程作为拥有资源的基本单位,而线程作为独立调度(运行)的基本单位,减轻之前进程切换的负担。线程控制块:TCB。

线程实现方式

①内核支持线程KST
在内核的支持下运行,创建等都在内核空间实现。但用户进程的线程需要在用户态运行,所以切换时需要从核心态转入用户态,开销比较大。调度以线程为单位执行。
②用户级线程ULT
在用户空间实现,创建等都无需内核的支持。但其调度仍是以进程为单位进行的,共用进程的时间片。(A进程中有1个线程,B进程中有100个线程,则A中线程的运行时间是B中各线程运行时间的100倍)
③组合方式
由ULT和KST的连接方式不同,形成三种模型:多对一模式、一对多模式、多对多模式。

[3]处理机调度与死锁

处理机调度的层次

①高级调度:调度对象是作业(针对内存),后备队列(外存)->就绪队列(内存)。用于多道批处理OS,在分时和实时OS中没有。
②低级调度:调度对象是进程(针对处理机),就绪队列(内存)->执行状态(内存)。即根据调度算法决定就绪队列中哪个进程获得处理机。
③中级调度,调度对象是进程(针对内存),静止(外存)<->活动(内存)。即把那些暂时不能运行的进程调至外存等待,提高内存应用率和系统吞吐量。

一些计算的量

这里写图片描述

批处理系统中的作业

作业:在批处理系统中以作业为基本单位从外存调入内存。
作业步:若干个相对独立又相互关联的顺序加工步骤,上一个作业步的输出作为下一个作业步的输入。
JCB:作业控制块。

作业三阶段三状态

提交->①收容阶段(后备状态)->②运行阶段(运行状态)->③完成阶段(完成状态)

作业调度算法

①先来先服务(FCFS):普通的队列。
②短作业优先(SJF):相当于最小堆每次取堆顶,效率最高。
③优先级调度(PSA):基于作业的紧迫程度。
④高响应比优先(HRRN):FCFS和SJF的折衷,即既考虑等待时间又考虑运行时间。
这里写图片描述

分时系统进程调度算法

①轮转法(RR):时间片固定,时间片的选取应略大于一次典型的交互所需的时间。如果时间片内执行完,立即取下一个就绪的进程。如果时间片结束,将其送往就绪队列末尾,并取下一就绪的进程。
这里写图片描述
使用了时间片,显然是一种可抢占的调度方式——时间片完即刻被抢占。

②优先级调度算法:把处理机分配给就绪队列中优先级最高的进程。

[1]非抢占式优先级调度算法:一旦分配给就绪队列中优先级最高的进程,除非该进程发生某些事件放弃处理机,否则一直执行下去。
[2]抢占式优先级调度算法:每当出现新的就绪进程,就和处理机上的进程优先级比较,若更高则抢占之。显然适合实时性要求较高的系统。

此外优先级还分为静态的和动态的,动态的优先级可以随着进程推进或等待时间增加而改变。

③多队列调度算法:即把一个就绪队列拆成多个,不同类型或性质的进程分配在不同的就绪队列中,各个队列之间也可设置优先级。
这里写图片描述

④多级反馈队列:该方式集合了前面所述的调度方式的一些优点。越靠上的队列优先级越高,时间片越小;越靠下的队列优先级越低,时间片越大(可能是翻倍),最后一个队列采用RR方式。上级队列出来的进程,在时间片内未能执行完,则进入下一级的队列(对于最后一个队列的进程也就是进入自己队列)。
这里写图片描述
对每个队列而言,只有上面的队列都为空时才能运行本队列的进程,如果处理机正在运行i队列出来的进程时,有新的进程进入上面的任一队列,都要把该进程放回本队列(i队列)的末尾,转而执行新加入的那个更高优先级队列中的进程。

实时系统进程调度

实时任务有哪些:

HRT:硬实时任务,必须立刻执行。
SRT:软实时任务,有一定容忍度,在一定时间内一定要执行好。

实时系统的要求:
一般采用抢占式调度机制(非抢占适用于对实时性要求不高的系统),对中断要能快速响应,对任务要有快速分派能力,系统处理能力要够强,实时任务也必须提供必要信息(如截止时间)。

非抢占式调度算法:
非抢占式轮转调度、非抢占式优先调度。

抢占式调度算法:
基于时钟中断的(时钟中断发生且不在临界区时抢占)、立即抢占的(只要不在临界区就抢占)。

以上这四种算法实时性依次增高。

两个具体的算法:
①最早截止时间优先(EDF)算法:具有最早deadline的排在队列队首/最小堆堆顶。
②最低松弛度优先(LLF)算法:必须开始的最晚时间越小,越优先。
这里写图片描述
可见松弛度虽是动态变化的,但对于队列中既存的进程,松弛度优先顺序并不会有改变(因为减掉的”当前时间”始终是一致的)。

优先级倒置和动态优先级继承

优先级倒置是因为低优先级进程用P操作拿到临界区资源后,在V操作释放前就被中间优先级的进程抢占,导致高优先级进程即便抢占了中间优先级进程,也因为无法拿到临界区资源而被自己的P操作阻塞,只能等到中间优先级进程全部执行完(这个过程可能非常长),才能让低优先级进程用V操作释放资源以使高优先级进程执行:
这里写图片描述
动态优先级继承可以较好的解决这个问题,在高优先级进程P操作发现有低优先级进程在使用而阻塞自己的同时,让这个低优先级进程继承自己的优先级,直到它用V操作退出临界区,这之间就不会有中间优先级的进程来骚扰了:
这里写图片描述

死锁

两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

引起死锁的原因

①竞争不可抢占性资源(一旦系统把某资源分配给该进程后,就不能将它强行收回)
②竞争可消耗资源(临时资源,在进程运行期间由进程动态地创建和消耗的)
③进程推进顺序不当(进入不安全区后仍然保持各自的资源就会出现死锁)
这里写图片描述

产生死锁的必要条件

①互斥条件:在一段时间内,某资源只能被一个进程占用。
②请求和保持条件:拿到一部分资源后,对其它资源的申请使自己阻塞,但对已经获得的资源扔保持不放。
③不可抢占条件:进程已经获得的资源在使用完之前不能被抢占。
④循环等待条件:发生死锁时必然存在一个进程等待其它进程占有的资源的循环链。

预防死锁

在四个必要条件中,互斥条件是非共享设备必须的,不能破坏,还应加以保持。
①破坏”请求和保持”条件:可以一次性拿完需要的全部资源,或者运行中逐步释放已经用完的资源。
②破坏”不可抢占”条件:进程获得了一部分资源,而剩下的资源获取不了,则已占有的资源也可被抢占掉。
②破坏”循环等待”条件:对所有资源排序编号,申请资源时按序号递增的顺序申请。

避免死锁的银行家算法

这里写图片描述
如果进程提出申请,如进程P1提出申请,要1,2,2的资源,先看一下这个请求向量Request=(1,2,2)不超过它实际需要的资源数Need[1]=(1,2,2),而且不超过系统中实际的可用量(3,3,2),那么就尝试把资源分配给它,然后执行安全性算法:
工作向量Work表示系统可提供给进程继续运行所需的各类资源数目,把(1,2,2)分配给P1后,发现P1可以执行完成,所以Work工作向量的变化是:
这里写图片描述
也就是说每当有一个进程完成,工作向量就加上这个进程已占有的资源数,发现最终所有需要这三种资源的进程都能执行完,也就是存在一个安全序列{P1,P3,P4,P2,P0},所以刚刚把来自P1的需求分配给它以后,系统是处于安全状态的。

死锁的检测和解除

要检测死锁需要在系统中保存有关资源的请求和分配信息,并提供能检测死锁的算法。如果在资源分配图中经过简化能消去所有的边,使所有进程结点成为孤立的结点,则当前没有产生死锁。
这里写图片描述
解除死锁,可以让死锁进程从其它死锁进程中抢占资源,以解除死锁状态;或者终止系统中的一个或多个死锁进程,以打破循环等待条件。

这篇关于操作系统课程总结(进程的描述与控制,处理机调度与死锁)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474106

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Linux中查看操作系统及其版本信息的多种方法

《Linux中查看操作系统及其版本信息的多种方法》在服务器运维或者部署系统中,经常需要确认服务器的系统版本、cpu信息等,在Linux系统中,有多种方法可以查看操作系统及其版本信息,以下是一些常用的方... 目录1. lsb_pythonrelease 命令2. /etc/os-release 文件3. h

C#使用SendMessage实现进程间通信的示例代码

《C#使用SendMessage实现进程间通信的示例代码》在软件开发中,进程间通信(IPC)是关键技术之一,C#通过调用WindowsAPI的SendMessage函数实现这一功能,本文将通过实例介绍... 目录第一章:SendMessage的底层原理揭秘第二章:构建跨进程通信桥梁2.1 定义通信协议2.2

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十