基于Linux的设备分配及磁盘调度算法说明书
- 格式:doc
- 大小:1.16 MB
- 文档页数:66
请描述linux下常见的调度策略及调度原理在Linux下,常见的进程调度策略包括:1.CFS(Completely Fair Scheduler)完全公平调度器:CFS是Linux内核默认的调度策略。
它通过使用红黑树数据结构来维护进程队列,以确保公平分配CPU时间片。
CFS基于进程的虚拟运行时间(vruntime)进行调度,根据进程的优先级和历史执行情况来分配CPU时间。
2.实时调度策略:Linux提供了多种实时调度策略,包括先来先服务(FIFO)和轮转(Round Robin)调度策略。
实时任务具有较高的优先级,可以实时响应系统事件,适用于对时间敏感的应用,如嵌入式系统和实时视频处理等。
3.基于优先级的调度策略:Linux还支持基于静态优先级和动态优先级的调度策略。
这些策略根据进程的优先级决定调度顺序,优先级较高的进程将获得更多的CPU时间。
调度原理是指操作系统如何决定哪个进程获得CPU资源的分配。
Linux的调度器使用时间片轮转和优先级调度等策略来实现公平和高效的调度。
调度器会根据不同的调度策略和优先级,分配给每个进程一定的CPU时间片。
时间片指定了进程能够运行的时间段。
当一个进程的时间片用完或发生了阻塞事件时,调度器会将CPU 分配给下一个就绪状态的进程。
CFS调度器基于虚拟运行时间(vruntime)来分配CPU时间。
vruntime表示进程所需的实际运行时间,CFS通过比较进程的vruntime来决定下一个运行的进程。
较长时间没有运行的进程会被赋予更长的时间片,以实现公平调度。
实时调度策略将优先级更高的实时任务放在优先级队列的前面,以确保它们及时地响应系统事件。
在实时任务运行期间,其他普通优先级的任务将被暂时挂起。
总的来说,Linux的调度器通过多种调度策略和优先级,根据不同类型的任务和进程的要求,合理分配CPU资源,以实现公平、高效和响应及时的调度。
这样可以确保系统的正常运转并提高性能。
题目:磁盘调度一.设计目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了动手能力。
二.课程设计内容和要求编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度,要求设计主界面以灵活选择某算法,且以下算法都要实现:1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)三.算法及数据结构3.1算法的总体思想设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。
常用的分配策略有先请求先分配、优先级高者先分配等策略。
在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。
操作系统中,对磁盘的访问要求来自多方面,常常需要排队。
这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。
因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N其中Mi为所需访问的磁道号所需移动的磁道数。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。
因此,执行一次输入输出所花的时间有:寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。
延迟时间——指定扇区旋转到磁头下所需的时间。
传送时间——由磁头进程读写完成信息传送的时间。
其中传送信息所花的时间,是在硬件设计就固定的。
而寻找时间和延迟时间是与信息在磁盘上的位置有关。
为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。
linux的任务调度机制摘要:1.Linux任务调度机制简介2.Linux任务调度器的工作原理3.调度策略和队列4.进程优先级和调度算法5.总结正文:Linux任务调度机制是操作系统中负责分配处理器时间片给各个进程的核心组件。
它依据特定的策略和算法,确保公平、高效地管理进程的执行。
本文将详细介绍Linux任务调度机制的各个方面。
1.Linux任务调度机制简介Linux采用基于优先级的抢占式调度算法,以确保处理器资源得到充分利用。
调度器通过周期性地在就绪队列中选择一个或多个进程,将它们分配给处理器执行。
调度器主要依据进程的优先级和当前的负载情况来决定哪个进程获得处理器资源。
2.Linux任务调度器的工作原理Linux任务调度器的核心组件是调度实体(scheduler entity),它包括进程队列、调度策略和调度算法。
调度实体根据系统的当前状态,按照策略和算法来选择下一个要执行的进程。
调度实体的工作过程分为以下几个步骤:- 进程创建:当一个新进程被创建时,调度器会为其分配一个初始优先级,并将其加入就绪队列。
- 进程执行:调度器从就绪队列中选择一个或多个进程,将它们分配给处理器执行。
执行过程中,进程可能因时间片用完或被阻塞而放弃处理器资源。
- 进程更新:调度器周期性地更新进程的优先级和状态,以反映其当前的执行情况。
- 进程退出:当进程完成执行或被终止时,调度器会将其从进程队列中移除。
3.调度策略和队列Linux调度器支持多种调度策略,如FIFO(先进先出)、SJF(短作业优先)和RR(时间片轮转)。
调度策略决定了进程在队列中的排列顺序,从而影响了调度器选择下一个进程的依据。
Linux中有两个主要的进程队列:就绪队列和运行队列。
就绪队列包含了所有等待处理器资源的进程,而运行队列则存放了当前正在执行的进程。
调度器会根据策略从就绪队列中选择一个或多个进程,将其加入运行队列。
4.进程优先级和调度算法Linux中的进程优先级是一个0-139的整数,优先级数值越低,进程获得处理器资源的机会越高。
操作系统实验报告——调度算法1. 实验目的本实验旨在探究操作系统中常用的调度算法,通过编写代码模拟不同的调度算法,了解它们的特点和应用场景。
2. 实验环境本次实验使用的操作系统环境为Linux,并采用C语言进行编码。
3. 实验内容3.1 调度算法1:先来先服务(FCFS)FCFS调度算法是一种简单且常见的调度算法。
该算法按照进程到达的先后顺序进行调度。
在本实验中,我们使用C语言编写代码模拟FCFS算法的调度过程,并记录每个进程的等待时间、周转时间和响应时间。
3.2 调度算法2:最短作业优先(SJF)SJF调度算法是一种非抢占式的调度算法,根据进程的执行时间来选择下一个要执行的进程。
在本实验中,我们使用C语言编写代码模拟SJF算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。
3.3 调度算法3:轮转调度(Round Robin)Round Robin调度算法是一种经典的时间片轮转算法,每个进程在给定的时间片内依次执行一定数量的时间。
如果进程的执行时间超过时间片,进程将被暂时挂起,等待下一次轮转。
在本实验中,我们使用C语言编写代码模拟Round Robin算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。
4. 实验结果分析通过对不同调度算法的模拟实验结果进行分析,可以得出以下结论:- FCFS算法适用于任务到达的先后顺序不重要的场景,但对于执行时间较长的进程可能会导致下一个进程需要等待较久。
- SJF算法适用于任务的执行时间差异较大的场景,能够提高整体执行效率。
- Round Robin算法适用于时间片相对较小的情况,能够公平地为每个进程提供执行时间。
5. 实验总结本次实验通过模拟不同调度算法的实际执行过程,深入了解了各种调度算法的原理、特点和适用场景。
通过对实验结果的分析,我们可以更好地选择合适的调度算法来满足实际应用的需求。
在后续的学习中,我们将进一步探索更多操作系统相关的实验和算法。
linux下常见的调度策略及调度原理Linux是一种开源的操作系统,广泛应用于服务器和嵌入式设备中。
在Linux系统中,进程调度策略是操作系统的核心组成部分之一,它决定了进程的执行顺序和时间分配。
本文将介绍Linux下常见的调度策略及其调度原理。
在Linux系统中,常见的进程调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和优先级调度(Priority Scheduling)等。
先来先服务(FCFS)是一种简单而直观的调度策略,它按照进程到达的先后顺序进行调度。
即当一个进程到达系统时,它将被放入就绪队列的末尾,并等待CPU的分配。
当CPU空闲时,系统将选择就绪队列中的第一个进程分配给CPU执行。
这种调度策略的优点是公平性强,但缺点是无法处理长作业和短作业的差异,容易产生"饥饿"现象。
最短作业优先(SJF)调度策略是根据进程的执行时间来决定优先级的调度策略。
即系统会选择执行时间最短的进程先执行,以减少平均等待时间。
这种调度策略的优点是能够最大程度地减少平均等待时间,但缺点是可能会出现长作业等待时间过长的问题。
时间片轮转(RR)是一种基于时间片的调度策略,每个进程被分配一个固定长度的时间片。
当一个进程的时间片用完时,系统将把CPU分配给下一个进程。
这种调度策略的优点是能够有效地平衡进程之间的响应时间,但缺点是可能会导致频繁的上下文切换。
优先级调度(Priority Scheduling)是一种根据进程优先级来决定调度顺序的策略。
每个进程被分配一个优先级,优先级越高的进程越容易被调度执行。
这种调度策略的优点是能够根据不同进程的需求进行灵活调度,但缺点是可能会导致低优先级进程的"饥饿"问题。
在Linux系统中,调度算法的实现是通过内核的进程调度器来完成的。
内核中的调度器会根据不同的调度策略来选择下一个要执行的进程,并将其上下文切换到CPU中执行。
第1篇一、实验目的1. 理解磁盘调度算法的基本原理和重要性。
2. 掌握几种常见的磁盘调度算法,包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-SCAN)算法。
3. 通过模拟实验,分析不同磁盘调度算法的性能差异。
4. 优化磁盘调度策略,提高磁盘访问效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 磁盘调度算法模拟库:PyDiskScheduling三、实验内容1. FCFS算法:模拟实现先来先服务算法,按照请求顺序访问磁盘。
2. SSTF算法:模拟实现最短寻道时间优先算法,优先访问距离当前磁头最近的请求。
3. SCAN算法:模拟实现扫描算法,磁头从0号磁道开始向0号磁道移动,访问所有请求,然后返回到0号磁道。
4. C-SCAN算法:模拟实现循环扫描算法,与SCAN算法类似,但磁头在到达末尾磁道后返回到0号磁道。
四、实验步骤1. 导入PyDiskScheduling库。
2. 创建一个磁盘调度对象,指定磁头初始位置、请求序列和调度算法。
3. 运行调度算法,获取磁头移动轨迹和访问时间。
4. 分析算法性能,包括磁头移动次数、平均访问时间和响应时间等。
五、实验结果与分析1. FCFS算法:在请求序列较短时,FCFS算法表现较好。
但随着请求序列长度增加,磁头移动次数和访问时间明显增加。
2. SSTF算法:SSTF算法在请求序列较短时表现最佳,平均访问时间和响应时间较低。
但当请求序列较长时,算法性能下降,磁头移动次数增加。
3. SCAN算法:SCAN算法在请求序列较短时性能较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。
与SSTF算法相比,SCAN算法在请求序列较长时性能更稳定。
4. C-SCAN算法:C-SCAN算法在请求序列较短时表现较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。
与SCAN算法相比,C-SCAN算法在请求序列较长时性能更稳定,且磁头移动次数更少。
linux磁盘管理教案一、教案描述本教案旨在教授学生如何在Linux操作系统中进行磁盘管理。
学生将学习如何查看和理解磁盘使用情况,如何创建、格式化、挂载和卸载分区,以及如何使用逻辑卷管理更灵活地分配磁盘空间。
二、教学目标1. 学生能够使用命令行工具查看和理解磁盘使用情况。
2. 学生能够使用命令行工具创建、格式化、挂载和卸载分区。
3. 学生能够使用逻辑卷管理工具进行灵活管理磁盘空间。
三、教学内容1. 磁盘使用情况查看和理解a. 使用命令`df`查看整个系统的磁盘使用情况。
b. 使用命令`du`查看当前目录的磁盘使用情况。
c. 理解磁盘使用率、可用空间等概念。
2. 分区管理a. 使用`fdisk`命令进行分区管理。
b. 创建新分区。
c. 格式化分区。
d. 挂载和卸载分区。
e. 理解挂载点的概念。
3. 逻辑卷管理a. 使用`lvm`命令进行逻辑卷管理。
b. 创建物理卷、卷组和逻辑卷。
c. 扩展和缩小逻辑卷。
d. 迁移逻辑卷。
e. 删除逻辑卷。
四、教学过程1. 磁盘使用情况查看和理解a. 通过示例演示如何使用`df`命令查看整个系统的磁盘使用情况,并解释各列的含义。
b. 通过示例演示如何使用`du`命令查看当前目录的磁盘使用情况,并解释输出的含义。
2. 分区管理a. 通过示例演示如何使用`fdisk`命令进行分区管理,包括创建新分区、格式化分区、挂载和卸载分区,并解释每个步骤的含义。
b. 强调挂载点的重要性,解释挂载点的概念和用途。
3. 逻辑卷管理a. 通过示例演示如何使用`lvm`命令进行逻辑卷管理,包括创建物理卷、卷组和逻辑卷,并解释每个步骤的含义。
b. 演示如何扩展和缩小逻辑卷,以及迁移逻辑卷。
c. 强调在删除逻辑卷之前备份重要数据的重要性。
五、教学评估1. 给学生提供一个场景,要求他们根据已学的知识来创建、格式化、挂载和卸载一个新的分区,并查看磁盘使用情况。
2. 给学生提供一个场景,要求他们根据已学的知识来创建逻辑卷、扩展逻辑卷,并迁移逻辑卷上的数据。
linux 盘符分配原理摘要:一、Linux 盘符分配原理简介二、Linux 盘符分配的具体实现方式三、Linux 盘符分配与Windows 盘符分配的差异四、总结正文:Linux 盘符分配原理简介在Linux 系统中,盘符分配是一个涉及到文件系统、设备和驱动程序等多个方面的复杂问题。
Linux 盘符分配的原理可以从以下几个方面进行介绍:1.Linux 文件系统2.设备驱动程序3.盘符分配策略Linux 盘符分配的具体实现方式1.文件系统Linux 系统中的文件系统是负责存储和管理文件信息的软件模块。
常见的文件系统有EXT2、EXT3、NTFS 等。
在Linux 系统中,每个文件系统都有一个唯一的标识符,例如/dev/sda1。
2.设备驱动程序设备驱动程序是负责控制和管理硬件设备的软件模块。
在Linux 系统中,每个设备驱动程序都有一个唯一的标识符,例如/dev/sda。
设备驱动程序通过操作系统内核与硬件设备进行通信,实现对设备的控制和管理。
3.盘符分配策略在Linux 系统中,盘符分配策略主要有两种:静态分配和动态分配。
静态分配是指在系统启动时,由操作系统内核根据设备的类型和位置为设备分配盘符。
动态分配是指在系统运行过程中,由用户或应用程序动态请求盘符分配。
Linux 盘符分配与Windows 盘符分配的差异1.分配方式在Windows 系统中,盘符分配是由操作系统自动完成的。
而在Linux 系统中,盘符分配可以通过静态分配和动态分配两种方式实现。
2.盘符表示在Windows 系统中,盘符用A、B、C 等字母表示。
而在Linux 系统中,盘符用/dev/sda1、/dev/sdb2 等表示。
3.数据存储在Windows 系统中,数据存储在盘符对应的文件夹中。
而在Linux 系统中,数据存储在文件系统中,盘符只是用来表示文件系统的设备。
总结Linux 盘符分配原理涉及到文件系统、设备驱动程序和盘符分配策略等多个方面。
linux磁盘调度策略Linux磁盘调度策略磁盘调度策略是操作系统中的一个重要组成部分,它决定了磁盘上的数据访问顺序。
Linux操作系统提供了多种磁盘调度策略,以满足不同场景下的需求。
本文将介绍Linux中常见的磁盘调度策略,包括CFQ、Deadline和NOOP。
1. CFQ磁盘调度策略CFQ(Completely Fair Queuing)是Linux内核默认的磁盘调度策略。
它采用了时间片轮转的方式,为每个进程提供公平的磁盘访问机会。
CFQ会将磁盘请求按照优先级进行分类,并为每个进程分配一定数量的时间片进行磁盘访问。
优先级高的进程会获得更多的时间片,从而获得更快的磁盘响应速度。
CFQ适用于大多数常规应用场景,能够保证公平性和稳定性。
2. Deadline磁盘调度策略Deadline磁盘调度策略以最小化磁盘请求的响应时间为目标。
它将磁盘请求分为两类:实时请求和普通请求。
实时请求具有更高的优先级,需要在规定时间内完成。
而普通请求则在规定时间内按照先进先出的原则进行处理。
Deadline通过维护两个队列,分别处理实时请求和普通请求,以保证实时请求的响应时间。
3. NOOP磁盘调度策略NOOP磁盘调度策略是一种简单的FIFO(先进先出)调度策略。
它不对磁盘请求进行排序,直接按照请求的先后顺序进行处理。
NOOP适用于低负载的系统,可以减少磁盘调度的开销,提高系统的响应速度。
4. 其他磁盘调度策略除了CFQ、Deadline和NOOP,Linux还提供了其他一些磁盘调度策略,如Anticipatory、AS(Anticipatory Scheduler)和BFQ (Budget Fair Queuing)等。
这些策略在特定场景下有着不同的表现和优势。
例如,Anticipatory策略在读取大文件时表现较好,而AS策略则适用于多媒体和数据库等需要低延迟的应用。
5. 磁盘调度策略的选择选择合适的磁盘调度策略需要根据具体的应用场景和需求来决定。
操作系统课程设计题目:磁盘驱动调度算法模拟班级:姓名:学号:指导教师:成绩:6 月磁盘驱动调度算法模拟菜单显示FCFS算法SCAN算法SSTF算法CSCAN算法沿磁道增加方向沿磁道减小方向沿磁道增加方向沿磁道减小方向一、课程设计目的1.进一步加深对磁盘驱动调度算法的理解。
2.编程实现“先来先服务”、“最短寻道时间优先”、“电梯调度”、“循环扫描”算法。
二、课题内容1.假设一种磁盘含有4 个盘片,每个盘片有100 个磁道,每道有8 个扇区,模拟格式化时对柱面和扇区进行编号的过程。
2.设计若干磁道访问请求,规定顾客输入线性块号,系统能将其转换为对应的磁道号(柱面号),并计算出分别采用“先来先服务”、“最短寻道时间优先”、“电梯调度”、“循环扫描”算法的寻道总长度。
3.提供可视化且简洁清晰的顾客界面,能直观且动态地描述磁头移动。
三、设计思路(一)系统概要设计1.整体模块设计图2.有关知识磁盘调度:当有多个进程都请求访问磁盘时,采用一种合适的驱动调度算法,使各进程对磁盘的平均访问(重要是寻道)时间最小。
现在惯用的磁盘调度算法有:1)先来先服务2)最短寻道时间优先3)扫描算法4)循环扫描算法等3.算法思想介绍(1)先来先服务算法(FCFS)即先来的请求先被响应。
FCFS 方略看起来似乎是相称"公平"的,但是当请求的频率过高的时候FCFS 方略的响应时间就会大大延长。
FCFS 方略为我们建立起一种随机访问机制的模型,但是如果用这个方略重复响应从里到外的请求,那么将会消耗大量的时间。
为了尽量减少寻道时间,看来我们需要对等待着的请求进行合适的排序,而不是简朴的使用FCFS 方略。
这个过程就叫做磁盘调度管理。
有时候FCFS 也被看作是最简朴的磁盘调度算法。
(2)最短寻道时间优先算法(SSTF)最短时间优先算法选择这样的进程。
规定访问的磁道,与现在磁头所在的磁道距离近来,以使每次的寻道时间最短。
中北大学软件学院实训说明书实训名称: 操作系统课程设计题目名称:专班 级: 12210A02小组成员学号: 1221010516 姓名: 高田田 成绩:学号: 1221010543 姓名: 王 浩 成绩:学号: 1221010618 姓名: 许嘉阳 成绩:学号: 1221010707 姓名: 王晋英 成绩:2015 年 1 月基于Linux 的设备分配及磁盘调度算法任务分工情况说明目录1. 绪论 (1)2. 需求分析 (1)2.1. 目的 (1)2.2. 内容 (2)2.2.1. 进程调度 (2)2.2.2. 设备分配 (2)2.2.3. 磁盘调度 (3)3. 概要设计 (4)3.1. 进程调度 (4)3.1.1. 功能模块图 (4)3.1.2. 相关函数 (5)3.2. 设备分配 (5)3.2.1. 功能模块图 (6)3.2.1. 相关函数 (6)3.3. 磁盘调度 (7)3.2.1. 功能模块图 (7)3.2.1. 相关函数 (7)4. 详细设计 (7)4.1. 进程调度 (7)4.1.1进程创建 (7)4.1.2进程切换 (9)4.1.3进程阻塞 (10)4.1.4进程唤醒 (10)4.1.5进程结束 (11)4.1.6进程显示 (12)4.2. 设备分配 (13)4.2.1. 设备分配 (13)4.2.2. 设备释放 (17)4.2.3. 设备添加 (19)4.2.4. 设备删除 (21)4.2.5. 设备显示 (24)4.3. 磁盘调度 (26)4.3.1. 先来先服务算法 (27)4.3.2 最短寻道时间优先算法 (28)4.3.3 扫描算法 (29)4.3.4 循环扫描算法 (30)4.3.5 调用四种算法比较 (31)5. 心得体会 (32)6. 参考文献 (34)7. 源代码 (34)1. 绪论随着信息技术的发展, ,Linux操作系统得到了前所未有的广泛应用。
Linux被应用到包括便携式电子设备、生物科技以及航天科技等各种领域。
显然不同应用领域对Linux系统的实时性、公平性和吞吐量等性能有着不同的要求,而进程调度算法对Linux系统性能起着至关重要的作用,用来创建进程,撤销进程,实现进程转换,它提供了可运行得进程之间复用CPU的方法,并为创建的进程在设备分配功能中提供所必要设备。
同时,Internet的飞速发展使数据增长,这给数据增长带来了很大的压力。
对数据的访问性能、数据传输性能、数据管理性能和存储扩展等方面都提出了比过去更高的要求。
这需要一个既能满足大容量信息存储、能适应将来容量扩充要求的存储器管理系统,又可以大大提高传输速率,还可以完成信息高速处理的计算机体系架构。
而随着技术的发展,设备管理技术和磁盘调度技术成为提高数据处理和数据传输的关键因素。
因此,研究海量管理系统中的分配管理技术和磁盘调度策略具有重要意义。
本次课程设计就这些问题展开了一些有意义的研究工作。
2. 需求分析2.1. 目的(1)通过本实验可以加深理解有关进程控制块(PCB) 、进程队列的概念,体会并了解创建进程、切换进程、阻塞进程、唤醒进程、结束进程、显示进程的具体实施过程。
(2)完成设备管理功能的模拟,掌握包括通道和控制器的添加和删除,设备的添加、删除,设备的分配和回收。
(3)通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。
2.2. 内容2.2.1. 进程调度2.2.2.1.功能分析(1)每个进程有一个进程控制块(PCB)表示。
进程控制块包含如下信息:进程名、进程编号、进程的大小和进程的临接PCB的地址。
(2)每个进程的状态可以是就绪(ready) 、执行(running)和阻塞(block)三种状态之一。
(3)进程创建,由系统生成一个PCB结点,用进队函数放入就绪队列。
如果没有正在执行的进程,则将等待队列中就绪进程调入执行。
(4)进程切换,通过函数实现将运行队列中的执行进程调入就绪队列,将等待队列中就绪进程调入执行。
(5) 进程阻塞,通过函数实现将运行队列中的执行进程调入阻塞队列,将等待队列中就绪进程调入执行。
(6) 进程唤醒,通过函数实现将阻塞队列中的阻塞进程调入就绪队列,将等待队列中就绪进程调入执行。
(7) 进程结束,通过函数实现将就绪队列中的就绪进程抢占运行队列。
(8)进程显示,根据队列进程的存储特性,顺序查找到每个进程并依次输出每个进程的名称和大小。
(9) 所创建进程将会在设备分配功能中为其提供所需必要设备。
2.2.2.1.数据结构进程控制块(PCB)2.2.2. 设备分配2.2.2.1.功能分析(1)设备管理子系统涉及到通道控制表(CHCT)、控制器控制表(COCT)和设备控制表(DCT)来体现输入输出系统。
(2)实现上述设备、控制器以及通道的层次关系,同时能够添加或删除新的设备、控制器或通道。
(3)通过键盘命令模拟进程执行过程中提出的设备分配或释放请求,并为此请求分配或释放设备。
分配设备成功后可将进程状态调整为阻塞,释放设备后变为就绪状态。
(4)分配设备时应如果该设备已被其它进程占用,则设备分配失败,请求进程进入阻塞状态,同时等待该设备的释放。
如果设备空闲,进程占用设备的同时还应提出申请控制器请求,直到与设备相关的通道都已申请成功为止。
(5)设备、控制器或通道的释放应引起对应节点的等待队列中的第一个阻塞进程被唤醒。
如果被唤醒的进程还未完成申请操作,应继续执行上级节点的申请操作。
2.2.2.2.数据结构设备控制表(DCT)控制器控制表(COCT)通道控制表(CHCT)2.2.3. 磁盘调度系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)。
2.2.3.1先来先服务算法(FCFS)这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2.2.3.2 最短寻道时间优先算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
2.2.3.3 扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。
这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。
由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。
此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
2.2.3.4 循环扫描算法(CSCAN)循环扫描算法是对扫描算法的改进。
如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。
这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。
例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
3.概要设计3.1. 进程调度3.1.1. 功能模块图图3.1 进程管理功能模块图3.1.2. 相关函数void enqueue(int id,char *name,int size,struct PCB *head)--进程进入队列(就绪队列、阻塞队列)struct PCB *dequeue(struct PCB *head)--进程移出队列void createProcess()--创建进程void switchProcess()--进程切换void blockProcess()--阻塞进程void wakeupProcess()--唤醒进程void terminateProcess()--结束进程void displayProcessstatus()--显示进程状态3.2. 设备分配3.2.1. 功能模块图图3.2 设备分配功能模块图3.2.1. 相关函数struct DCT *findDCT(char name[])--用设备名查找设备struct COCT *findController(char name[])--用控制器名查找控制器 struct CHCT *findChannel(char name[])--用通道名查找通道addProcesstoWaiting(*waiting,*p)--进入进程等待队列add(*head,*node)--入队列struct PCB *getFirst(*head)--获得队列里的第一个进程allocateCHCT(*chct,*p)--分配CHCTallocateCOCT(*coct,*p)--分配COCTallocateDCT()--分配DCTreleaseCHCT(*name,*chct,*p)--释放通道releaseCOCT(*name,*coct,*p)--释放控制器releaseDCT()--释放设备addChannel(char name[])--增加通道addController(*name,*chct)--增加控制器addDevice(*name,*coct)--增加设备deleteDCT(char nameDCT[])--删除设备deleteCOCT(char nameCOCT[])--删除控制器deleteCHCT(char nameCHCT[])--删除通道displayDCT()--显示设备3.3. 磁盘调度3.2.1. 功能模块图图3.3 磁盘调度功能模块图3.2.1. 相关函数Sort(int Array[],int n)------冒泡排序算法,从小到大排序 Output(int Track[],int Num)------输出磁道请求顺序FCFS(int Track[],int Num)------先来先服务调度算法SSTF(int Track[],int Num)------最短寻道时间优先调度算法 SCAN(int Track[],int Num)------扫描调度算法C_SCAN(int Track[],int Num)------循环扫描调度算法4.详细设计4.1. 进程调度4.1.1进程创建(1)核心代码void createProcess(){printf("\nname: ");scanf("%s",name);printf("size: ");scanf("%d",&size);printf("\n");enqueue(id++,name,size,ready); //用进队函数将进程放入就绪队列 if(running==0){ //如果没有正在执行的进程,则将等待队列中就绪进程调入执行running=dequeue(ready);}(2)测试结果图4.1.1 进程管理主界面图4.1.2 进程创建前图4.1.3 进程创建后4.1.2进程切换(1)核心代码void switchProcess(){if(running!=0&&ready->next!=0){enqueue(running->id,running->name,running->size,ready); //将正在执行的进程放入就绪队列running=dequeue(ready); //将就绪队列中第一个进程调入执行}elseprintf("没有可切换的进程\n");}(2)测试结果图4.1.4 进程切换前图4.1.5 进程切换后图4.1.6 没有可切换的进程4.1.3进程阻塞(1)核心代码void blockProcess(){if(running==0)printf("没有可阻塞的进程\n");else{enqueue(running->id,running->name,running->size,blocked); //将正在执行的进程挂入阻塞队列running=0;if(ready->next==0)printf("没有可执行的进程\n");elserunning=dequeue(ready);}}(2)测试结果图4.1.7 进程阻塞前图4.1.8进程阻塞后图4.1.9 没有可阻塞的进程4.1.4进程唤醒(1)核心代码void wakeupProcess(){if(blocked->next==0)printf("没有可激活的进程");else{enqueue(blocked->next->id,blocked->next->name,blocked->nex t->size,ready);dequeue(blocked);if(running==0)running=dequeue(ready);}}(2)测试结果图4.1.10 进程唤醒前图4.1.11 进程唤醒后图4.1.12 没有可唤醒的进程4.1.5进程结束(1)核心代码void terminateProcess(){if(running==0){printf("没有需要结束的进程\n");}else{running=dequeue(ready);}}(2)测试结果图4.1.13 进程结束前图4.1.14 进程结束后图4.1.15 没有可结束的进程4.1.6进程显示(1)核心代码void displayProcessstatus(){printf("--------就绪状态--------\n");if(ready->next==0)printf("当前没有进程在该状态\n");if(ready->next!=0){q=ready->next;while(ready->next!=0){printf("%s",ready->next->name);printf(" %d\n",ready->next->size);ready->next=ready->next->next;}ready->next=q;}printf("--------执行状态--------\n");if(running==0) printf("当前没有进程在该状态\n");if(running!=0){printf("%s",running->name);printf(" %d\n",running->size);}printf("--------阻塞状态--------\n");if(blocked->next==0) printf("当前没有进程在该状态\n\n");if(blocked->next!=0){p=blocked->next;while(blocked->next!=0){printf("%s",blocked->next->name);printf(" %d\n",blocked->next->size);blocked->next = blocked->next->next;}blocked->next=p;}}(2)测试结果图4.1.16 进程显示结果4.2. 设备分配4.2.1. 设备分配(1)核心代码void allocateCHCT(struct CHCT *chct,struct PCB *p)//分配CHCT{if(chct->occupied!=0) //如果通道被占用{printf("不能分配通道\n");addProcesstoWaiting(chct->waiting,p);//添加进程到通道等待队列}else{chct->occupied=p;printf("分配成功!\n");}add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;}//分配COCTvoid allocateCOCT(struct COCT *coct,struct PCB *p){if(coct->occupied!=0){printf("不能分配控制器\n");addProcesstoWaiting(coct->waiting,p);add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;return;}else{coct->occupied=p;allocateCHCT(coct->chct,p); //已分配控制器请求分配通道 }}//分配DCTvoid allocateDCT(){char nameDCT[10];printf("请输入设备名称:");scanf("%s",nameDCT);struct DCT * dct=findDCT(nameDCT);struct PCB * p = running;if(dct!=NULL&&p!=NULL){if(dct->occupied!=0){printf("不能分配设备\n");addProcesstoWaiting(dct->waiting,p);add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;return;}else{dct->occupied=p;allocateCOCT(dct->coct,p); //设备分配成功请求分配控制器}}else printf("发生错误!\n");}(2)测试结果图4.2.1 设备管理主界面请求设备顺序为:process1-->input1(成功)process2-->printer2(失败:设备、控制器成功,通道被占用。