驱动调度
EDF调度算法

2 1)
Page 9
一、引入 2、国内外研究概况
当然,RM是基于这样一种比较理想的硬实时周期任务模型: i. 所有的任务都是周期任务 ii. 所有的任务都是不相关的,即它们没有共享资源 iii.所有任务都有一个固定的执行时间或最大执行时间 iv.所有任务的相对截止时间 都等于它们的周期 v. 所有任务都是可抢占的 vi.系统只有一个处理器 注:若iv不成立,则RM不是最优的固定优先级调度算法。这 事可采用另一种算法:时限单调(deadline monotonic)调度算 法DM,其按任务的相对时限来分配优先级:相对时限越短, 优先级越高。
Page 12
一、引入 2、国内外研究概况
软实时任务和偶发任务的调度 因为软实时任务允许运行时间错过截止期,所以其调度目标 是在保证满足硬实时周期任务的时限前提下,提高软实时任 务的响应时间。目前主要的调度算法有:
i. 后台运行法
ii. 轮询服务器法 iii. 挪用法
Page 13
一、引入 2、国内外研究概况
Page 11
一、引入 2、国内外研究概况
还有其他的动态优先级调度算法,e.g 最小空闲时间优先 (Least Slack Time First,LST)算法。
一个任务在t时刻的空闲时间等于: 截止时刻- t -该任务的剩余执行时间
虽然LST也是具有最优性ቤተ መጻሕፍቲ ባይዱ但需随时监视所有就绪任务,运行 时的开销较大,且如果两个任务的空闲时间接近,很容易产生 调度的颠簸现象,所以实际使用中一般不适用。
Page 5
一、引入 1、背景、目的及意义
从实时系统理论的发展来看,主要有以下几个方面: 有资源互斥的硬实时任务调度: 提出几种资源互斥协议来防止优先级反转和死锁问题, 并给出相应的可调度判定条件。 多处理器实时任务调度,前面的研究都是假定系统中只有 一个处理器,忽略实际复杂的因素,将注意力集中到调度算 法、资源访问控制和可调度性分析判定的基本原理上。这部 分将这些理论应用于包含多个处理器的实时系统中,并处理 在单处理器系统中未出现的问题。
操作系统原理实验指导

3、实验题
(1)设计一个内存分配模拟程序。假定在计算机系统作业后备队列中有六个等待调度运行的作业,参与分配的内存大小为32KB,采用简单页式管理,每个页帧的大小为1KB。根据要求进行内存的分配和回收。要求打印内存分配表。有关作业的组织和作业有关参数的设置请自行设计,要大致符合实际情况。
main()
{
int i;
if (fork())
{
i=wait();
printf(“It is parent process.\n”);
printf(“The child process, ID number %d, is finished.\n”,i);
}
else{
print(“It is child process.\n”);
(2)自选设计一个进程调度算法,并加以实现。
实验三存储器管理
1、目的与要求
目的:存储器管理是操作系统重要的组成部分,提高存储器的效率始终是操作系统研究的重要课题之一。虚拟存储技术是用来扩大存储容量的一种重要方法。学生应独立地使用一种开发工具或高级语言编写几个常用的存储分配算法,并能设计一个存储管理的模拟程序,对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的理解,巩固所学的知识。
操作系统实验指导
操作系统是计算机的最重要的系统软件,它在计算机中具有核心地位,其作用是对计算机系统资源进行统一的调度和管理,提供各种强有力的系统服务,为用户创造灵活而又方便的使用环境。一个精心设计的操作系统能极大地扩充计算机系统的功能,充分地发挥系统中各种资源的使用效率,提高系统工作的可靠性。
操作系统原理是计算机科学与技术专业的一门主要专业课程,它涉及计算机系统中各种软、硬资源管理的实现原理与方法,内容非常丰富,综合性非常强,并且还具有很强的实践性。只有把理论与实践紧密地结合起来,才能取得较好地学习效果。
离散控制系统中的协同控制方法

离散控制系统中的协同控制方法离散控制系统是一种基于时间步长的控制系统,其中传感器、执行器和控制器都是以离散的时间间隔进行操作的。
在离散控制系统中,协同控制方法具有重要的意义,可以帮助实现系统的高效控制和优化性能。
本文将介绍离散控制系统中的协同控制方法,并探讨其在实际应用中的一些案例。
一、协同控制方法的概念和原理协同控制方法是指通过不同的控制节点之间的协作和协调,实现整个离散控制系统的高效运行。
在离散控制系统中,控制节点可以是传感器、执行器或者控制器,它们之间的协作可以通过信息交换和决策制定来完成。
协同控制方法的核心原理是分工合作和优化调度,使得每个节点都能在适当的时间进行相应的动作,以达到整个系统的控制目标。
二、基于时序的协同控制方法基于时序的协同控制方法是一种通过时间序列的方式来实现节点之间的协作。
其核心思想是通过确定各个节点的时机和顺序,来保证系统在每个时间步长内能够正常运行。
常见的基于时序的协同控制方法有周期性调度、事件驱动调度和实时调度等。
周期性调度是指在系统中为每个节点分配一个固定的时间间隔,使得每个节点按照预定的顺序进行操作。
这种方法简单易行,适用于一些简单的离散控制系统。
然而,在规模较大且复杂度较高的系统中,周期性调度可能无法满足要求。
事件驱动调度是指根据系统中的事件触发,来决定各个节点的操作顺序和时间。
节点之间通过侦听事件,根据事件的优先级来决定下一步的行动。
这种方法能够更灵活地适应系统的变化,具有较高的实时性和响应性,但也较为复杂。
实时调度是指根据节点的状态和优先级,动态地分配时间片来调度各个节点的操作。
这种方法能够根据实际情况进行优化调度,使得整个系统的响应速度更快、效率更高。
然而,实时调度的算法设计和实现相对复杂,需要考虑时延和资源限制等问题。
三、基于网络的协同控制方法除了基于时序的协同控制方法外,基于网络的协同控制方法也是离散控制系统中常见的一种方式。
在基于网络的协同控制方法中,系统中的各个节点之间通过网络进行信息交换和远程控制。
2022年吉林化工学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)

2022年吉林化工学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)一、选择题1、驱动调度算法中,()算法可能会随时改变移动臂的运动方向。
A.电梯调度B.最短寻道时间优先C.扫描D.单向扫描2、为支持CD-ROM小视频文件的快速随机播放,播放性能最好的文件数据块组织方式是()。
A.连续结构B.链式结构C.直接索引结构D.多级索引结钩3、进程P1和P2均包含并发执行的线程,部分伪代码描述如下所//进程P1 //进程P2int x=0; int x=0;Thread1() Thread3(){int a; {int a:a=1; a=x;x+=1; x+=3;Thread2() Thread4(){ {int a: int b, aa=2; b=x;x+=2; x1=4;} }下列选项中,需要互斥执行的操作是()。
A. a=l与a=2B. a=x与b=xC. x+=1与x+=2D. x+=1与x+=34、进程和程序的本质区别是()A.前者分时使用CPU,后者独占CPUB.前者存储在内存,后者存储在外存C.前者在一个文件中,后者在多个文件中D.前者为动态的,后者为静态的5、一个正在访问临界资源的进程由于申请等待1/0操作而被中断时,它()。
A.允许其他进程进入与该进程相关的临界区B.不允许其他进程进入临界区C.允许其他进程抢占处理器,但不能进入该进程的临界区D.不允许任何进程抢占处理器6、总体上说,“按需调页”(Demand-Paging)是个很好的虚拟内存管理策略。
但是,有些程序设计技术并不适合于这种环境,例如()A.堆栈B.线性搜索C.矢量运算D.分法搜索7、不会产生内部碎片的存储管理是()。
A.分页式存储管理B.分段式存储管理C.固定分区式存储管理D.段页式存储管理8、用户程序在口态下使用特权指令引起的中断属于()。
A.硬件故障中断B.程序中断C.外部中断D.访管中断9、实时操作系统必须在()内处理完来白外部的事件。
任务调度机制

任务调度机制
任务调度机制是指一种自动化执行任务的方法,它可以将任务按照预定的时间或条件自动触发执行,从而提高工作效率和准确性。
任务调度机制通常包括以下几个方面:
1. 定时任务调度:根据设定的时间节点自动触发任务执行,例如每天凌晨执行数据备份任务。
2. 事件驱动任务调度:根据特定的事件触发任务执行,例如用户登录后触发欢迎消息发送任务。
3. 条件触发任务调度:根据特定的条件触发任务执行,例如当系统负载高于设定阈值时触发自动扩容任务。
任务调度机制可以应用于各种场景,例如数据处理、资源管理、自动化运维等。
通过合理的任务调度机制,可以实现系统自动化、高效化,从而提高企业的生产效率和竞争力。
- 1 -。
调度绞车原理

调度绞车原理调度绞车是一种用于工矿企业的起重设备,它主要用于在矿井、工厂等地方进行物料的吊装和搬运工作。
调度绞车的原理是通过电动机驱动齿轮箱,使绞车卷筒上的钢丝绳收放,从而实现物料的起升和下降。
下面我们来详细了解一下调度绞车的原理。
1. 电动机驱动。
调度绞车的电动机是整个设备的动力源,它通过电能转换为机械能,驱动齿轮箱的工作。
电动机的选型和性能直接影响到绞车的起重能力和工作效率。
在实际应用中,通常会根据需要选择不同功率的电动机,以满足不同工作条件下的需求。
2. 齿轮箱传动。
电动机驱动齿轮箱,齿轮箱中的齿轮传动将电动机的旋转运动转化为绞车卷筒的旋转运动。
齿轮箱的设计和制造要求高精度,以确保传动过程中的稳定性和可靠性。
同时,齿轮箱的润滑和保养也是绞车正常运行的重要保障。
3. 钢丝绳收放。
绞车卷筒上的钢丝绳通过电动机和齿轮箱的传动,实现收放运动。
钢丝绳的选用和使用要符合相关标准,以确保其承载能力和安全性。
在实际操作中,操作人员需要严格按照操作规程进行操作,避免因操作不当导致的事故发生。
4. 起升和下降控制。
调度绞车的起升和下降控制是通过控制电动机的启停和转向实现的。
操作人员通过操纵控制台上的按钮或手柄,控制绞车卷筒的收放运动,从而实现物料的起升和下降。
在操作过程中,需要根据实际情况进行灵活控制,确保起重作业的安全和高效进行。
5. 安全保护装置。
为了保障调度绞车的安全运行,设备上通常配备有各种安全保护装置,如超载保护、限位开关、断电保护等。
这些装置在绞车运行过程中起着至关重要的作用,一旦出现异常情况,能够及时切断电源,避免事故的发生。
总之,调度绞车作为一种重要的起重设备,在工矿企业中扮演着重要的角色。
了解其原理和工作方式,有助于我们更好地使用和维护这一设备,确保其安全、高效地运行,为生产作业提供可靠的保障。
共享单车的日常运维调度管理方案
共享单车的日常运维调度管理方案下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!共享单车的日常运维调度管理方案引言共享单车已成为现代城市中不可或缺的一部分,为人们提供了便捷、环保的出行方式。
操作系统试卷汇总
操作系统试卷汇总试卷一1.下列存储器中,处理器不能直接访问的是()..A.主存储器B.寄存器C.辅助存储器D.高速缓冲寄存器2.操作系统对文件进行编排、增删、维护和检索的实现是通过()A.数据物理地址B.文件属性C.数据逻辑地址D.按名存取3.在请求调页系统中有着多种置换算法,选择自上次访问以来所经历时间最长的页面予以淘汰的算法称为()A.FIFO算法B.LRU算法C.LFU算法D.OPT算法4.单用户连续存储管理中地址重定位的硬件执行机构是()A.界限寄存器B.基址寄存器C.不需要的D.下限寄存器5.文件系统中对文件的管理是通过()A.页表B.指针C.堆栈结构D.目录6.操作控制命令中,为用户查找程序中的错误提供了方便的是()A.文件类命令B.编辑命令C.查错命令D.调试类命令7.设基址寄存器的内容为1000,在采用动态重定位系统中,当执行指令“LOADA2000”时,操作数的实际地址是()A.1000B.2000C.3000D.40008.索引结构为每个文件建立一张索引表,用来存放()A.逻辑记录的存放地址B.部分数据信息C.主键内容D.逻辑记录存放位置的指针9.用磁带作为文件存储介质时,文件只能组织成()A.顺序文件B.链接文件C.索引文件D.目录文件10.在请求页式存储管理中,一个程序的页面走向是4,3,2,1,4,3,5,4,3,2,1,5,采用LRU算法,分配给该程序的存储块数为3,共发生缺页中断次数为()A.7B.8C.9D.1011.一个程序当它被投入运行时,必须把它的程序和数据存放到中。
12.为保证系统可靠工作,常把CPU执行的指令分特权指令和指令。
13.是对信息进行高速运算和处理的部件。
14.操作系统根据对进程进行控制和管理。
15.文件目录是文件系统实现的重要手段。
16.如果操作系统能保证所有的进程在有限时间内得到需要的全部资源,则称系统处于17.在单一处理器上,将执行时间有重叠的几个程序称为18.地址转换是将19.强迫性中断是由硬件的发现的。
车载CAN网络调度策略浅析
车载CAN网络调度策略浅析车载CAN网络调度策略浅析随着车辆电子技术的飞速发展,车载CAN(Controller Area Network)网络成为了现代汽车电子控制系统中不可或缺的组成部分,其在车辆传感器与执行器之间传输数据的同时也极大提高了车辆系统的可靠性和安全性。
在CAN网络中,消息调度策略是一个非常重要的问题,因为网络中通讯节点之间的消息传输必须通过调度协调来完成,否则会导致网络数据传输的堵塞,消息传输延迟增大,甚至出现数据冲突等严重问题。
针对CAN网络调度过程中出现的问题,现在研究人员提出了一些有效的调度算法,例如循环式调度、静态调度、事件驱动调度、动态调度等。
下面将从这几种调度算法中进行简单的分析。
首先是循环式调度。
循环式调度算法是一种静态调度算法,它将网络中所有数据分配到一定的时间槽之中,消息按照一定的顺序排列在时间槽当中进行发送,其优点是系统实现简单、延迟较小,但是当数据量增大时,时间复杂度随之增长,且会浪费一些时间槽。
而当存在实时性强的数据时,循环式调度算法不能够满足这些数据的传输需求。
其次是静态调度算法。
静态调度算法是在系统运行前统一制定好调度规则,再根据规则来完成数据传输的过程,其优点是调度过程简单、确定性强,具有一定的实时性,在小数据量的情况下表现良好;但是其缺点是不适应复杂的动态环境,处理延迟较大且缺乏灵活性。
第三是事件驱动调度算法。
事件驱动调度算法是根据实时事件发生的时刻来完成消息的发送,其最大优点是可以满足实时数据传输的需求,而对于非实时数据则能够保证在更短的时间内完成传输。
但其缺点也很明显,事件驱动调度算法的实现难度较大,需要依赖硬件设备进行支撑,系统实现较为复杂,且对系统负载的影响较大。
最后是动态调度算法。
动态调度算法是对上述三种算法的综合,它不仅能够满足实时数据传输的需求,同时也适应了复杂的动态环境,且易于实现。
其主要优点是支持多任务、具有较高的复杂度和灵活性,可以动态地调整消息优先级和时间戳,同时还能够反应实时性需求的不断变化。
国家开放大学电大操作系统(试题30道含答案)
国家开放大学电大操作系统(试题30道含答案)作业调度选择一个作业装入主存后,该作业能否占用处理器必须由()来决定。
A.设备管理B.作业控制C.进程调度D.驱动调度正确答案:C在页式虚拟存储管理系统中,LRU算法是指()。
A.最早进入内存的页先淘汰B.近期最长时间以来没被访问的页先淘汰C.近期被访问次数最少的页先淘汰D.以后再也不用的也先淘汰正确答案:B在分时系统中,可将进程不需要或暂时不需要的部分移到外存,j让出内存空间以调入其他所需数据,这种技术称为()。
A.覆盖技术B.对换技术..C.虚拟技术D.物理扩充.正确答案:B在单CPU的系统中,若干程序的并发执行是由()实现的。
A.用户B.程序自身C.进程D.编译程序正确答案:B在UNIX/Linux系统中,用户程序经过编译之后得到的可执行文件属于()。
A.设备文件B.普通文件C.目录文件D.特别文件正确答案:B用户要在程序一级获得系统帮助,必须通过()。
A.进程调度B.作业调度C.键盘命令D.系统调用正确答案:D用Is命令以长格式列目录信息时,若某一文件的特征在文件列表中按如下顺序显示在屏幕上:drwxrw-r-2usergk3564Qct2810:30/user/asD.h则同组用户的访问权限是()。
A.读和执行B.读、写、执行C.写和执行D.读和写正确答案:D一个含有6个盘片的双面硬盘,盘片每面有100条磁道,则该硬盘的柱面数为()。
A.12B.250C.100D.1200正确答案:C一般中断处理的主要步骤是什么?正确答案:一般中断处理的主要步骤是:保存被中断程序的现场,分析中断原因,转入相应处理程序进行处理,恢复被中断程序现场,即中断返回。
一般说来,文件系统应具备哪些功能?正确答案:一般说来,文件系统应具备以下功能:文件管理;目录管理;文件存储空间的管理;文件的共享和保护;提供方便的接口。
虚拟存储器有哪些基本特征?正确答案:虚拟存储器的基本特征是:虚拟扩充———不是物理上,而是逻辑上扩充了内存容量;部分装入———每个进程不是全部一次性地装入内存,而是只装入一部分;离散分配———不必占用连续的内存空间,而是“见缝插针”;多次对换———所需的全部程序和数据要分成多次调入内存。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
驱动调度1 实验目的磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。
它作为计算机系统的辅助存储器,担负着繁重的输入输出任务、在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请求等待处理。
系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求。
这就叫驱动调度,使用的算法称为驱动调度算法。
驱动调度能降低为若干个输入输出请求服务所需的总时间,从而提高系统效率。
2 设置初始条件1、操作系统:windows2、程序设计语言:C++3 功能描述模拟电梯调度算法,实现对磁盘的驱动调度。
4 方案论证4.1 数据结构设计typedef struct Process //描述进程信息{char name[N]; //进程名int cyl_num; //柱面号int tra_num; //磁道号int rec_num; //物理记录号int signal; //标记,用以判断结构体数组中该元素是否有效}process;4.2 算法设计函数模块各函数调用关系如图1所示,箭头指向被调用的函数主函数随机数函数接收请求函数电梯调度函数旋转调度函数移臂调度函数图1 函数调用关系流程图各函数功能及流程图如下:4.2.1主函数:void main()函数功能:显示提示信息,初始化进程数组,根据随机数的值选择调用驱动调度和接收请求或者选择继续和退出程序入口参数:无出口参数:无流程图:如图2所示图2 主函数流程图输出提示信息输入一个随机数随机数>0.5?初始化进程请求表(实际为进程的结构体数组)驱动调度接收请求继续?结束是否是否4.2.2随机数函数:float Ran_Num() 函数功能:接收随机数 入口参数:无出口参数:接收进来的随机数 流程图:无4.2.3接收请求函数:void list(int pro_count,int pro_num,process pro[M]) 函数功能:存放输入的进程信息,创建等待进程列表 入口参数:初始化后的进程数组 出口参数:无 流程图:如图3所示是否返回当前进程数组能存入?输入进程信息输入信息有错?i=0i++第i 个元素有效?已输入的进程数小于要输入的进程数图3 接收请求流程图是否是否是否是否有请求?输入要输入的进程个数已输入的进程数+14.2.4旋转调度函数:void cir_sec(process pro[M])函数功能: 如果有请求与当前柱面号相同,进行旋转调度,选择旋转距离最小的进程入口参数:部分全局变量及进程数组 出口参数:选择的数组元素编号流程图:如图4所示开始选择当前的访问进程结束当前访问者旋转距离小于最小旋转距离否是图4 旋转调度流程图4.2.5移臂调度函数:void mov_sec(process pro[M])函数功能:没有与当前柱面号相同的访问请求时,进行移臂调度 入口参数:进程数组出口参数:选择的数组元素编号 流程图:如图5所示当前移臂方向是向里移有比当前柱面号大的访问请求有比当前柱面号小的访问请求从大于当前柱面号的访问请求中选择一个最小者置当前移臂方向为向外移置当前移臂方向为向里移从小于当前柱面号的访问请求中选择一个最小者是否否否是是开始旋转调度结束图5 移臂调度流程图4.2.6驱动调度函数:void dri_sch(int pro_count,process pro[M] ) 函数功能:进行进程调度,按照电梯调度算法选择进程入口参数:当前有效进程数、进程数组出口参数:无流程图:如图6所示登记当前位置:柱面号,物理记录号被选中者退出“请求I/O 表”结束输出选择的进程开始查“请求I/O 表”有等待访问者输出“请求I/O 表”有请求与当前柱面号相同旋转调度移臂调度是否是否图6 驱动调度流程图5 设计结果与分析 5.1运行结果如下图7 初始状态图8 输入5个进程的相关信息图9 第一次选择后结果图10 第二次选择后结果图11 第三次选择后结果图12 第四次选择后结果图13 第五次选择后,进程等待表为空图14 再输入3个进程及相关信息图15 再次输入后第一次选择图16 再次输入后第二次选择图17 第三次选择后等待表为空,选择退出5.2 结果分析5.2.1初始状态,结果如图7所示5.2.2输入0.4,输入进程数据并选择继续,结果如图8所示5.2.3重复选择继续,输入0.6进行驱动调度直到等待进程表为空,结果如图9~图13所示第一次选择P5第二次选择P3第三次选择P1第四次选择P4第五次选择P2,当前等待表为空5.2.4选择继续,输入0.4,再输入3个进程,结果如图14所示5.2.5重复选择继续进行驱动调度至等待进程表为空,然后选择退出,结果如图15~图17所示第一次选择P8第二次选择P6第三次选择P7,当前等待表为空,选择退出6 课设总结1、通过设计数据结构进程访问磁盘,我进一步了解了磁盘存储器的物理结构,对电梯算法有深入的了解。
2、刚刚开始进行实习设计时,对题目没有进行正确的理解就忙于写代码,算法设计考虑的很不全面,从而导致后来实验数据出错,通过再次审查题目及资料,我了解了题目要求,对算法进行了重新设计,最终完成了试验,得出了正确的运行结果。
3、在调试的过程中出现了很多的问题,从语法到算法中的错误,通过向老师和同学请教以及查阅资料,解决了这些问题,使我对编程语句及算法设计有了更深的认识。
编程是很严谨的事情,不容半点马虎,即使是一个括号也可能导致程序的错误。
7 参考文献[1] 谢宋和, 甘勇. 单片机模糊控制系统设计与应用实例[M]. 北京: 电子工业出版社, 1999.5:20-25[2] 潘新民, 王燕芳. 微型计算机控制技术[M], 第2版. 北京: 电子工业出版社, 2003.4:305-350[3] 范立南, 谢子殿. 单片机原理及应用教程[M]. 北京: 北京大学出版社, 2006.1:123-130[4] Newman W M, Sbroull R F. Principles of Interactive Computer Graphics[M]. New York: McGraw Hill, 1979.10:10-25[5]卜小明, 龙全求. 一种薄板弯曲问题的四边形位移单元[J]. 力学学报,1991,23(1):53-60[6] Mastri A R. Neuropathy of diabetic neurogenic bladder[J]. Ann Intern Med, 1980, 92(2):316-318[7] 范立南, 韩晓微, 王忠石等. 基于多结构元的噪声污染灰度图像边缘检测研究[J]. 武汉大学学报(工学版), 2003,49(3):45-49[8] index.asp8 源程序代码pro_struct.h#ifndef PRO_STRUCT_H#define PRO_STRUCT_H#define N 10typedef struct Process{char name[N];//进程名int cyl_num;//请求的柱面号int tra_num;//请求的磁道号int rec_num;//请求的物理记录号int signal;//标记位}process;#endifpro_list.h#ifndef PRO_LIST_H#define PRO_LIST_H#include<iostream>#include<string.h>#include"pro_struct.h"using namespace std;#define M 100void list(int pro_count,int pro_num,process pro[M])//创建等待进程表{cout<<"等待的进程数:";cin>>pro_num;if(pro_num>0&&(pro_num+pro_count)<=M)//判断要输入的进程数是否合法,输入后是否超出进程等待表所允许的最大值{cout<<"开始输入"<<endl;int i,j=0,h;for(i=0;i<M;i++){for(;pro[i].signal==0&&j<pro_num;j++){cin>>pro[i].name>>pro[i].cyl_num>>pro[i].tra_num>>pro[i].rec_num;for(h=0;h<M;h++){if(pro[h].signal==1){while(strcmp(pro[h].name,pro[i].name)==0||strlen(pro[i].name)>10){cout<<"进程名不合规定,超出指定长度或已存在,请重新输入进程名:"<<endl;cin>>pro[i].name;}}}while(pro[i].cyl_num<0||pro[i].cyl_num>199)//判断柱面号是否越界{cout<<"柱面号不合规定,请重新输入柱面号:"<<endl;cin>>pro[i].cyl_num;}while(pro[i].tra_num<0||pro[i].tra_num>19)//判断磁道号是否越界{cout<<"磁道号不合规定,请重新输入磁道号:"<<endl;cin>>pro[i].tra_num;}while(pro[i].rec_num<0||pro[i].rec_num>7)//判断物理记录号是否越界{cout<<"物理记录号不合规定,请重新输入物理记录号:"<<endl;cin>>pro[i].rec_num;}pro[i].signal=1;}}}else{if(pro_num<=0){cout<<"要输入的进程个数必须为正整数"<<endl;}else{cout<<"进程数超出进程等待表所允许的最大量"<<endl;cout<<"当前最多允许输入"<<(M-pro_count)<<"个进程"<<endl;}}}#endifDriver_Scheduling.h#include<iostream>#include<iomanip>#include"pro_list.h"#include"pro_struct.h"int dir=0; //0,up向里;1,down向外int cylinder=0;int record=0;int min_rec=0;//移动到当前进程扇区所要移动的距离int min_r=8;//旋转调度中最小移动距离int max_min_cyl=200;//大于当前柱面号的访问请求中的最小者int min_min_cyl=200;//小于当前柱面号的访问请求中的最小者int x;int choosen=0;//被选中的进程void cir_sec(process pro[M]) //旋转调度{if(pro[x].rec_num<record)min_rec=8-(record-pro[x].rec_num);elsemin_rec=pro[x].rec_num-record;if(min_rec<=min_r)//首选移动距离最小,再选磁盘号最小{min_r=min_rec;//选择移动距离最小的请求choosen=x;}}void mov_sec(process pro[M])//移臂调度{int count_abo=0;int count_low=0;if(dir==0)//如果方向向里up{for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num>cylinder)count_abo++;}}if(count_abo>0)//有进程柱面号大于当前柱面号{for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num>cylinder&&pro[x].cyl_num<max_min_cyl)//从大于当前柱面号的访问请求中选择一个最小者{max_min_cyl=pro[x].cyl_num;choosen=x;}}}for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num==max_min_cyl)//从大于当前柱面号的访问请求中选择一个最小者{cir_sec(pro);//旋转调度}}}}else{dir=1;//改方向为向外,downfor(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num<cylinder&&pro[x].cyl_num<min_min_cyl)//从小于当前柱面号的访问请求中选择一个最小者{min_min_cyl=pro[x].cyl_num;choosen=x;}}}for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num==min_min_cyl){cir_sec(pro);//旋转调度}}}}}else{for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num<cylinder)count_low++;}}if(count_low>0)//有进程柱面号大于当前柱面号{for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num<cylinder&&pro[x].cyl_num<min_min_cyl)//从小于当前柱面号的访问请求中选择一个最小者{min_min_cyl=pro[x].cyl_num;choosen=x;}}}for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num=min_min_cyl){cir_sec(pro);//旋转调度}}}}else{dir=0;//改方向为向里upfor(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num>cylinder&&pro[x].cyl_num<max_min_cyl)//从大于当前柱面号的访问请求中选择一个最小者{max_min_cyl=pro[x].cyl_num;choosen=x;}}}for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num==max_min_cyl)//从大于当前柱面号的访问请求中选择一个最小者{cir_sec(pro);//旋转调度}}}}}}void dri_sch(int pro_count,process pro[M] )//电梯调度{max_min_cyl=200;//大于当前柱面号的访问请求中的最小者min_min_cyl=200;//小于当前柱面号的访问请求中的最小者min_r=8;choosen=0;int count_equ=0;if(pro_count!=0)//有等待访问的进程{cout<<"当前请求I/O表为:"<<endl;cout<<"┌─────────────────┐"<<endl;cout<<"│进程名│柱面号│磁道号│物理记录号│"<<endl;cout<<"└─────────────────┙"<<endl;cout.setf(ios::left);for(x=0;x<M;x++){if(pro[x].signal==1){cout<<""<<setw(10)<<pro[x].name<<setw(8)<<pro[x].cyl_num<<setw(8)<<pro[x].tra_num<<setw(8)<<pro[x].rec _num<<endl;}}cout.unsetf(ios::left);for(x=0;x<M;x++){if(pro[x].signal==1)if(pro[x].cyl_num==cylinder)//有进程柱面号等于当前柱面号count_equ++;}if(count_equ>0){for(x=0;x<M;x++){if(pro[x].signal==1){if(pro[x].cyl_num==cylinder){cir_sec(pro);//旋转调度}}}}else{mov_sec(pro);//移臂调度}cylinder=pro[choosen].cyl_num;record=pro[choosen].rec_num;pro[choosen].signal=0;if(dir==0){cout<<"选择的进程为:"<<endl;cout<<"┌────────────────┐"<<endl;cout<<"│进程名│柱面号│物理记录号│方向│"<<endl;cout<<"└────────────────┙"<<endl;cout.setf(ios::left);cout<<""<<setw(10)<<pro[choosen].name<<setw(8)<<pro[choosen].cyl_num<<setw(10)<<pro[choosen].rec_num <<setw(8)<<"up"<<endl;cout.unsetf(ios::left);}else{cout<<"选择的进程为:"<<endl;cout<<"┌────────────────┐"<<endl;cout<<"│进程名│柱面号│物理记录号│方向│"<<endl;cout<<"└────────────────┙"<<endl;cout.setf(ios::left);cout<<""<<setw(10)<<pro[choosen].name<<setw(8)<<pro[choosen].cyl_num<<setw(10)<<pro[choosen].rec_num <<setw(8)<<"down"<<endl;cout.unsetf(ios::left);}}elsecout<<"请求I/O表为空"<<endl;}ran_num.h#include<stdlib.h>float Ran_Num(){float ran_num;/* float i;i=float(rand());if(i==0||1)ran_num=i;elseran_num=1/i; */cout<<"输入随机数[0,1]:"<<endl;cout<<"随机数>0.5时转入电梯调度"<<endl;cout<<"随机数<=0.5时转入接收请求"<<endl;cin>>ran_num;return(ran_num);}qddd.cpp#include<iostream>#include"Driver_Scheduling.h"#include"pro_list.h"#include"pro_struct.h"#include"ran_num.h"using namespace std;void main(){cout<<"***************************************************************************" <<endl;cout<<"请按照如下顺序输入各进程信息,以空格分开,每条进程信息输入完成后按回车键结束:"<<endl;cout<<"进程名柱面号磁道号物理记录号"<<endl;cout<<"注:进程名不超过10个字符,柱面号为0-199,磁道号为0-19,物理记录号为0-7"<<endl;cout<<"***************************************************************************" <<endl;int i;process pro[M];//创建进程数组for(i=0;i<M;i++)//初始化进程数组中所有项的标记位为0,即该项未存入进程信息{pro[i].signal=0;}int pro_num=0;char signal='Y';int pro_count;// 进程等待表中进程数while(signal=='Y'||signal=='y'){if(Ran_Num()>0.5)//如果随即数大于0.5,转到调度模块{pro_count=0;for(i=0;i<M;i++){if(pro[i].signal==1)pro_count++;//统计进程等代表中有效进程数}dri_sch(pro_count,pro);}else//若随机数小于等于0.5,转到接受请求,即创建等待进程表{pro_count=0;list(pro_count,pro_num,pro);}cout<<endl<<"是否继续(Y/N)?";cin>>signal;while(signal!='Y'&&signal!='N'&&signal!='y'&&signal!='n'){cout<<"输入错误,请输入Y(y)或N(n)"<<endl;cin>>signal;}}}。