操作系统-课程设计
操作系统课程设计作用

操作系统课程设计作用一、教学目标本章节的操作系统课程设计作用旨在让学生了解操作系统的基本原理和功能,掌握操作系统的基本操作和应用,培养学生运用操作系统解决实际问题的能力。
具体的教学目标如下:1.知识目标:(1)了解操作系统的概念、发展和分类。
(2)掌握操作系统的五大功能模块:进程管理、存储管理、文件管理、作业管理和用户接口。
(3)熟悉操作系统的主要性能指标,如CPU利用率、内存利用率、吞吐量等。
(4)了解操作系统的主要实例,如Windows、Linux、macOS等。
2.技能目标:(1)能够熟练使用操作系统进行基本操作,如创建、删除文件和文件夹,设置系统参数等。
(2)能够运用操作系统提供的工具进行系统性能监测和优化。
(3)能够使用操作系统提供的编程接口(如API)开发简单的应用程序。
(4)能够分析操作系统产生的日志文件,排查和解决常见问题。
3.情感态度价值观目标:(1)培养学生对操作系统的兴趣,提高学生运用操作系统解决实际问题的意识。
(2)培养学生团队协作、自主学习和创新精神。
二、教学内容本章节的教学内容主要包括以下几个部分:1.操作系统概述:介绍操作系统的概念、发展和分类。
2.操作系统的基本功能:讲解进程管理、存储管理、文件管理、作业管理和用户接口等五大功能模块。
3.操作系统性能分析:介绍操作系统的主要性能指标,如CPU利用率、内存利用率、吞吐量等,以及性能监测和优化方法。
4.常用操作系统实例:介绍Windows、Linux、macOS等常见操作系统的特点和应用场景。
5.操作系统编程接口:讲解操作系统提供的编程接口(如API)及其使用方法。
6.操作系统常见问题排查:分析操作系统产生的日志文件,排查和解决常见问题。
三、教学方法本章节采用多种教学方法相结合,以提高学生的学习兴趣和主动性:1.讲授法:讲解操作系统的基本概念、原理和功能。
2.案例分析法:分析实际案例,让学生了解操作系统的应用场景和解决实际问题的能力。
操作系统课程设计

操作系统课程设计一、课程目标知识目标:1. 理解操作系统的基本概念、功能、类型和结构,掌握操作系统的五大核心功能模块(处理器管理、存储器管理、设备管理、文件管理、用户接口);2. 掌握操作系统的发展历程、主要操作系统(如Windows、Linux、Mac OS)的特点及应用场景;3. 了解操作系统的设计与实现原理,包括进程管理、内存管理、设备管理、文件系统等关键技术;4. 学会使用操作系统提供的命令行或图形界面进行基本的系统操作与维护。
技能目标:1. 培养学生对操作系统的实际操作能力,能够熟练使用至少一种操作系统进行日常管理与维护;2. 培养学生运用操作系统原理解决实际问题的能力,如分析系统性能、诊断故障、优化配置等;3. 提高学生的编程能力,使其能够编写简单的系统程序或脚本,实现特定功能。
情感态度价值观目标:1. 培养学生对操作系统的兴趣,激发学生学习计算机科学的热情;2. 培养学生的团队合作意识,使其在讨论、分析、解决问题的过程中学会倾听、交流、协作;3. 培养学生具备良好的信息素养,关注操作系统领域的最新发展,增强信息安全意识。
课程性质:本课程为计算机科学与技术专业(或相关领域)的必修课,具有较强的理论性和实践性。
学生特点:学生已具备一定的计算机基础知识,具有较强的学习兴趣和动手能力,但可能对操作系统原理的理解和应用尚有不足。
教学要求:注重理论与实践相结合,以案例驱动、任务导向的方式进行教学,注重培养学生的实际操作能力和问题解决能力。
通过本课程的学习,使学生能够掌握操作系统的基本原理,提高实际应用水平,为后续专业课程学习打下坚实基础。
二、教学内容1. 操作系统概述:介绍操作系统的基本概念、功能、类型,比较不同操作系统的特点,分析操作系统的发展趋势。
教材章节:第一章 操作系统概述2. 进程与线程管理:讲解进程与线程的概念、状态与转换,进程调度算法,同步与互斥,死锁与饥饿问题。
教材章节:第二章 进程管理3. 存储管理:介绍内存分配与回收策略,虚拟内存技术,页面置换算法,内存保护机制。
《操作系统》课程设计

《操作系统》课程设计一、课程目标知识目标:1. 让学生掌握操作系统的基本概念,包括进程、线程、内存管理、文件系统等核心知识;2. 了解操作系统的历史发展,掌握不同类型操作系统的特点及使用场景;3. 掌握操作系统的性能评价方法和常用的调度算法。
技能目标:1. 培养学生运用操作系统知识解决实际问题的能力,如分析系统性能瓶颈、优化系统资源分配等;2. 培养学生具备基本的操作系统编程能力,如进程创建、线程同步、文件操作等;3. 提高学生的团队协作能力和沟通能力,通过小组讨论和项目实践,学会共同解决问题。
情感态度价值观目标:1. 培养学生对操作系统学科的兴趣,激发学生的学习热情,使其形成积极向上的学习态度;2. 培养学生具备良好的信息素养,尊重知识产权,遵循法律法规;3. 培养学生的创新精神和批判性思维,敢于质疑、勇于探索,形成独立思考的能力。
课程性质:本课程为计算机科学与技术专业的核心课程,旨在让学生掌握操作系统的基本原理和实现方法,提高学生的系统分析和编程能力。
学生特点:学生具备一定的编程基础和计算机系统知识,具有较强的逻辑思维能力和动手实践能力。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过案例分析和项目实践,帮助学生将所学知识内化为具体的学习成果。
在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。
二、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、功能、类型及特点,对应教材第一章内容。
- 操作系统的起源与发展- 操作系统的功能与类型- 操作系统的主要特点2. 进程与线程:讲解进程与线程的概念、状态、调度算法,对应教材第二章内容。
- 进程与线程的定义与区别- 进程状态与转换- 进程调度算法3. 内存管理:分析内存管理的基本原理、策略和技术,对应教材第三章内容。
- 内存分配与回收策略- 虚拟内存技术- 页面置换算法4. 文件系统:介绍文件系统的基本概念、结构、存储原理,对应教材第四章内容。
操作系统课程设计项目参考

滴加碘液后
滴加碘液前
12/12/2021
第十二页,共二十三页。
消化(xiāohuà):在消化道内将食物分解成可吸收 (xīshōu)的成分的过程
(包括物理性消化和化学性消化)
吸收(xīshōu):营养物质通过消化道壁进入循环 系统的过程
12/12/2021
第十三页,共二十三页。
消化(xiāohuà)和吸收的过程
12/12/2021
第十九页,共二十三页。
练习(liànxí)
• 2、分析数据,指出(zhǐ chū)哪一部分消化道中消化液最多。
• 在每天摄入800克食物和1200毫升水的情况下, 消化腺大致分泌以下数量消化液。 1500毫升唾液 2000毫升胃液 1500毫升肠液 500毫升胆汁 1500毫升胰液
12/12/2021
第二十二页,共二十三页。
内容 总结 (nèiróng)
第二节。食物中的营养物质是在消化系统中被消化和吸收的。这粒西瓜籽在姗姗的消化道内, 经过了难忘的时光。它先遇到像轧钢机似的上、下尖硬的怪物,差点儿将它压得粉身碎骨。后来它
No 钻进了一条(yī tiáo)又长又窄的迷宫,它在这里走了很久,身边的许多物质都神秘地消失了。走出迷
唾液腺、胃腺(wèixiàn)、肝脏、胰腺、肠腺
1、淀粉在__口__腔__开始消化、蛋白质在____开始胃消化、脂肪在_______开始 消小化肠。
2、胆汁是一种消化液,但不含消化酶,起乳化脂肪的作用。
二、人体消化、吸收的主要器官—— _____小肠 能 训 练解
胰脏:分泌(fēnmì)胰液 肠腺:分泌肠液
肝脏:最大的腺体,分泌胆汁。 胆汁无消化酶,有乳化脂肪 的
作用。
第七页,共二十三页。
操作系统课程设计pintos

操作系统课程设计pintos一、教学目标本课程的目标是让学生了解和掌握操作系统的基本原理和概念,通过学习Pintos操作系统,使学生能够理解操作系统的核心机制,包括进程管理、内存管理、文件系统和输入/输出系统等。
在技能方面,学生应能够使用Pintos进行简单的操作系统设计和实现,提升编程能力和系统分析能力。
在情感态度价值观方面,学生应培养对计算机科学和操作系统的兴趣,增强解决实际问题的责任感和使命感。
二、教学内容教学内容将按照Pintos操作系统的结构和功能进行,包括:1. 操作系统的概述和基本概念;2. 进程管理,包括进程的创建、调度和同步;3. 内存管理,包括物理内存管理和虚拟内存管理;4. 文件系统,包括文件和目录的、文件系统的实现;5. 输入/输出系统,包括设备驱动程序和中断处理。
三、教学方法为了激发学生的学习兴趣和主动性,将采用多种教学方法,包括:1. 讲授法,用于讲解操作系统的原理和概念;2. 讨论法,用于讨论操作系统的实现和应用;3. 案例分析法,通过分析具体的操作系统案例,让学生理解操作系统的实际应用;4. 实验法,通过实验操作,让学生亲手实现操作系统的核心机制。
四、教学资源教学资源包括:1. Pintos操作系统的教材和相关参考书;2. 多媒体资料,包括操作系统的教学视频和PPT;3. 实验设备,包括计算机和相关的硬件设备。
这些教学资源将用于支持教学内容和教学方法的实施,丰富学生的学习体验。
五、教学评估教学评估将采用多种方式进行,以全面、客观、公正地评价学生的学习成果。
评估方式包括:1. 平时表现,包括课堂参与、提问和讨论等,占总评的20%;2.作业,包括理论和实践作业,占总评的30%;3. 考试,包括期中考试和期末考试,占总评的50%。
考试内容将涵盖操作系统的原理、概念和实验操作。
六、教学安排教学安排将根据课程内容和学生的实际情况进行设计。
本课程计划在一个学期内完成,每周安排2次课时,每次课时1小时。
操作系统课程设计Linux

操作系统课程设计Linux一、教学目标本课程的教学目标是使学生掌握Linux操作系统的核心概念、原理和应用技能。
通过本课程的学习,学生将能够:1.理解操作系统的基本原理,包括进程管理、内存管理、文件系统和输入/输出系统。
2.掌握Linux操作系统的安装、配置和管理方法。
3.熟练使用Linux命令行界面,进行日常操作和系统管理。
4.掌握Linux常用命令、 shell脚本编写和系统监控工具的使用。
5.了解Linux操作系统在服务器、嵌入式设备和云计算等领域的应用。
二、教学内容本课程的教学内容分为五个部分:1.操作系统概述:介绍操作系统的定义、功能和分类,以及Linux操作系统的历史和发展。
2.进程管理:讲解进程的基本概念、进程控制、进程同步和互斥、死锁及其解决方法。
3.内存管理:介绍内存分配与回收策略、内存保护、虚拟内存和分页分段机制。
4.文件系统:讲解文件和目录结构、文件访问控制、文件系统性能优化和磁盘空间分配策略。
5.输入/输出系统:介绍I/O设备管理、中断和DMA机制、设备驱动程序和I/O调度策略。
三、教学方法本课程采用多种教学方法相结合的方式,以提高学生的学习兴趣和主动性:1.讲授法:教师讲解操作系统的核心概念和原理,引导学生掌握基本知识。
2.讨论法:学生针对实际案例和问题进行讨论,培养学生的思考和分析能力。
3.案例分析法:分析Linux操作系统的实际应用案例,使学生了解操作系统的应用场景。
4.实验法:安排实验室课时,让学生亲自动手进行系统安装、配置和调试,提高学生的实践能力。
四、教学资源本课程的教学资源包括:1.教材:选用权威、实用的Linux操作系统教材,如《Linux操作系统原理与应用》。
2.参考书:提供相关的学术论文、技术博客和在线文档,供学生拓展阅读。
3.多媒体资料:制作课件、教学视频和演示文稿,辅助学生理解和记忆。
4.实验设备:提供Linux服务器、虚拟机和实验室环境,让学生进行实际操作。
操作系统课程设计任务书

操作系统集中上机实验1:银行家算法一、目的和要求银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
二、实验内容1.设计进程对各类资源最大申请表示及初值确定。
2.设定系统提供资源初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其申请是否得到满足。
三、算法描述银行家可以把一定数量的资金供多个用户周转使用,为保证资金的安全银行家规定:1.当一个用户对资金的最大需求量不超过银行家现有的资金就要接纳该用户;2.用户可以分期贷款,但贷的总数不能超过最大需求量;3.当银行家现有的资金不能满足用户的沿需贷数时,对用户的贷款可推迟支付,但总能使用户在有限的时间里得到贷款;4.当用户得到所需的全部资金后,一定能在有限的时间里归还所有的资金。
实验2:时间片轮转法基本思想:将CPU的处理时间划分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片,当时间片结束时,就强迫运行进程让出CPU,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。
在轮转法中,时间片长度的选择非常重要,将宜接影响系统开销和响应时间。
如果时间片长度很小,则调度程序剥夺处理机的次数频繁,加重系统开销;反之,如果时间片长度选择过长,比方说一个时间片就能保证就绪队列中所有进程都执行完毕,则轮转法就退化成先进先出算法。
实验3-4:抢占式(或非抢占式)优先级调度算法基本思想:该算法的基本思想是进程优先级高者优先调度,是一种常用的进程调度算法。
该算法的关键是如何确定优先数。
通常确定优先数的方法有两种,即静态法和动态法。
(1)静态优先权是在创建进程时确定的,其运行特征是优先数确定之后在整个进行运行期间不再改变。
确定静态优先权的依据有进程的类型、进程所使用的资源、进程的估计运行时间等因素。
操作系统课程设计题目

-操作系统性能调优策略
-多处理器系统
-多处理器系统的基本概念
-并行与分布式计算
-实时操作系统
-实时操作系统的特点与需求
-实时调度算法
-操作系统中的并发控制
-并发的基本概念
-互斥与同步机制
-课程设计进阶项目
-设计并实现一个简单的实时操作系统
-研究并发控制策略在操作系统中的应用
-分析多处理器系统中的负载均衡问题
4.章节四:内存管理
-内存分配与回收策略
-虚拟内存与分页机制
5.章节五:设备管理
-设备管理的基本原理
- I/O调度策略
6.章节六:文件系统
-文件与目录结构
-文件存储与访问控制
2、教学内容
-文件系统性能优化
-磁盘空间分配策略
-磁盘碎片整理方法
-操作系统安全性
-访问控制机制
-加密与认证技术
-操作系统实例分析
-探索操作系统在移动设备、物联网等新兴领域的应用案例
4、教学内容
-操作系统接口与用户交互
-命令行接口(CLI)与图形用户界面(GUI)
-操作系统提供的系统调用与服务
-操作系统的网络功能
-网络协议栈的基础知识
-操作系统在网络通信中的作用
-操作系统的虚拟化技术
-虚拟化技术的原理与应用
-虚拟机监控器(VMM)的作用与分类
-探讨操作系统在人机交互方面的未来发展趋势
-评估开源操作系统的标准化程度及其对行业的影响
操作系统课程设计题目
一、教学内容
本章节内容来自《操作系统》课程,针对高二年级学生,选择以下课程设计题目:
1.章节一:操作系统概述
-操作系统Hale Waihona Puke 基本概念-操作系统的历史与发展
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书(操作系统)题目:进程调度院系:计算机科学与工程学院专业班级:信息安全13-2学号:20133029xx学生姓名:xx指导教师:xx2015年12月15日安徽理工大学课程设计(论文)任务书计算机科学与工程学院安徽理工大学课程设计(论文)成绩评定表摘要现代计算机系统中,进程是资源分配和独立运行的基本单位,是操作系统的核心概念。
因而,进程就成为理解操作系统如何实现系统管理的最基本,也是最重要的概念。
进程调度是进程管理过程的主要组成部分,是必然要发生的事件。
在现代操作系统中,进程的并发机制在绝大多数时候,会产生不断变化的进程就绪队列和阻塞队列。
处于执行态的进程无论是正常或非正常终止、或转换为阻塞状态,都会引发从就绪队列中,由进程调度选择一个进程进占CPU。
进程调度的核心是进程调度的算法.在本课程设计中,用良好清晰的界面向用户展示了进程调度中的时间片轮转调度算法。
在最终实现的成果中,用户可指定需要模拟的进程数,CPU时间片和进程的最大执行时间,并且选择需要演示的算法,界面将会动态的显示进程调度过程及各个队列的变化。
通过此进程调度模拟系统,用户可以对时间片轮转调度算法有进一步以及直观的了解。
关键词:进程,调度,PCB,时间片轮转目录1.设计目的 (6)2.设计思路 (6)3.设计过程 (8)3.1流程图 (8)3.2算法 (8)3.3数据结构 (10)3.4源代码 (10)4.实验结果及分析 (20)4.1 使用说明 (20)4.2程序演示 (20)5.实验总结 (24)6.参考文献 (24)1.设计目的根据设计任务,用自己熟悉的计算机语言编制程序,在机器上调试运行,并通过上机考核。
编写一程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转。
虚拟程序的描述:虚拟指令的格式:操作命令操作时间其中,操作命令有以下几种:C : 表示在CPU上计算I :表示输入O:表示输出W:表示等待H:表示进程结束操作时间代表该操作命令要执行多长时间假设I/O设备的数量没有限制I、O、W三条指令实际上是不占用CPU的,执行这三条指令就应将进程放入对应的等待队列(Input等待队列、Output等待队列、Wait等待队列)例有一虚拟程序p1.prc描述如下:c 30 o 12 c 9 i 14 h 0该虚拟程序表示的含义是:先在CPU上计算30秒,再在输出设备上输出12秒,计算9 秒,在输入设备上输入14秒,程序结束。
2.设计思路进程调度是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。
在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。
本程序用时间片轮转调度算法对多个进程进行调度,每个进程有三个状态就绪、运行和完成,初始状态为就绪状态。
时间片轮转调度算法中,系统将所有的就绪进程按先来先服务算法的原则,排成一个队列,每次调度时,系统把处理机分配给队列首进程,并让其执行一个时间片。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序根据这个请求停止该进程的运行,将它送到就绪队列的末尾,再把处理机分给就绪队列中新的队列首进程,同时让它也执行一个时间片。
(1)建立一个进程控制块。
PCB来代表。
PCB包括:进程名、链接指针、到达时间、估计运行时间、剩余时间和进程状态。
进程状态分为就绪(W)、运行(R)和完成(F)。
(2)为每个进程任意确定一个要求运行时间和到达时间。
(3)按照进程到达的先后顺序排成一个循环队列。
再设一个对首指针指向第一个到达进程的首址。
(4)执行处理机调度时,开始选择对首的第一个进程运行。
另外再设一个当前运行进程的指针,指向当前正运行的进程。
(5)执行:a)预计运行时间减1;b)输出当前运行进程的名字。
(6)进程执行一次后,若该进程的剩余运行时间为零,则将该进程的状态置为完成态F,并退出循环队列;若不为空,则将其移至队尾。
继续在运行队首的进程。
(7)若就绪队列不空,则重复上述的(5)和(6)步骤直到所有进程都运行完为止。
在所设计的调度程序中,要求包含显示或打印语句。
以便显示或打印每次选操作系统课程设计中进程的名称及运行一次后队列的变化情况。
3.设计过程3.1流程图3.2算法如果就绪队列中有n个进程,且时间片为q,则每个进程会得到的CPU 时间,每个长度不超过q时间单元。
每个进程必须等待CPU的时间不会超过(n-1)q个时间单元,直到它的下一个时间片为止void Run (){int i, flag=0, time=10, pcbnum, Index=0, exenum, num, quenum;char cmd;int j,m,n;int total=0;JobEnQueueInit( &total );save();while( total!=0 ){if( !EmptyQueue( Queue[1]) ){outqueue(&Queue[1],&pcbnum);insertqueue(&Queue[0], pcbnum);}else pcbnum=GetHead(Queue[0]);delay();jobpcb[ pcbnum].status='e';printf(" \n\t\t作业%d \n",pcbnum+1);printf(" \t\t\t所处状态: %c \t执行了%d 秒\n", jobpcb[ pcbnum].status, time);for(i=0;i<3;i++){if(jobpcb[i].id>=0){//所有的作业除在就绪队列获执行结束的外等待时间都减去时间片if( jobpcb[i].status!='r'&&jobpcb[i].status!='h') jobpcb[i].wtime=jobpcb[i].wtime-time;if(jobpcb[i].wtime<=0){ //查找所有的队列所在位置for(j=0;j<5;j++){for(m=Queue[j].head;m<Queue[j].tail;m++){if(Queue[j].pcbnum[m]==i) {flag=1;break; }}if(flag==1) break;}if(flag==1){ //删除该指令for(n=m;n<Queue[j].tail;n++)Queue[j].pcbnum[n]=Queue[j].pcbnum[n+1];Queue[j].tail--;jobpcb[i].exetoIndex++;Index=jobpcb[i].exetoIndex;JobEnQueue( i,Index,&total );}}}}if(!EmptyQueue( Queue[1]) ){outqueue(&Queue[0],&pcbnum);if(jobpcb[pcbnum].wtime>0){insertqueue(&Queue[1], pcbnum);jobpcb[pcbnum].status='r';}}printf(" \n\n\t\t 还有\t %d 个作业没有完成\n",total );save();}}3.3数据结构void delay()int change(char *m)int AllocPCB()int AllocJob()void displayIndex()int CreatePcbLine()void initqueue(struct Qnode *l)void insertqueue(struct Qnode *l,int pcbnum)int EmptyQueue( struct Qnode l)void outqueue(struct Qnode *l,int *pcbnum)void display()void JobEnQueueInit( int * total)void save ()void JobEnQueue( int pcbnum,int Index ,int *total)int GetHead(struct Qnode l)void Run ()void InitFile()3.4源代码//进程调度模拟程序,以时间片轮转调度算法为核心#define NULL 0#include <stdio.h>#include <conio.h>#include <string.h>#include <malloc.h>#include <time.h>FILE *GroupFile[10];//定义一个pcb的结构体typedef struct index{char name; //指令int time; //指令执行时间}index;struct pcb {char filename[10]; //进程名int id; //作业编号int exetoIndex; //当前正在执行指令char status; //当前状态int wtime; //等待时间};struct pcb jobpcb[100]; //pcb表typedef struct job{index idx[100]; //指令集int pcbnum; //pcb编号对应}job;job jobtab[100]; //作业表char jobp[3][50]; //作业//队列结构体struct Qnode{int pcbnum[100]; //pcb编号int head,tail;};struct Qnode Queue[5]; //5个队列0E 1R 2I 3O 4W void initqueue(struct Qnode *l);//延迟void delay( ){time_t begin,end;time(&begin);do {time(&end);} while((end-begin)<=1);}//字符转化为数值int change(char *m){int i,j=0;int len=strlen(m);for(i=0;i<len;i++)j=j*10+m[i]-'0';return j;}//申请pcb进程块int AllocPCB(){int i;for(i=0;i<3;i++)if(jobpcb[i].id ==-1) break;if(i<3)return i;return -1;}//申请jobint AllocJob(){int i;for(i=0;i<3;i++)if(jobtab[i].pcbnum == -1) break;if(i<3)return i;return -1;}//显示指令void displayIndex(){int i,j;for(i=0;i<3;i++){printf(" Job % d \n",i+1);for(j=0;j<10;j++)printf(" %d %c % d \n",j+1, jobtab[i].idx[j].name,jobtab[i].idx[j].time);}}//创建进程程序int CreatePcbLine(){char line[10];int i,ll,jnum, pnum, ln=0, bpos, pos=0;char buff[50];char name [20];char ch;for(i=0;i<3;i++){ln=0;jnum=AllocJob();if(jnum == -1) return 0;pnum=AllocPCB();if(pnum == -1) return 0;jobtab[jnum].pcbnum=pnum;strcpy(jobpcb[pnum].filename," ");jobpcb[pnum].status='r';jobpcb[pnum].exetoIndex=0;jobpcb[pnum].id=jnum;jobpcb[pnum].wtime=0;int len=strlen(jobp[i]);pos=0;while(pos<len){while(jobp[i][pos]==' ') pos++;jobtab[jnum].idx[ln].name=jobp[i][pos++];///while(jobp[i][pos]==' ') pos++;bpos=0;while(jobp[i][pos]!=' ')buff[bpos++]=jobp[i][pos++];buff[bpos]='\0';jobtab[jnum].idx[ln].time=change(buff);/////if(pos<len) {pos++;ln++;}}}displayIndex();}//初始化队列void initqueue(struct Qnode *l){l->head=0;l->tail=0;}//插进入队列/void insertqueue(struct Qnode *l,int pcbnum){l->pcbnum[l->tail++]=pcbnum;}//队列是否为空int EmptyQueue( struct Qnode l){if(l.head==l.tail) return 1;return 0;}//删除队列void outqueue(struct Qnode *l,int *pcbnum){if (l->head>=l->tail ) *pcbnum=-1;else*pcbnum=l->pcbnum[l->head++];}//显示作业void display(){int i,j;for(i=0;i<5;i++){printf(" 队列%d ",i);for(j=Queue[i].head;j<Queue[i].tail;j++)printf("pcb 编号%d \n\n ",Queue[i].pcbnum[j]);}}//作业入队列void JobEnQueueInit( int * total){int i,num ,Index=0;char cmd;for( i=0;i<3;i++)if(jobpcb[i].id>=0){cmd=jobtab[ jobpcb[i].id ].idx[ Index ].name;switch(cmd){case 'c': insertqueue(& Queue[1],i); jobpcb[i].status='r'; break;case 'i': insertqueue(& Queue[2],i);jobpcb[i].status='i'; break;case 'o': insertqueue(& Queue[3],i);jobpcb[i].status='o'; break;case 'w': insertqueue(& Queue[4],i);jobpcb[i].status='w'; break;case 'h':jobpcb[i].status='h'; num=jobpcb[i].id;jobtab[num].pcbnum=-1;jobpcb[i].id=-1;}if(cmd== 'h') {jobpcb[i].wtime=0; total--;}jobpcb[i].wtime=jobtab [ jobpcb[i].id ].idx[Index].time;(*total)++;}}//保存结果void save (){FILE *fp;int i;fp=fopen("pcbtable.txt","a");fprintf(fp," 文件名作业编号执行到指令数所处状态等待时间\n" );for(i=0;i<3;i++)fprintf(fp," \t %s \t %d \t %d \t %c \t %d \n" ,jobpcb[i].filename,jobpcb[i].id,jobpcb[i].exetoIndex,jobpcb[i].status,jobpcb[i].wtime );fclose(fp);}//作业入队列void JobEnQueue( int pcbnum,int Index ,int *total){int num;char cmd;if(jobpcb[pcbnum].id>=0){cmd=jobtab[ jobpcb[pcbnum].id ].idx[ Index ].name;switch(cmd){case 'c': insertqueue(&Queue[1],pcbnum); jobpcb[pcbnum].status='r'; break;case 'i': insertqueue(& Queue[2],pcbnum);jobpcb[pcbnum].status='i'; break;case 'o': insertqueue(&Queue[3],pcbnum);jobpcb[pcbnum].status='o'; break;case 'w': insertqueue(& Queue[4],pcbnum);jobpcb[pcbnum].status='w'; break;case 'h': jobpcb[pcbnum].status='h'; num=jobpcb[pcbnum].id;jobtab[num].pcbnum=-1;jobpcb[pcbnum].id=-1;}if(cmd== 'h') {jobpcb[pcbnum].wtime=0;printf(" \n\t\t作业%d 完成\n", pcbnum+1, jobpcb[ pcbnum].status);(*total)--;}else jobpcb[pcbnum].wtime=jobtab [ jobpcb[pcbnum].id ].idx[Index].time;printf(" \n\t\t作业%d \n ", pcbnum+1);printf("\t\t\t\t所处状态:%c \n",jobpcb[ pcbnum].status);printf("\t\t还需要时间%d 秒\n",jobpcb[ pcbnum].wtime);}}//得到队列的首元素int GetHead(struct Qnode l){return l.pcbnum[l.head];}//执行void Run (){int i, flag=0, time=10, pcbnum, Index=0, exenum, num, quenum;char cmd;int j,m,n;int total=0;JobEnQueueInit( &total );save();while( total!=0 ){if( !EmptyQueue( Queue[1]) ){outqueue(&Queue[1],&pcbnum);insertqueue(&Queue[0], pcbnum);}else pcbnum=GetHead(Queue[0]);delay();jobpcb[ pcbnum].status='e';printf(" \n\t\t作业%d \n",pcbnum+1);printf(" \t\t\t所处状态: %c \t执行了%d 秒\n", jobpcb[ pcbnum].status, time);for(i=0;i<3;i++){if(jobpcb[i].id>=0){//所有的作业除在就绪队列获执行结束的外等待时间都减去时间片if( jobpcb[i].status!='r'&&jobpcb[i].status!='h') jobpcb[i].wtime=jobpcb[i].wtime-time;if(jobpcb[i].wtime<=0){ //查找所有的队列所在位置for(j=0;j<5;j++){for(m=Queue[j].head;m<Queue[j].tail;m++){if(Queue[j].pcbnum[m]==i){flag=1;break; }}if(flag==1) break;}if(flag==1){ //删除该指令for(n=m;n<Queue[j].tail;n++)Queue[j].pcbnum[n]=Queue[j].pcbnum[n+1];Queue[j].tail--;jobpcb[i].exetoIndex++;Index=jobpcb[i].exetoIndex;JobEnQueue( i,Index,&total );}}}}if(!EmptyQueue( Queue[1]) ){outqueue(&Queue[0],&pcbnum);if(jobpcb[pcbnum].wtime>0){insertqueue(&Queue[1], pcbnum);jobpcb[pcbnum].status='r';}}printf(" \n\n\t\t 还有\t %d 个作业没有完成\n",total );save();}}//初始化void InitFile(){int i;GroupFile[0]=fopen("p1.prc","r");GroupFile[1]=fopen("p2.prc","r");GroupFile[2]=fopen("p3.prc","r");fgets(jobp[0],255,GroupFile[0]);fgets(jobp[1],255,GroupFile[1]);fgets(jobp[2],255,GroupFile[2]);for(i=0;i<100;i++){jobpcb[i].exetoIndex=0;strcpy(jobpcb[i].filename," nothing");jobpcb[i].id=-1;jobpcb[i].status='r';jobpcb[i].wtime=0;}for(i=0;i<100;i++)jobtab[i].pcbnum=-1;for(i=0;i<5;i++)initqueue(&Queue[i]);}int main(){char start;printf("欢迎界面");start=getch();if(start!=NULL){InitFile();CreatePcbLine();Run ();}return 0;}4.实验结果及分析4.1 使用说明先用文本编辑器写三个虚拟程序保存在改程序目录下,可以分别命名为p1.prc p2.prc p3.prc。