进程管理实验报告昆工
- 格式:doc
- 大小:148.50 KB
- 文档页数:14
实验名称: 进程管理实验要求:阅读后面的C语言实例,修改程序,使其优先数在运行期间可以变化(动态优先数)。
例如,当某进程被时间片中断次数增加到一定数目时,提高其优先权。
关键问题:读懂源程序代码,了解进程管理的方式,并设计一个算法使程序能在运行过程中修改进程优先级。
设计思路:在进程控制块中定义一个记录进程中断次数的变量,在block函数中设置跟踪并记录进程中断次数,在调度函数schedule中设置算法,在进程中断3次后将该进程的优先级提升至最高。
改动后的代码:#include <stdio.h>#define TRUE 1#define FALSE 0#define MAXPRI 100#define NIL -1//进程控制块struct {int id; //进程号char status; //进程状态,'e'-执行态'r'-高就绪态't'-低就绪态'w'-等待态'c'-完成态int nextwr; //等待链指针,指示在同一信号量上等待的下一个等待进程的进程号。
int priority; //进程优先数,值越小,优先级越高。
int c;//进程中断次数}pcb[3];//共3个进程//s1、s2为三个进程共享的变量;seed为随机值;registeri模拟寄存器值,存放计算的重复次数。
int registeri,s1,s2,seed,exe=NIL;//exe为当前运行(占有cpu)的进程号//2个信号量sem[0]、sem[1],分别与共享变量s1、s2相联系。
//对应信号量sem[0]、sem[1]分别有两个阻塞队列,队列首由sem[].firstwr指定,队列链指针是pcb[].nextwrstruct{int value;//信号量值int firstwr;//等待该信号量的阻塞队列的首个进程号}sem[2];//三个进程的现场保留区,其中savearea[][0]为寄存器内容,savearea[][1]为下一条指令地址。
操作系统实验报告进程管理操作系统实验报告:进程管理引言操作系统是计算机系统中的核心软件,负责管理计算机的硬件资源和提供用户与计算机之间的接口。
进程管理是操作系统的重要功能之一,它负责对计算机中运行的各个进程进行管理和调度,以保证系统的高效运行。
本实验报告将介绍进程管理的基本概念、原理和实验结果。
一、进程管理的基本概念1. 进程与线程进程是计算机中正在运行的程序的实例,它拥有独立的内存空间和执行环境。
线程是进程中的一个执行单元,多个线程可以共享同一个进程的资源。
进程和线程是操作系统中最基本的执行单位。
2. 进程状态进程在运行过程中会经历不同的状态,常见的进程状态包括就绪、运行和阻塞。
就绪状态表示进程已经准备好执行,但还没有得到处理器的分配;运行状态表示进程正在执行;阻塞状态表示进程由于某些原因无法继续执行,需要等待某些事件的发生。
3. 进程调度进程调度是操作系统中的一个重要任务,它决定了哪个进程应该获得处理器的使用权。
常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转等。
二、进程管理的原理1. 进程控制块(PCB)PCB是操作系统中用于管理进程的数据结构,它包含了进程的各种属性和状态信息,如进程标识符、程序计数器、寄存器值等。
通过PCB,操作系统可以对进程进行管理和控制。
2. 进程创建与撤销进程的创建是指操作系统根据用户的请求创建一个新的进程。
进程的撤销是指操作系统根据某种条件或用户的请求终止一个正在运行的进程。
进程的创建和撤销是操作系统中的基本操作之一。
3. 进程同步与通信多个进程之间可能需要进行同步和通信,以实现数据共享和协作。
常见的进程同步与通信机制包括互斥锁、信号量和管道等。
三、实验结果与分析在本次实验中,我们使用了一个简单的进程管理模拟程序,模拟了进程的创建、撤销和调度过程。
通过该程序,我们可以观察到不同调度算法对系统性能的影响。
实验结果显示,先来先服务(FCFS)调度算法在一些情况下可能导致长作业等待时间过长,影响系统的响应速度。
一、实验目的1. 理解进程的基本概念,掌握进程的结构和生命周期。
2. 掌握进程的创建、终止、同步和通信的方法。
3. 熟悉进程调度算法和进程同步机制。
4. 通过实验加深对操作系统进程管理的理解。
二、实验环境1. 操作系统:Linux2. 编程语言:C/C++3. 实验工具:gcc、make、xterm三、实验内容1. 进程的创建与终止(1)使用fork()系统调用创建进程编写一个C程序,通过fork()系统调用创建一个子进程。
父进程和子进程分别执行不同的任务,并输出各自的信息。
```c#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main() {pid_t pid;pid = fork();if (pid == -1) {printf("Fork failed!\n");return 1;printf("This is child process, PID: %d\n", getpid()); // 子进程执行的任务} else {printf("This is parent process, PID: %d\n", getpid()); // 父进程执行的任务}return 0;}```(2)使用exec()系统调用替换子进程内容在父进程中,使用exec()系统调用替换子进程的内容,执行新的程序。
```c#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>int main() {pid_t pid;pid = fork();if (pid == -1) {printf("Fork failed!\n");return 1;execlp("ls", "ls", "-l", (char )NULL);printf("Exec failed!\n");return 1;} else {wait(NULL);}return 0;}```2. 进程同步与通信(1)使用管道实现进程通信编写一个C程序,使用管道实现父进程和子进程之间的通信。
最新实验二-实验报告(进程管理)实验目的:1. 理解操作系统中进程的概念及其特性。
2. 掌握进程管理的基本原理和方法。
3. 学习进程创建、撤销、阻塞和唤醒等操作。
4. 熟悉进程间的同步与通信机制。
实验环境:- 操作系统:Linux/Unix- 编程语言:C/C++- 开发工具:GCC编译器,GDB调试器实验内容:1. 创建进程:编写程序,使用系统调用fork()创建子进程,并观察父进程与子进程的行为差异。
2. 进程撤销:实现一个程序,通过系统调用exit()或abort()撤销进程,并观察其对进程组和会话的影响。
3. 进程阻塞与唤醒:设计并实现一个父进程和多个子进程的程序,其中子进程执行阻塞操作(如sleep()),父进程负责唤醒这些子进程。
4. 进程同步:利用信号量或管程等同步机制,实现两个并发进程的同步操作。
5. 进程通信:通过管道(PIPE)、消息队列、共享内存等IPC机制,实现进程间的信息交换。
实验步骤:1. 设计并编写创建进程的程序代码。
2. 在Linux环境下使用GCC编译程序,并记录编译过程。
3. 运行程序,使用GDB等工具调试程序,并观察fork()的执行效果。
4. 实现进程撤销的程序,并记录exit()和abort()的不同行为。
5. 编写进程阻塞与唤醒的程序,并通过实验观察不同进程状态的变化。
6. 完成进程同步的代码实现,并测试死锁及其解决方法。
7. 编写并测试进程通信的程序,确保信息能够正确传递。
实验结果:- 展示创建进程前后的系统状态变化,包括进程表和内存分配情况。
- 记录进程撤销后,父进程收集子进程状态的输出。
- 展示进程阻塞与唤醒的输出结果,验证进程状态转换的正确性。
- 展示进程同步的实验结果,包括死锁的产生与解决。
- 展示进程通信的测试结果,验证信息传递的准确性。
实验分析:- 分析进程创建和撤销的系统资源变化。
- 讨论进程阻塞与唤醒机制的效率和应用场景。
- 探讨进程同步与通信的复杂性及其在多线程编程中的重要性。
理工大学信息工程与自动化学院学生实验报告( 2010—2011学年第二学期)课程名称:操作系统开课实验室:年月日目录一、实验目的1二、实验原理及基本技术路线图11.进程的状态转换图22.各原语的功能说明23.多级反馈队列调度算法的描述34.程序功能结构图45.流程图46.数据结构定义57.主要变量的说明68.函数的说明6四、实验方法、步骤6五、实验过程原始记录18六、实验结果、分析和结论21一、实验目的通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。
以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。
二、实验原理及基本技术路线图(方框原理图)用C语言或C++语言开发。
需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。
要求有创建、撤销、调度、阻塞、唤醒进程等功能。
1.进程的状态转换图:2.各原语的功能说明:-进程创建原语:进程创建是调用创建原语来实现。
创建原语扫描系统的PCB链表,在找到一定PCB 链表之后,填入调用者提供的有关参数(这些参数包括:进程名、进程优先级P0、进程正文段起始地址d0、资源清单R0等),最后形成代表进程的PCB结构。
-进程撤销(终止): 撤消原语首先检查PCB进程链或进程家族,寻找所要撤消的进程是否存在。
如果找到了所要撤消的进程的PCB结构,则撤消原语释放该进程所占有的资源之后,把对应的PCB结构从进程链或进程家族中摘下并返回给PCB空队列。
如果被撤消的进程有自己的子进程,则撤消原语先撤消其子进程的PCB结构并释放子进程所占用的资源之后,再撤消当前进程的PCB结构和释放其资源。
-阻塞原语:当发生引起阻塞的事件时,该原语被该进程自己调用来阻塞自己。
阻塞原语在阻塞一个进程时,由于该进程正处于执行状态,故应先中断处理机和保存该进程的CPU现场。
实验一进程管理一、目的进程调度是处理机管理的核心内容.本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法.二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删)。
为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
2、系统资源(r1…r w),共有w类,每类数目为r1…r w.随机产生n进程P i(id,s(j,k),t),0<=i〈=n,0〈=j〈=m,0〈=k〈=dt为总运行时间,在运行过程中,会随机申请新的资源。
3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态.建立进程就绪队列。
4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。
在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU 时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。
三、实验环境操作系统环境:Windows系统。
编程语言:C#。
四、实验思路和设计1、程序流程图2、主要程序代码//PCB结构体struct pcb{public int id;//进程IDpublic int ra;//所需资源A的数量public int rb; //所需资源B的数量public int rc;//所需资源C的数量public int ntime;//所需的时间片个数public int rtime;//已经运行的时间片个数public char state;//进程状态,W(等待)、R(运行)、B(阻塞)//public int next;}ArrayList hready = new ArrayList();ArrayList hblock = new ArrayList();Random random = new Random();//ArrayList p = new ArrayList();int m,n, r, a,a1,b,b1,c,c1, h = 0, i = 1,time1Inteval;//m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。
一、实验目的1. 理解进程管理的概念和作用;2. 掌握进程的创建、调度、同步与通信等基本操作;3. 分析并解决进程管理中的常见问题;4. 提高编程能力和系统设计能力。
二、实验环境1. 操作系统:Linux;2. 编程语言:C/C++;3. 开发工具:GCC。
三、实验内容1. 进程创建与调度(1)创建一个简单的进程,实现进程的创建、运行和退出;(2)实现进程的调度,采用时间片轮转算法(RR)进行进程调度;(3)分析进程调度的过程,观察不同调度算法对进程执行的影响。
2. 进程同步与互斥(1)实现进程同步,采用信号量机制实现进程间的同步;(2)实现进程互斥,使用互斥锁(mutex)保护临界资源;(3)分析进程同步与互斥的原理,解决死锁、饥饿等问题。
3. 进程通信(1)实现进程间的通信,采用管道(pipe)进行数据传输;(2)实现共享内存(shared memory)进行进程间通信;(3)分析进程通信的原理,解决通信中的同步与互斥问题。
4. 实验拓展(1)设计一个多进程并发程序,实现生产者-消费者问题;(2)实现进程的优先级调度,观察不同优先级对进程执行的影响;(3)分析并实现进程的动态创建与销毁,提高系统的灵活性和可扩展性。
四、实验步骤1. 编写进程创建与调度的代码,实现进程的创建、调度和执行;2. 编写进程同步与互斥的代码,实现信号量机制和互斥锁;3. 编写进程通信的代码,实现管道和共享内存通信;4. 编写实验拓展的代码,实现生产者-消费者问题、优先级调度和动态创建与销毁;5. 编译并运行实验程序,观察实验结果,分析并解决问题。
五、实验结果与分析1. 进程创建与调度实验结果显示,采用时间片轮转算法(RR)进行进程调度,进程按照一定的顺序执行,实现了进程的并发执行。
2. 进程同步与互斥实验结果显示,采用信号量机制实现进程同步,可以避免进程间的冲突,保证进程按预期顺序执行;使用互斥锁(mutex)保护临界资源,可以防止多个进程同时访问同一资源,避免数据竞争。
★进程管理实验报告_共10篇范文一:_进程管理实验报告进程管理实验报告一、进程与线程1.实验目的:1.通过本实验学习Linux中创建进程的方法。
2.学习系统调用fork的使用方法。
3.学习系统调用exec族调用的使用方法。
2.实验准备1.进程的创建创建一个进程的系统调用很简单,只要调用fork函数就可以了。
#includepid_tfork();当一个进程调用了fork以后,系统会创建一个子进程,这个子进程和父进程是不同的地方只有它的进程ID和父进程ID,其他的都一样,就像父进程克隆(clone)自己一样,当然创建两个一模一样的进程是没有意义的,为了区分父进程和子进程,我们必须跟踪fork调用返回值。
当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回—1,否则fork的返回值有重要的作用。
对于父进程fork返回子进程ID,而对于fork 子进程返回0,我们就是根据这个返回值来区分父子进程的。
2.关于fork的说明使用该函数时,该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。
将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数可以是一个子进程获得其所有子进程的进程ID。
而fork函数使子进程得到的返回值是0的理由是:一个子进程只会有一个父进程,所以子进程总是可以调用函数getpid获得其父进程的进程ID。
3.系统调用exec族调用的说明父进程创建子进程后,子进程一般要执行不同的程序。
为了调用系统程序,我们可以使用系统调用exec族调用。
Exec族调用有以下五个函数:intexecl(constchar*path,constchar*arg,?);intexeclp(constchar*file,constchar*arg,?);intexecle(constchar*path,constchar*arg,?);intexecv(constchar*path,constchar*argv[]);intexecvp(constchar*file,constchar*argv[]);exec族调用可以执行给定程序。
第1篇一、实验背景进程管理是操作系统中的一个重要组成部分,它负责管理计算机系统中所有进程的创建、调度、同步、通信和终止等操作。
为了加深对进程管理的理解,我们进行了一系列实验,以下是对实验的分析和总结。
二、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。
2. 进一步认识并发执行的实质。
3. 分析进程争用资源的现象,学习解决进程互斥的方法。
4. 了解Linux系统中进程通信的基本原理。
三、实验内容1. 使用系统调用fork()创建两个子进程,父进程和子进程分别显示不同的字符。
2. 修改程序,使每个进程循环显示一句话。
3. 使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号,实现进程的终止。
4. 分析利用软中断通信实现进程同步的机理。
四、实验结果与分析1. 实验一:父进程和子进程分别显示不同的字符在实验一中,我们使用fork()创建了一个父进程和两个子进程。
在父进程中,我们打印了字符'a',而在两个子进程中,我们分别打印了字符'b'和字符'c'。
实验结果显示,父进程和子进程的打印顺序是不确定的,这是因为进程的并发执行。
2. 实验二:每个进程循环显示一句话在实验二中,我们修改了程序,使每个进程循环显示一句话。
实验结果显示,父进程和子进程的打印顺序仍然是随机的。
这是因为并发执行的进程可能会同时占用CPU,导致打印顺序的不确定性。
3. 实验三:使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号在实验三中,我们使用signal()捕捉键盘中断信号(按c键),然后通过kill()向两个子进程发送信号,实现进程的终止。
实验结果显示,当按下c键时,两个子进程被终止,而父进程继续执行。
这表明signal()和kill()在进程控制方面具有重要作用。
4. 实验四:分析利用软中断通信实现进程同步的机理在实验四中,我们分析了利用软中断通信实现进程同步的机理。
昆明理工大学(操作系统原理)实验报告实验名称实验二任务管理器的进程管理实验时间2013 年10 月8 日专业电科111 姓名 xxx 教师评语:学号200111110xxxx成绩教师签名Windows xp 任务管理器的进程管理1.背景知识Windows xp的任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位。
使用任务管理器,可以打开监视计算机性能的关键指示器,快速查看正在运行的程序的状态,或者终止已停止响应的程序。
也可以使用多个参数评估正在运行的进程的活动,以及查看CPU的内存使用情况的图形和数据。
其中:(1)“应用程序”:这里显示所有当前正在运行的应用程序,但只会显示当前已打开窗口的应用程序,而不会显示已最小化系统托盘里的应用程序。
(2)“进程”:这里显示了所有当前正在运行的进程,包括应用程序、后台服务以及隐藏在系统底层深处的程序甚至是木马程序。
(3)“性能”:这里可以查看计算机性能的动态概念。
包括CPU和内存使用情况图表,正在运行的句柄、线程和进程的总数、物理、核心和认可的内存总数等。
2.实验目的通过Window任务管理器中对程序进程进行响应的管理操作系统进程管理的概念,学习观察操作系统运行的动态性能。
3.实验步骤1)启动并进入Windows,通过快捷键(Ctrl+Alt+Del)或鼠标(右键单击任务栏)启动“任务管理器”。
2)记录操作系统版本Microsoft Windows7 旗舰版Service Pack 3,“任务管理器”窗口的选项卡组成:文件选项查看关机帮助3)记录“进程”选项卡下内容(分用户记录并填入下表,进程数大于四的只记录四条)4)结束进程。
如果打开的程序与此进程相关联,则打开的程序将关闭,将丢失所有未保存的数据。
如果结束系统进程,则可能导致系统不稳定。
5)显示其他进程计数器。
在“进程”选项卡上单击“查看”菜单,然后单击“选择列”命令。
昆明理工大学信息工程与自动化学院学生实验报告(2011 —2012 学年第二学期)课程名称:操作系统开课实验室:444 2012 年 4 月 10 日一、实验目的通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。
以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。
二、实验原理及基本技术路线图(方框原理图)用C语言或C++语言开发。
需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。
要求有创建、撤销、调度、阻塞、唤醒进程等功能。
状态转换图:各原语的功能说明:#include<stdio.h>标准输入输出头文件#include<stdlib.h>stdlib.h里面定义了五种类型、一些宏和通用工具函数。
类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。
多级反馈队列调度算法的描述:void zhingxing(){for(int i=0;i<=链表的数目;){p=rq(i),front;while(p!=NULL){执行调度算法,将在时间片内不能完成的进程,插入到下一队列的尾部,并以此循环执行。
p=p->next;}} }流程图:creat()流程图:数据结构定义主要变量的说明:xuhao进程的序号daoda进程到达时间pid[10] 进程名字youxian 进程优先级yunxingsuoxu 运行所需时间yunxing运行已用时间zhuangtai R表示执行,W表示动态就绪 ,F表示完成函数的说明:void creat();//创建链表void diaodu();//执行调度的过程void display();//显示执行结果三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台四、实验方法、步骤#include<stdio.h>#include<stdlib.h>#define NULL 0int shumu;void creat();//创建链表void diaodu();//执行调度void display();//显示执行结果//进程PCB结构体struct jincheng{int xuhao;int daoda;char pid[10]; //进程名字int youxian; //进程优先级int yunxingsuoxu; //占用cpu时间int yunxing;char zhuangtai; //R表示执行,W表示动态就绪 ,F表示完成struct jincheng *next;};//链表结构体typedef struct node{jincheng *front;}pcbqueue;pcbqueue rq[3];//定义三个等待队列struct jincheng *p,*q;//创建进程……void creat(){printf("创建进程数目;(不大于20):");scanf("%d",&shumu);if(shumu>20){printf("内存已满!\n");printf("输入错误,请重新创建进程!\n");creat();}else{for(int j=0;j<shumu;j++){p=(jincheng*)malloc(sizeof(jincheng));p->youxian=(int)(rand()%(4-1)+1);if(rq[p->youxian-1].front==NULL)//建立队列2,1,0{printf("请输入新进程的序号(数字):\n");scanf("%d",&p->xuhao);printf("请输入新进程的名字:\n");scanf("%s",&p->pid);p->daoda=(int)(rand()%(5-1)+1);p->yunxingsuoxu=(int)(rand()%(5-1)+1);p->yunxing=0;p->zhuangtai='W'; //新建进程的状态设置为“就绪”rq[p->youxian-1].front=p;p->next=NULL;}else //如果就绪队列不是空队列{p=rq[p->youxian-1].front;while(p->next!=NULL){p=p->next; //p一直指向就绪队列的队尾}q=(jincheng*)malloc(sizeof(jincheng));q->next=p->next;p->next=q; //在就绪队列的队尾加入新建的进程printf("请输入新进程的序号(数字):\n");scanf("%d",&q->xuhao);printf("请输入新进程的名字:\n");scanf("%s",&q->pid);q->daoda=(int)(rand()%(5-1)+1);q->yunxing=0;q->yunxingsuoxu=(int)(rand()%(5-1)+1);q->zhuangtai='W';}}}if(shumu>0&&shumu<=20){printf("\t\t\t进程创建成功!\n");printf("\t***********************************************\n");printf("\t*********************执行程序******************\n");printf("\t***********************************************\n");}}void diaodu()//执行部分{display();printf("正在执行进程运行情况:\n");printf("序号名字运行时间已运行时间到达时间状态\n");int i=2;//从第二个队列开始……for(i=2;i>=0;i--){p=rq[i].front;while(p!=NULL){for(int j=1;j<=2*(3-i);j++){p->yunxing=p->yunxing+1;p->yunxingsuoxu=p->yunxingsuoxu-1;if(p->yunxingsuoxu<0){printf("进程已完成运行……\n");exit(0);}p->zhuangtai='R';//执行过程中状态改变if(p->yunxingsuoxu==0){p->zhuangtai='F'; //执行结束状态改变printf("%d %s %d %d %d %c\n",p->xuhao,p->p id,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);break;}getchar();printf("%d %s %d %d %d %c\n",p->xuhao,p->p id,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);}if(p->yunxingsuoxu>0){p->zhuangtai='W';getchar();printf("%d %s %d %d %d %c\n",p->xuhao,p->p id,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);if(i-1<=0) /*将用玩时间片的插入相应队列,以下作此操作*/ {q=rq[0].front;while(q->next!=NULL){q=q->next;}q->next=p;rq[i].front=p->next;p->next=NULL;diaodu();}else{q=rq[i-1].front;while(q->next!=NULL){q=q->next;}q->next=p;rq[i].front=p->next;p->next=NULL;diaodu();}diaodu();getchar();printf("%d %s %d %d %d %c\n",p->xuhao,p->p id,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);}p=p->next;}}}void display()//输出部分{printf("所有进程运行情况:\n");printf("序号名字运行时间已运行时间到达时间状态\n");for(int a=0;a<3;a++){p=rq[a].front;while(p!=NULL){printf("%d %s %d %d %d %c\n ",p->xuhao,p->pid,p->yunxingsuoxu,p->yunxing,p->daoda,p->zhuangtai);p=p->next;}}}void main(){creat();diaodu();display();}五、实验过程原始记录:输入数据:序号名称1 a2 b3 d4 e5 f运行截图:输入进程:未完成进程插入下一进程:过程及结果:六、实验结果、分析和结论(误差分析与数据处理、成果总结等。