操作系统课程试验
操作系统 课程实验-实验四页式虚拟存储管理中地址转换和缺页中断

实验四页式虚拟存储管理中地址转换和缺页中断一、实验目的深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中如何处理缺页中断。
二、实验预备知识页式存储管理中地址转换的方法;页式虚拟存储的缺页中断处理方法。
三、实验内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。
实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定主存64KB,每个主存块1024字节,作业最大支持到64KB,系统中每个作业分得主存块4块。
四、提示与讲解页式存储管理中地址转换过程很简单,假定主存块的大小为2n字节,主存大小为2m'字节和逻辑地址m位,则进行地址转换时,首先从逻辑地址中的高m-n位中取得页号,然后根据页号查页表,得到块号,并将块号放入物理地址的高m'-n位,最后从逻辑地址中取得低n位放入物理地址的低n位就得到了物理地址,过程如图6所示。
逻辑地址图6 页式存储管理系统地址转换示意图地址转换是由硬件完成的,实验中使用软件程序模拟地址转换过程,模拟地址转换的流程如图7所示(实验中假定主存64KB,每个主存块1024字节,即n=10,m'=16,物理地址中块号6位、块内地址10位;作业最大64KB,即m=16,逻辑地址中页号6位、页内地址10位)。
在页式虚拟存储管理方式中,作业信息作为副本放在磁盘上,作业执行时仅把作业信息的部分页面装入主存储器,作业执行时若访问的页面在主存中,则按上述方式进行地址转换,若访问的页面不在主存中,则产生一个“缺页中断”,由操作系统把当前所需的页面装入主存储器后,再次执行时才可以按上述方法进行地址转换。
页式虚拟存储管理方式中页表除页号和该页对应的主存块号外,至少还要包括存在标志(该页是否在主存),磁盘位置(该页的副本在磁盘上的位置)和修改标志(该页是否修改过)。
操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
操作系统实验报告6

操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。
三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。
通过编写简单的C++程序,使用Windows API 函数创建多个进程。
在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。
2、进程间通信实现了进程间的管道通信和消息传递。
通过创建管道,让两个进程能够相互交换数据。
同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。
(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。
观察内存使用情况,了解内存碎片的产生和处理。
2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。
(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。
通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。
2、目录操作实现了目录的创建、删除、遍历等功能。
了解了目录结构在文件系统中的组织方式和管理方法。
四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。
2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。
3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。
操作系统实验

操作系统实验操作系统实验是计算机科学与技术领域非常重要的一门实验课程。
通过操作系统实验,学生可以深入了解操作系统的基本原理和实践技巧,掌握操作系统的设计和开发方法。
本文将介绍操作系统实验的一般内容和实验室环境要求,并详细说明一些常见的操作系统实验内容。
一、实验内容1. 实验环境搭建:操作系统实验通常在实验室中进行。
为了完成实验,学生需要搭建一个操作系统实验环境。
实验环境通常由一个或多个计算机节点组成,每个计算机节点需要安装操作系统实验所需要的软件和驱动程序。
2. 操作系统整体结构分析:学生首先需要通过文献研究和课堂学习,了解操作系统的整体结构和基本原理。
在实验中,学生需要分析和理解操作系统的各个模块之间的功能和相互关系。
3. 进程管理实验:进程是操作系统中最基本的运行单位。
在这个实验中,学生可以通过编写程序并使用系统调用来实现进程的创建、销毁和调度。
学生需要熟悉进程状态转换和调度算法,理解进程间通信和同步机制。
4. 内存管理实验:内存管理是操作系统中非常重要的一个模块。
学生需要实现虚拟内存管理、页面置换算法以及内存分配和回收策略。
通过这个实验,学生可以深入了解虚拟内存管理的原理和实际应用。
5. 文件系统实验:文件系统是操作系统中负责管理文件和目录的模块。
在这个实验中,学生需要实现基本的文件系统功能,如文件的创建、读取和修改。
学生还可以实现进程间的文件共享和保护机制。
6. 设备管理实验:设备管理是操作系统中与硬件设备交互的一个重要模块。
在这个实验中,学生需要实现设备的初始化、打开和关闭功能。
学生还可以实现设备驱动程序,完成对硬件设备的控制。
二、实验室环境要求1. 计算机硬件:实验室需要配备一定数量的计算机节点。
每个计算机节点需要具备足够的计算能力和内存容量,以满足操作系统实验的要求。
2. 操作系统软件:实验室中的计算机节点需要安装操作系统软件,通常使用Linux或者Windows操作系统。
此外,还需要安装相关的开发工具和编程语言环境。
Windows操作系统实验

第2章Windows操作系统实验实验一Windows基本操作作业要求(1)将打开的窗口层叠,在各窗口中进行切换,并改变窗口的大小,这里要分清窗口右上角的三个按钮的作用。
注意:窗口在最小化时,程序仍在运行,单击“任务栏”窗口中的相关按钮,窗口即恢复。
(2)对菜单栏菜单、快捷菜单进行操作,注意菜单命令的各种不同形式。
(3)打开一个对话框,熟悉其中的各个操作元素。
实验二文件管理操作作业要求在Windows实验素材库建立了如图2-6所示的文件夹结构。
从相应网站下载该实验素材文件夹中的EXERCISE文件夹到D盘根目录下,完成以下操作:(1)在D盘根目录下建立如图2-7所示的文件夹结构。
(2)将EXERCISE文件夹下除TOOL以外的文件夹复制到STUDENT文件夹下。
(3)将STUDENT文件夹下的DOCUMENT文件夹下的文件移动到STUDENT1\WORD文件夹下。
(4)将ELSE文件夹重命名为WIN。
(5)删除VOICE和USER文件夹。
(6)恢复被删除的VOICE文件夹,彻底删除USER文件夹。
实验三运行程序和打开文档操作作业要求(1)选择“开始”菜单的“运行”命令运行计算器程序(Calc.exe)。
(2)选择“开始”菜单的“程序”命令运行画图程序。
(3)在“开始”菜单的“文档”中,找到一个近期使用过的文档,打开并编辑它。
(4)搜索“mspaint.exe”程序文件,并运行之。
实验四定制工作环境与计算机管理操作作业要求(1)在屏幕上找到“任务栏”窗口,将“任务栏”窗口隐藏或取消隐藏,并且改变“任务栏”窗口的大小。
(2)将自己喜爱的程序设置为屏幕保护程序。
(3)将自己喜爱的图片设置为桌面背景,并使图片平铺于桌面上。
(4)将桌面上的“我的电脑”图标拖动到任务栏的快速启动区。
(5)在桌面上创建“画图程序”的快捷方式。
实验五 Windows 2000综合练习作业要求从相应网站下载Windows实验素材文件夹中的EXERCISE文件夹到D盘根目录下,然后在EXERCISE文件夹下完成以下操作:(1)在USER文件夹下建立如下所示的文件夹结构。
操作系统教学实践(3篇)

第1篇一、引言操作系统是计算机科学与技术领域的重要基础课程,它涉及计算机系统的资源管理、进程管理、存储管理、文件系统等多个方面。
为了提高学生对操作系统的理解和掌握程度,本文将从教学实践的角度,探讨如何进行操作系统教学。
二、教学目标1. 使学生掌握操作系统的基本概念、原理和关键技术;2. 培养学生分析和解决实际问题的能力;3. 增强学生的团队协作和创新能力;4. 提高学生的编程能力和动手能力。
三、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、分类和特点;2. 进程管理:讲解进程的概念、进程状态、进程调度算法和进程同步与互斥;3. 存储管理:分析内存分配策略、页面置换算法和虚拟内存技术;4. 文件系统:探讨文件系统的概念、目录结构、文件操作和存储设备管理;5. 设备管理:介绍设备的分类、驱动程序、I/O控制方式和中断处理;6. 网络操作系统:讲解网络操作系统的基本概念、网络协议、网络设备管理和网络安全。
四、教学实践1. 案例教学:通过实际案例,引导学生分析操作系统的原理和应用。
例如,以Linux系统为例,讲解进程调度、内存管理和文件系统等知识点。
2. 实验教学:设计实验项目,让学生动手实践操作系统的相关知识。
实验项目包括:(1)进程调度实验:让学生编写进程调度算法,实现进程的创建、调度和同步。
(2)内存管理实验:让学生实现内存分配、页面置换和虚拟内存等技术。
(3)文件系统实验:让学生实现文件系统的目录结构、文件操作和存储设备管理。
(4)设备管理实验:让学生编写设备驱动程序,实现设备的控制和管理。
3. 项目教学:以实际项目为背景,让学生分组完成项目开发。
项目可以包括:(1)操作系统模拟器:让学生模拟操作系统的运行过程,加深对操作系统原理的理解。
(2)嵌入式操作系统开发:让学生了解嵌入式操作系统的特点,掌握嵌入式开发技能。
(3)分布式操作系统开发:让学生了解分布式系统的原理,掌握分布式操作系统的开发方法。
《操作系统》课程实验内容和实验要求

实验内容和实验要求实验1:安装Linux系统(4学时)目的:1.学会在操作系统安装之前,根据硬件配置情况,制订安装计划。
2.学会在安装多操作系统前,利用硬盘分区工具(如PQMagic)为Linux准备分区。
3.学会Linux操作系统的安装步骤和简单配置方法。
4.学会Linux系统的启动、关闭步骤,初步熟悉Linux系统的用户界面。
内容:1.安装并使用硬盘分区工具(如PQMagic),为Linux准备好分区。
2.安装Linux系统(如红旗Linux桌面版)。
3.配置Linux系统运行环境。
4.正确地启动、关闭系统。
5.对图形界面进行一般操作。
要求:1.制订安装计划。
2.如果在机器上已安装了Windows系统,而且没有给Linux预备硬盘分区,则安装硬盘分区工具(如PQMagic),运行它,为Linux划分出一块“未分配”分区。
3.在光驱中放入Linux系统安装盘,启动系统。
按照屏幕提示,选择/输入相关参数,启动安装过程。
4.安装成功后,退出系统,取出安装盘。
重新开机,登录Linux系统。
5.对Linux系统进行配置,如显示设备、打印机等。
6.利用鼠标对图形界面进行操作。
说明:1.本实验应在教师的授权和指导下进行,不可擅自操作,否则可能造成原有系统被破坏。
2.如条件不允许每个学生亲自安装,可采用分组进行安装或课堂演示安装的方式。
实验2:Linux 应用及shell编程(4学时)目的:1.掌握Linux一般命令格式和常用命令。
2.学会使用vi编辑器建立、编辑文本文件。
3.了解shell的作用和主要分类。
4.学会bash脚本的建立和执行方式。
5.理解bash的基本语法。
6.学会编写简单的shell脚本。
内容:1.正确地登录和退出系统。
2.熟悉使用date,cal等常用命令。
3.进入和退出vi。
利用文本插入方式建立一个文件。
4.学会用gcc编译器编译C程序。
5.建立shell脚本并执行它。
6.学会使用shell变量和位置参数、环境变量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章处理机管理7.1实验内容处理机管理是操作系统中非常重要的部分。
为深入理解进程管理部分的功能,设计几个调度算法,模拟实现处理机的调度。
7.2实验目的在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。
也就是说能运行的进程数远远大于处理机个数。
为了使系统中的各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用处理机。
要求学生设计一个模拟单处理机调度的算法,以巩固和加深处理机调度的概念。
7.3实验题目7.3.1设计一个按先来先服务调度的算法提示(1)假设系统中有5个进程,每个进程由一个进程控制块(PCB)来标识。
进程控制块内容如图7-1所示。
进程名即进程标识。
链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。
指针指出下一个到达进程的进程控制块首地址。
最后一个进程的链指针为NULL。
估计运行时间:可由设计者指定一个时间值。
达到时间:进程创建时的系统时间或由用户指定。
调度时,总是选择到达时间最早的进程。
进程状态:为简单起见,这里假定进程有两种状态:就绪和完成。
并假定进程一创建就处于就绪状态,用R表示。
当一个进程运行结束时,就将其置成完成状态,用C表示。
(2)设置一个队首指针head,用来指出最先进入系统的进程。
各就绪进程通过链接指针连在一起。
(3)处理机调度时总是选择队首指针指向的进程投入运行。
由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:估计运行时间减1用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。
(4)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名,已运行是、还剩时间,就绪队列中的进程等。
所有进程运行完成是,给出各进程的周转时间和平均周转时间。
先来先服务(FCFS)调度算法/*源程序1.cpp,采用先来先无法法在Visual C++ 6.0下调试运行*//*数据结构定义及符号说明*/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;enum STATUS {RUN,READY,WAIT,FINISH};struct PCBNode{int processID; //进程IDSTATUS status; //进程状态int reqTime; //总的需要运行时间int remainTime; //剩下需要运行时间int arriveTime; //进入就绪队列时间int startTime; //开始运行时间int finishTime; //结束运行时间int totalTime; //周转时间float weightTotalTime; //带权周转时间};struct QueueNode //队列结点结构{int ID; //进程IDstruct QueueNode * next; //队列中下一个进程指针};struct LinkQueue //队列结构{QueueNode *head;//队首};void Fcfs(LinkQueue& R, int& totalTimeSum, int& weightTotalTimeSum,PCBNode * ProcessTable);void InitialQueue(LinkQueue& R,PCBNode * ProcessTable,const int processnum);//初始化就绪队列Rvoid Input(PCBNode * ProcessTable, const int processnum);//从input.txt文件输入数据int main(){LinkQueue R; //就绪队列RR.head = NULL; //首地址为空const int processnum =5;//进程数为5int totalTimeSum = 0; //定义周转时间int WeightTotalTimeSum = 0;//定义带权周转时间PCBNode * ProcessTable=new PCBNode[processnum]; //建立进程表Input(ProcessTable, processnum); //输入进程表,进程数InitialQueue(R, ProcessTable, processnum); //初始队列Fcfs(R, totalTimeSum,WeightTotalTimeSum,ProcessTable); //定义为FCFS结构 cout<<"先来先服务的平均周转时间为:"<<totalTimeSum/processnum<<endl;cout<<"先来先服务的平均带权周转时间为:"<<WeightTotalTimeSum/processnum<<endl;//输出结果delete [] ProcessTable;//删除进程表return 0;}void Fcfs(LinkQueue& R, int& totalTimeSum, int& weightTotalTimeSum,PCBNode * ProcessTable)//初始化FCFS{totalTimeSum = 0;//初始化周转时间weightTotalTimeSum = 0;//初始化平均周转时间QueueNode* p;QueueNode* q;//队列结点p、qp = R.head->next;//头结点指向下一个结点为pif (p !=NULL ) //设p不为空{ProcessTable[p->ID].startTime = ProcessTable[p->ID].arriveTime;//进程表p进程开始时间=到达时间ProcessTable[p->ID].finishTime = ProcessTable[p->ID].arriveTime + ProcessTable[p->ID].reqTime;//进程表p进程结束时间=到达时间}for(q=p->next; q!=NULL; q=q->next)// for循环{if (ProcessTable[q->ID].arriveTime < ProcessTable[p->ID].finishTime)//如果进程表q进程到达时间<p进程结束时间{ProcessTable[q->ID].startTime = ProcessTable[p->ID].finishTime;//进程表q进程开始时间=p进程结束时间ProcessTable[q->ID].finishTime = ProcessTable[p->ID].finishTime+ProcessTable[q->ID].reqTime;//进程表q进程结束时间=p 进程结束时间+q进程总需要时间else{ProcessTable[q->ID].startTime = ProcessTable[q->ID].arriveTime;//进程表q进程开始时间=q进程到达时间ProcessTable[q->ID].finishTime = ProcessTable[q->ID].arriveTime+ProcessTable[q->ID].reqTime;//进程表q进程结束时间=q 进程到达时间+q进程总需要时间}p = q;}for(q=R.head->next; q!=NULL; q=q->next)//for循环{ProcessTable[q->ID].totalTime = ProcessTable[q->ID].finishTime - ProcessTable[q->ID].arriveTime;//进程表q周转时间=q进程结束时间-q进程到达时间 ProcessTable[q->ID].weightTotalTime = ProcessTable[q->ID].totalTime/ProcessTable[q->ID].reqTime; //进程表q带权周转时间=q进程周转时间/q进程总需时间totalTimeSum += ProcessTable[q->ID].totalTime;//周转总时间=q进程周转时间+总周转时间weightTotalTimeSum += ProcessTable[q->ID].weightTotalTime;//带权周转总时间=q进程带权周转时间+带权周转总时间}int t = 0;//定义时间tfor(q=R.head->next; q!=NULL; q=q->next)//for循环{cout<<"*********************"<<endl;//输出while ( t<ProcessTable[q->ID].finishTime )//当进程表q进程结束时间<T时 {cout<<"时刻"<<t<<": 进程"<<q->ID<<"活动"<<endl;//输出时间和进程ID t++;}if (q->next != NULL)//设q指向的下个结点不为空{cout<<"时刻"<<t<<": 进程"<<q->ID<<"结束活动,开始下一个进程."<<endl;//输出cout<<"进程"<<q->ID<<"的周转时间为: "<<ProcessTable[q->ID].totalTime<<endl;//输出周转时间cout<<"进程"<<q->ID<<"的带权周转时间为: "<<ProcessTable[q->ID].weightTotalTime<<endl<<endl;//输出带权周转时间 }elsecout<<"时刻"<<t<<": 进程"<<q->ID<<"结束活动."<<endl<<endl;//输出 cout<<"进程"<<q->ID<<"的周转时间为: "<<ProcessTable[q->ID].totalTime<<endl;//输出cout<<"进程"<<q->ID<<"的带权周转时间为: "<<ProcessTable[q->ID].weightTotalTime<<endl<<endl; //输出}}cout<<"所有进程结束活动."<<endl<<endl;//输出p = R.head;//头结点为pfor(q=p->next; q!=NULL; q=q->next)//for循环{delete p;//删除pp = q;}}void InitialQueue(LinkQueue& R, PCBNode * ProcessTable,const int processnum) {for (int i=0;i<processnum;i++)//for循环,定义i为进程数{ProcessTable[i].processID=i;//进程表ID号与i对应ProcessTable[i].reqTime=ProcessTable[i].remainTime;//进程表所总需要时间=进程表剩下需要时间ProcessTable[i].finishTime=0;//完成时间ProcessTable[i].startTime=0;//开始时间ProcessTable[i].status=WAIT;//进程状态为等待ProcessTable[i].totalTime=0;//周转时间ProcessTable[i].weightTotalTime=0;//带权周转时间}R.head = new QueueNode;//头指针为新结点R.head->next = NULL;//头指针指向为空QueueNode * p;QueueNode * q;//定义结点q,pfor (i=0;i<processnum;i++)//for循环{p = new QueueNode;//p为新结点p->ID = i;//p的ID号与i对应p->next = NULL;//p指向空if (i == 0)//设i为0{R.head->next = p;//头指针指向p}elseq->next = p;//q指向pq = p;}}void Input(PCBNode * ProcessTable, const int processnum){FILE *fp; //读入进程的相关内容if((fp=fopen("input.txt","r"))==NULL)//设input.txt文件为空{cout<<"can not open file!"<<endl;//输出exit(0);}for(int i=0;i<processnum;i++)//for循环{fscanf(fp,"%d %d %d",&ProcessTable[i].arriveTime,&ProcessTable[i].remainTime);//扫描进程到达时间,还剩需要时间}fclose(fp);}或者改进,要做到没有错误,有一定的难度。