操作系统课程设计35815

合集下载

操作系统-课程设计

操作系统-课程设计

操作系统-课程设计一、教学目标本章节的教学目标分为三个部分:知识目标、技能目标和情感态度价值观目标。

知识目标:通过本章节的学习,学生需要掌握操作系统的概念、原理和基本功能,包括进程管理、内存管理、文件系统和设备管理等方面的知识。

技能目标:学生能够运用所学知识分析和解决操作系统相关的问题,具备基本的操作系统使用和维护能力。

情感态度价值观目标:培养学生对操作系统的兴趣和好奇心,提高学生对计算机科学的热爱和责任感。

二、教学内容本章节的教学内容主要包括以下几个部分:1.操作系统的概念和作用:介绍操作系统的定义、功能和作用,以及操作系统的发展历程。

2.进程管理:讲解进程的定义、特点和基本管理方法,包括进程调度、进程同步和进程通信等内容。

3.内存管理:介绍内存的概念、分类和分配策略,以及内存管理的具体方法,如分页、分段和虚拟内存等。

4.文件系统:讲解文件和文件夹的概念、方式和存储结构,以及文件系统的管理方法,如目录结构、文件读写和磁盘空间分配等。

5.设备管理:介绍设备的分类、设备驱动程序和设备管理的基本方法,包括输入输出控制、中断处理和DMA传输等。

三、教学方法为了提高教学效果,本章节将采用多种教学方法相结合的方式进行教学:1.讲授法:通过讲解操作系统的概念、原理和基本功能,使学生掌握操作系统的相关知识。

2.案例分析法:通过分析具体的操作系统案例,使学生更好地理解和掌握操作系统的原理和方法。

3.实验法:安排实验室实践环节,让学生亲自动手进行操作系统的实验操作,提高学生的实际操作能力。

4.讨论法:学生进行小组讨论,分享学习心得和经验,促进学生之间的交流与合作。

四、教学资源为了支持本章节的教学,我们将准备以下教学资源:1.教材:选用权威、实用的操作系统教材,为学生提供系统、全面的学习资料。

2.参考书:推荐学生阅读一些优秀的操作系统参考书籍,丰富学生的知识体系。

3.多媒体资料:制作精美的PPT课件,为学生提供直观、生动的学习界面。

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

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

操作系统课程设计简介操作系统课程设计旨在让学生通过设计和开发一个简单的操作系统来深入了解操作系统的基本概念和原理。

在本文档中,我们将介绍课程设计的主要内容,包括设计目标、技术要求和项目要求。

设计目标操作系统课程设计的主要设计目标是让学生掌握操作系统的基本原理和技术。

通过这个项目,学生应该能够:•理解操作系统的基本概念和原理•实现一个简单的操作系统内核•学会编写和调试操作系统的核心代码•掌握计算机系统底层的技术和知识技术要求操作系统课程设计的技术要求主要包括以下几点:编程语言操作系统课程设计要求学生使用C或Assembly等语言编写代码。

因为这些语言可以更好地控制计算机硬件,并且能够更好地实现操作系统。

系统架构操作系统课程设计要求学生设计和开发一个基于x86架构的操作系统内核。

这是因为x86架构被广泛使用,并且有很多相关的资料和资源可以参考。

开发环境操作系统课程设计要求学生使用VMware或VirtualBox等模拟器来模拟计算机硬件,以便在虚拟环境中测试和调试操作系统代码。

相关知识操作系统课程设计要求学生掌握计算机系统底层的知识和相关技术,如计算机组成原理、汇编语言、操作系统原理等。

项目要求操作系统课程设计的项目要求主要包括以下几点:设计和实现内核学生需要设计和实现一个简单的操作系统内核。

该内核应该具有基本的操作系统功能,如进程调度、CPU调度、内存管理等。

设计和实现系统调用学生需要设计和实现系统调用,并提供相应的API。

系统调用应该能够支持常见的操作系统功能,如文件管理、进程管理等。

实现Shell学生需要实现一个简单的Shell程序,该程序应该能够支持常见的Shell命令,并且能够与操作系统内核进行交互。

测试和调试学生需要在虚拟机中测试和调试操作系统内核和相关代码。

该过程需要包括单元测试、集成测试和系统测试等不同层次的测试。

总结操作系统课程设计是一门重要的计算机科学课程,对于学生掌握操作系统的基本原理和技术是非常重要的。

操作系统课程设计

操作系统课程设计

操作系统课程设计一、课程设计要求本次操作系统课程设计,要求选定一个特定功能的操作系统,进行设计和开发。

1.系统要支持多用户同时登录。

2.系统要支持进程间通信,实现用户之间的数据传输。

3.系统要具备文件管理系统,支持文件的创建、读取、写入和删除等基本操作。

4.系统的安全性能要得到有效保障。

5.系统要提供一个用户界面,使得用户可以方便地使用该操作系统。

二、操作系统设计为了满足以上的需求,我们决定设计一个基于Linux内核的操作系统。

1. 多用户登录系统我们将通过在系统中建立多个用户账户,来实现多用户同时登录。

每个用户都有自己的目录,可以在此目录下进行文件的创建、读取、写入和删除等操作。

同时,为了保证安全性,我们将采用访问控制列表(ACL)的方式,对用户进行权限控制。

2. 进程间通信系统在本系统中,我们将采用信号量(Semaphore)的方式,通过在进程间共享内存,来实现进程间的通信。

举例说明,当两个用户需要进行数据传输时,他们可以通过先创建一个共享内存段,然后分别将数据写入到共享内存段中,再通知对方已经完成写入操作,并等待另一个进程完成相应的读取操作。

3. 文件管理系统本系统的文件管理系统将采用Linux系统的文件系统。

每个用户都会有自己的文件目录,可以在该目录下进行文件的创建、读取、写入和删除等操作。

同时,为了更好地实现用户文件管理,我们还将为每个用户提供一个专门的文件管理界面。

4. 安全性保障为了保证系统的安全性,我们将采用一系列措施,来限制用户对系统的访问。

具体措施包括:•设置密码策略:对用户密码的复杂度、有效期限等进行限制。

•限制用户权限:通过ACL来实现权限的管理,保证用户只能访问自己的目录和文件。

•提供安全日志管理机制:对系统的操作进行记录和检查,保证系统运行的安全性。

5. 用户界面设计为了方便用户使用本系统,我们将提供一个友好、易用的用户界面。

该界面将采用图形界面,提供一些基本的操作按钮,比如文件管理、用户管理、程序运行等,同时还将提供一些实用的小工具,比如日历、时钟等。

操作系统课程设计

操作系统课程设计
《操作系统》课程设计任务书
• 一、设计目的
– 学完《操作系统》课程后,进行一次全面的综合训练。 通过本课程设计,让学生更好地掌握计算机操作系统 的原理,加深对操作系统基础理论和重要算法的理解, 加强学生的动手能力。
– 在OS理论基础上,掌握Linux操作系统的使用方法;了 解Linux系统内核代码结构;掌握实例操作系统的实现 方法。
题目6
• 要求:进程调度的模拟实现 • 内容:
题目7
• 要求:生产者-消费者问题的模拟实现 • 内容:
题目8
• 要求:页面置换算法的模拟实现 • 内容:
– 设计一个虚拟存储区和内存工作区,编程序演 示算法的具体实现过程,并计算访问命中率。
– 需要实现的算法:
• 先进先出算法 FIFO • 最近最久未使用算法 LRU
课程设计报告内容与格式
• 主要内容
– (1)概述:设计主要完成的任务和解决的问题 – (2)设计原理:涉及的概念与原理 – (3)详细设计与编码:算法流程图、编码 – (4)结构分析 – (5)设计小结:本设计的特色、经验和体会 – (6)参考资料
• 大概格式如下
二、设计要求与资料提交
– 题目选定或自定,题目可以相同。但每学生必须 独立完成课程设计,严禁抄袭。
– 第2周周三、周四下午课设答辩,每学生讲述5 分钟,并提交一份正式纸质报告、以及电子文档 和源程序文档,交给指导教师。
三、设计内容
• 题目1:
• 要求:熟悉和理解Linux编程环境
• 内容
1)编写一个C程序,实现文件拷贝功能。
题目5
• 要求:银行家算法的模拟实现
• 内容:
– 用C/C++编程据结构
• 1)可利用资源向量Available • 2)最大需求矩阵Max • 3)分配矩阵Allocation • 4)需求矩阵Need

操作系统课程设计(完整规范版)

操作系统课程设计(完整规范版)

操作系统课程设计(完整规范版)一、设计目的操作系统课程设计旨在让学生深入了解操作系统的基本原理,掌握操作系统的设计与实现方法,培养学生在实际操作系统中分析和解决问题的能力。

通过本次课程设计,学生将能够:1. 加深对操作系统理论知识的理解与应用;2. 提高动手实践能力,培养创新精神和团队协作意识;3. 为今后从事操作系统相关领域的研究和工作奠定基础。

二、设计要求(1)进程管理:包括进程的创建、撤销、调度等;(2)内存管理:实现内存分配、回收、页面置换等;(3)文件系统:实现文件的创建、删除、读写等操作;(4)设备管理:实现设备的分配、回收、驱动等功能。

(1)代码规范:编写清晰、易读、易维护的代码;(3)团队协作:合理分工,确保团队成员共同参与、共同进步。

三、设计步骤1. 需求分析:分析课程设计所需实现的功能,明确各个模块的具体要求;2. 概要设计:根据需求分析,制定总体设计方案,划分模块,确定模块间接口;3. 详细设计:针对每个模块,进行具体实现方案的设计;4. 编码实现:按照设计文档,编写代码,实现各个功能模块;5. 测试与调试:对实现的功能进行测试,发现问题并进行调试;6. 优化与改进:根据测试结果,对代码进行优化,提高系统性能;四、预期成果1. 完成一套具有基本功能的模拟操作系统,能够演示进程管理、内存管理、文件系统和设备管理的主要操作;2. 提供完整的,包括注释,以便他人理解和学习;3. 形成一份详尽的课程设计报告,记录设计过程中的思考、遇到的问题及解决方案;4. 通过课程设计,提升个人在操作系统领域的理论知识和实践能力。

五、评价标准1. 功能完整性:各功能模块是否按照要求实现,系统是否能正常运行;3. 创新性:设计过程中是否有独特的想法,是否对现有技术有所改进;4. 团队协作:团队成员之间沟通是否顺畅,分工是否合理,协作是否高效;5. 文档质量:课程设计报告是否详细、准确,是否能够完整反映设计过程和成果。

c操作系统课课程设计

c操作系统课课程设计

c操作系统课课程设计一、教学目标本课程的教学目标是让学生掌握操作系统的基本原理和概念,了解操作系统的设计和实现方法,熟练使用操作系统的基本命令和工具,具备基本的操作系统编程能力。

具体来说,知识目标包括:掌握操作系统的五大功能模块,理解进程管理、内存管理、文件系统、输入/输出系统的基本原理和概念;掌握操作系统的主要发展和历史,了解操作系统的研究意义和应用领域。

技能目标包括:能够使用操作系统的基本命令和工具,进行文件操作、进程管理等;能够编写简单的操作系统程序,实现进程创建、进程同步等功能。

情感态度价值观目标包括:培养学生对操作系统的兴趣和热情,提高学生的问题解决能力和创新意识,培养学生的团队合作精神和自主学习能力。

二、教学内容本课程的教学内容主要包括操作系统的原理、设计和应用。

具体安排如下:1.引言:介绍操作系统的定义、发展历史和主要功能。

2.进程管理:介绍进程的概念、进程的状态、进程控制块、进程同步、进程通信等内容。

3.内存管理:介绍内存分配策略、内存保护、虚拟内存、页面置换算法等内容。

4.文件系统:介绍文件和目录的概念、文件存储结构、文件访问控制、文件系统的设计等内容。

5.输入/输出系统:介绍输入/输出设备的管理、设备驱动程序、中断处理、DMA传输等内容。

6.操作系统实例:分析Linux或Windows等主流操作系统的原理和实现。

三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法。

1.讲授法:用于讲解操作系统的原理、概念和算法。

2.讨论法:用于讨论操作系统的设计方法、优缺点比较和问题解决。

3.案例分析法:通过分析实际操作系统实例,让学生深入理解操作系统的实现和应用。

4.实验法:通过编写简单的操作系统程序,让学生动手实践,提高编程能力和问题解决能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。

1.教材:选择《操作系统概念》或《现代操作系统》等主流教材作为主要教学资源。

操作系统课设课程设计

操作系统课设课程设计

操作系统课设课程设计一、课程目标知识目标:1. 理解操作系统的基本概念,掌握操作系统的功能和作用;2. 学习操作系统的五大组成部分及其相互关系,了解常见操作系统的类型及特点;3. 掌握进程与线程的概念、状态及调度算法,了解并发与并行计算的基本原理;4. 学会分析文件系统的结构和管理方法,了解存储设备的使用和数据恢复技术;5. 了解操作系统在资源管理、安全性、性能优化方面的策略和实践。

技能目标:1. 能够运用所学知识,编写简单的进程调度算法,分析调度效果;2. 掌握操作系统中进程同步与互斥的基本方法,能够解决简单的并发问题;3. 学会使用操作系统提供的接口和工具,进行简单的系统编程和调试;4. 能够设计和实现一个简单的文件系统,进行文件的基本操作;5. 培养学生运用所学知识解决实际问题的能力,提高学生的动手实践能力。

情感态度价值观目标:1. 培养学生对操作系统课程的学习兴趣,激发学生的学习积极性;2. 培养学生具备良好的团队合作精神和沟通能力,提高学生在团队协作中的责任感;3. 培养学生具备严谨的科学态度和良好的学术道德,尊重知识产权;4. 通过学习操作系统的发展历程,培养学生热爱祖国、为我国信息技术产业发展贡献力量的情怀。

本课程针对高中年级学生,结合学生已具备的计算机基础知识和认知水平,注重理论与实践相结合,旨在提高学生对操作系统的理解与应用能力。

课程目标既关注知识传授,又强调技能培养和情感态度价值观的塑造,为学生的全面发展奠定基础。

在教学过程中,将根据课程目标分解具体学习成果,制定相应的教学策略和评估方法。

二、教学内容1. 操作系统的概念与作用:介绍操作系统的定义、发展历程、功能及作用;教材章节:第一章 操作系统概述2. 操作系统的五大组成部分:讲解处理器管理、存储管理、设备管理、文件管理、用户接口;教材章节:第二章 操作系统的基本组成3. 进程与线程:分析进程与线程的概念、状态、调度算法及并发与并行计算;教材章节:第三章 进程管理4. 进程同步与互斥:探讨操作系统中进程同步与互斥的方法,案例分析;教材章节:第四章 进程同步与互斥5. 存储管理:介绍内存分配、回收策略,虚拟内存技术;教材章节:第五章 存储管理6. 文件系统:讲解文件系统的结构、管理方法,文件操作及存储设备;教材章节:第六章 文件系统7. 操作系统性能与安全性:分析操作系统的性能优化策略、安全性措施;教材章节:第七章 操作系统性能与安全性8. 实践环节:安排操作系统相关的编程实践、案例分析等,巩固所学知识;教材章节:实践环节教学内容按照教材章节进行组织,确保科学性和系统性。

操作系统-课程设计

操作系统-课程设计

操作系统-课程设计一、课程目标知识目标:1. 理解操作系统的基本概念、功能、类型及发展历程;2. 掌握操作系统的五大功能模块(处理器管理、存储器管理、设备管理、文件管理、用户接口)的工作原理;3. 了解操作系统的安全性、稳定性和性能评价标准;4. 熟悉至少一种主流操作系统(如Windows、Linux)的安装、配置及使用。

技能目标:1. 能够使用操作系统基本命令进行文件管理、系统监控等操作;2. 学会编写简单的批处理脚本,实现自动化操作;3. 掌握操作系统设置、优化及故障排除的基本方法;4. 能够分析操作系统的性能问题,并提出合理的解决方案。

情感态度价值观目标:1. 培养学生对操作系统的兴趣,激发学习热情;2. 培养学生的团队协作精神,学会在团队中共同解决问题;3. 增强学生的信息安全意识,遵守网络道德规范,尊重知识产权;4. 培养学生的创新意识,敢于尝试新事物,勇于克服困难。

课程性质:本课程为信息技术学科,结合学生年级特点,注重理论与实践相结合,培养学生的实际操作能力。

学生特点:学生具备一定的计算机操作基础,对操作系统有一定了解,但深入理解不足,需要通过课程学习提高认识。

教学要求:以学生为主体,教师为主导,注重启发式教学,引导学生主动探究,提高学生的实践操作能力。

通过课程学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果,为后续相关课程的学习打下坚实基础。

二、教学内容1. 操作系统的基本概念:介绍操作系统的定义、功能、类型及发展历程,对应教材第一章内容。

2. 操作系统五大功能模块:- 处理器管理:讲解处理器分配、调度算法等,对应教材第二章;- 存储器管理:介绍内存分配、回收、地址映射等,对应教材第三章;- 设备管理:阐述设备分配、I/O调度、缓冲管理等,对应教材第四章;- 文件管理:讲解文件系统结构、文件存储、目录管理等,对应教材第五章;- 用户接口:介绍命令行接口、图形用户接口等,对应教材第六章。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书(操作系统)题目:进程调度院系:计算机科学与工程学院专业班级:信息安全13-2学号:20133029xx学生姓名:xx指导教师:xx2015年12月15日安徽理工大学课程设计(论文)任务书计算机科学与工程学院安徽理工大学课程设计(论文)成绩评定表摘要现代计算机系统中,进程是资源分配和独立运行的基本单位,是操作系统的核心概念。

因而,进程就成为理解操作系统如何实现系统管理的最基本,也是最重要的概念。

进程调度是进程管理过程的主要组成部分,是必然要发生的事件。

在现代操作系统中,进程的并发机制在绝大多数时候,会产生不断变化的进程就绪队列和阻塞队列。

处于执行态的进程无论是正常或非正常终止、或转换为阻塞状态,都会引发从就绪队列中,由进程调度选择一个进程进占CPU。

进程调度的核心是进程调度的算法.在本课程设计中,用良好清晰的界面向用户展示了进程调度中的时间片轮转调度算法。

在最终实现的成果中,用户可指定需要模拟的进程数,CPU时间片和进程的最大执行时间,并且选择需要演示的算法,界面将会动态的显示进程调度过程及各个队列的变化。

通过此进程调度模拟系统,用户可以对时间片轮转调度算法有进一步以及直观的了解。

关键词:进程,调度,PCB,时间片轮转目录1.设计目的 (6)2.设计思路 (7)3.设计过程 (9)3.1流程图 (9)3.2算法 (9)3.3数据结构 (13)3.4源代码 (14)4.实验结果及分析 (23)4.1 使用说明 (23)4.2程序演示 (24)5.实验总结 (27)6.参考文献 (28)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。

相关文档
最新文档