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

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

[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

相关文章

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同