实验一处理机调度
- 格式:docx
- 大小:18.61 KB
- 文档页数:6
实验一处理机调度一、实验内容选择一个调度算法,实现处理机调度。
二、实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。
本实验模拟实现处理机调度,以加深了解处理机调度的工作。
三、实验题目1、设计一个按优先权调度算法实现处理机调度的程序;2、设计按时间片轮转实现处理机调度的程序。
PCB内容要求:进程名/PID;要求运行时间(单位时间);优先权;状态:PCB指针;1、可随机输入若干进程,并按优先权排序;2、从就绪队首选进程运行:优先权-1要求运行时间-1要求运行时间=0时,撤销该进程3、重新排序,进行下轮调度;源代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>typedef struct pcb{char PID[50];int needTime;//需要运行时间int priority;//优先权char state[20];//进程状态struct pcb *next;}PCB;typedef struct{PCB* front;PCB* rear;}ProcessQueue;void SelectAlgorithm();void CreateQProcess(ProcessQueue &Q,char*,int time,int pri,char*);void ProcessSchedule();void InitQueue(ProcessQueue &Q);void visitQueue(ProcessQueue &Q);bool RunProcess(PCB* rp,ProcessQueue &Q);bool NonPreemptivePriority(ProcessQueue &Q);//非抢占式优先权调度void delProcess(PCB* delp);bool RunProcessPreem(PCB* rp,ProcessQueue &Q);//抢占式优先执行进程bool PreemptivePriority(ProcessQueue &Q);void RR(ProcessQueue &Q);int main(){int iSel;int i = 0;SelectAlgorithm();ProcessQueue readyQ;//就绪进程队列PCB newpcb;InitQueue(readyQ);printf("请选择调度算法:");do{scanf("%d",&iSel);} while (!(iSel == 1 || iSel == 2 || iSel == 3));while(i < 3){printf("请输入要创建的进程:\n");fflush(stdin);gets(newpcb.PID);fflush(stdin);scanf("%d",&newpcb.needTime);fflush(stdin);scanf("%d",&newpcb.priority);fflush(stdin);gets(newpcb.state);fflush(stdin);CreateQProcess(readyQ,newpcb.PID,newpcb.needTime,newpcb.priority,newpcb.state);printf("创建了一个进程\n");++i;}visitQueue(readyQ);//显示的是各个进程的优先权switch(iSel){case 1:while(NonPreemptivePriority(readyQ));//非抢占优先权调度break;case 2:PreemptivePriority(readyQ);//抢占式优先权调度break;case 3:RR(readyQ);break;}return 0;}void SelectAlgorithm(){printf("1.非抢占式优先权调度\n");printf("2.抢占式优先权调度\n");printf("3.时间片轮转调度\n");}void InitQueue(ProcessQueue &Q)//初始化进程队列{Q.front = Q.rear = (PCB*)malloc(sizeof(PCB));if(!Q.front) exit(-1);Q.front->next = NULL;}void CreateQProcess(ProcessQueue &Q,char* pid,int time,int pri,char* st)//指定进程入就绪队列,将优先权高的插在队列前面{PCB* p = (PCB*)malloc(sizeof(PCB));if(!p) exit(-1);strcpy(p->PID,pid); p->needTime = time;p->priority = pri; strcpy(p->state,st);p->next = NULL;PCB* q = Q.front->next, *old = Q.front;if(!q)//如果原队列为空{Q.rear->next = p;Q.rear = p;//q == NULL}else//如果原队列不为空{for(;q != NULL;){if(p->priority > q->priority){old->next = p;p->next = q;return;}q = q->next;old = old->next;if(q == NULL){Q.rear->next = p;Q.rear = q;//q == NULL}}}}void ProcessSchedule(){}void visitQueue(ProcessQueue &Q)//访问进程队列{PCB* p = (PCB*)malloc(sizeof(PCB));if(!p) exit(-1);p = Q.front->next;while(p != NULL){printf("%d,",p->priority);p = p->next;}printf("\n");int i = 0;}bool PreemptivePriority(ProcessQueue &Q){PCB* rprocess;if(!Q.front->next){printf("就绪队列中没有进程可以调度!\n");return false;}else{rprocess = Q.front->next;//选择优先权最高的进程Q.front->next = Q.front->next->next;//将进程移除就绪队列while(rprocess != NULL)//抢占式优先调度{RunProcessPreem(rprocess,Q);if(rprocess->needTime == 0){delProcess(rprocess);if((rprocess = Q.front->next) == NULL){printf("就绪队列中没有进程可以调度!\n");return false;}else{Q.front->next = Q.front->next->next;continue;}}if(Q.front->next != NULL){if(rprocess->priority < Q.front->next->priority)//判断运行了1个时间后还是否具有最高优先权{/*rprocess->next = Q.front->next->next;//正在运行中的进程因为优先权降低,重新进入就绪队列temp = Q.front->next;Q.front->next = rprocess;rprocess = temp;//rprocess保存运行进程*/CreateQProcess(Q,rprocess->PID,rprocess->needTime,rprocess->priority,rprocess->state);//正在运行中的进程因为优先权降低,重新进入就绪队列rprocess = Q.front->next;Q.front->next = Q.front->next->next;}}}}return true;}bool NonPreemptivePriority(ProcessQueue &Q)//非抢占式优先权调度{PCB* rprocess;//存放要调度运行的进程if(!Q.front->next){printf("就绪队列中没有进程可以调度!\n");return false;}else{rprocess = Q.front->next;Q.front->next = Q.front->next->next;//已经调度,从就绪队列中删除进程if(RunProcess(rprocess,Q)){delProcess(rprocess);printf("就绪队列状态:\n");visitQueue(Q);}return true;}}bool RunProcess(PCB* rp,ProcessQueue &Q)//执行进程{while(rp->needTime){printf("进程%s正在运行...\n",rp->PID);printf("PID[50]\tneedTime\tpriority\tstate[20]\n");printf("%s\t%d\t\t%d\t\t%s\n",rp->PID,rp->needTime,rp->priority,rp->state);Sleep(1000);--rp->needTime;}return true;}bool RunProcessPreem(PCB* rp,ProcessQueue &Q)//抢占式优先,RR执行进程{printf("进程%s正在运行...\n",rp->PID);printf("PID[50]\tneedTime\tpriority\tstate[20]\n");printf("%s\t%d\t\t%d\t\t%s\n",rp->PID,rp->needTime,rp->priority,rp->state);Sleep(1000);--rp->needTime;--rp->priority;return true;}void delProcess(PCB* delp)//撤销进程{free(delp);}void RR(ProcessQueue &Q){PCB* running = Q.front->next;PCB* old = Q.front;while(Q.front->next != NULL){if(running){RunProcessPreem(running,Q);if(running->needTime == 0)//撤销进程{old->next = running->next;delProcess(running);running = old->next;continue;}old = old->next;running = running->next;}else{old = Q.front;running = old->next;}}printf("就绪队列中没有进程可以调度!\n");}以下是使用时间片轮转算法的一次执行:选择算法3:进程输入,此处输入1,1,1,1,2,2,2,2,3,3,3,3测试。
实验一处理机调度一.实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。
本实验模拟实现处理机调度,以加深了解处理机调度的工作。
二.实验内容选择一个调度算法,实现处理机调度。
1.设计一个按优先权调度算法实现处理机调度的程序。
2.设计按时间片轮转实现处理机调度的程序。
三.实验要求要求:进程名/PID要求运行时间(单位时间)优先权状态PCB指针1、可随机输入若干进程,并按优先权排序;2、从就绪队列首选进程运行:优先权-1,要求运行时间-1,要求运行时间=0时,撤销该进程。
3、重新排序,进行下轮调度。
4、最好采用图形界面。
5、可以随时增加进程。
6、规定道数,设置后备队列和挂起状态。
若内存中进程少于规定道数,可自动从后备队列调度一作业进入。
被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。
7、每次调度后,显示各进程状态。
四.实验过程#include"windows.h"#include<iostream.h>#include<stdio.h>#include<conio.h>enum PCBSTATE {READY,RUN,FINISH}; //定义进程状态的数据类型typedef struct PCB_Struct{ //定义进程控制块char Name[8]; //进程名int Priority; //优先数double WorkTime; //已运行的时间double NeedTime; //还需运行时间double WaitTime; //进程总共花费时间PCBSTATE State; //进程状态PCB_Struct *Next; //指针} PCB;bool RunOk;PCB *ReadyList; //声明就绪链表PCB *FinishList; //声明完成链表PCB *RearReady; //声明就绪监听队列PCB *RearFinish; //声明完成监听队列PCB *CurrentRun; //声明当前运行队列void AdjustProcessList(PCB *Insert) //调整进程队列{PCB *tmp,*Parent; //定义线程tmp=ReadyList; //把临时线程加入就绪链表if (tmp->Priority<Insert->Priority) //比较优先级安排链表序{ReadyList=Insert;Insert->Next=tmp;}else{Parent=tmp;while(tmp){if (tmp->Priority>=Insert->Priority){Parent=tmp;tmp=tmp->Next;}elsebreak;}if (!tmp){RearReady->Next=Insert;RearReady=Insert;}else{Insert->Next=tmp;Parent->Next=Insert;}}}void GetOnePCB() //增加进程{PCB *tmp; //初始化变量tmp=new PCB;char Name[8];int Priority;double Time; //人机交互获取进程参数cin>>Name;cout<<" 优先数:";cin>>Priority;cout<<" 所需时间:";cin>>Time;cout<<endl;strcpy(tmp->Name,Name);tmp->Priority=Priority; //把参数到进程中tmp->WorkTime=0.0;tmp->WaitTime=0.0;tmp->NeedTime=Time;tmp->State=READY;tmp->Next=NULL;if (RearReady) //如果监听链表不为空{AdjustProcessList(tmp); //调用调整进程队列}else //为空则初始化监听队列{ReadyList=tmp;RearReady=tmp;}}void GetAllPCB() //输入开始时的进程{int i,j,k; //+kcout<<endl<<"请输入需要调度进程的个数:"; //获取进程数cin>>i;if(i<1) i=2;if(i>0) //获取进程for (j=0;j<i;j++){k=j+1;cout<<" 第"<<k<<"个进程名:";GetOnePCB(); //调用增加进程}}void AddWaitWorkTime() //时间控制{PCB *tmp=ReadyList; //处理队首时间while(tmp){tmp->WaitTime++;tmp=tmp->Next;}}void AdjustRunProcess() //调整运行队列{AddWaitWorkTime(); //调用时间控制CurrentRun=ReadyList; //把就绪进程放入运行队列ReadyList=ReadyList->Next;CurrentRun->Next=NULL;if(CurrentRun->Priority>=1) //修改运行进程的属性CurrentRun->Priority;CurrentRun->WorkTime++;CurrentRun->NeedTime--;if(CurrentRun->NeedTime==0) //处理结束的进程{CurrentRun->State=RUN;if(FinishList==NULL) //如果结束进程为空,创建FinishList=CurrentRun;else //否则,添加入完成监听队列RearFinish->Next=CurrentRun;RearFinish=CurrentRun;if(!ReadyList)ReadyList=RearReady=NULL;}elseif(!ReadyList) //如果就绪队列为空{RearReady=ReadyList=CurrentRun; //把监听队列中的进程防入就绪队列}else{AdjustProcessList(CurrentRun); //递归}if(!ReadyList) //如果就绪队列为空{CurrentRun=NULL; //把运行进程置空RunOk=true; //设置进程完成开关}}void ShowProcess() //显示队列情况{PCB *tmp;if(CurrentRun) //存在运行队列,显示{cout<<"本次调度运行的进程:"<<endl;cout<<" 进程名 "<<" 进程优先数 "<<" 已运行的时间 "<<" 还需运行时间 "<<"进程总共花费时间 "<<" 进程状态 "<<endl;cout<<" "<<CurrentRun->Name<<" "<<CurrentRun->Priority<<" "<<CurrentRun->WorkTime<<" "<<CurrentRun->NeedTime<<""<<CurrentRun->WaitTime<<" "<<CurrentRun->State<<endl;}if(ReadyList) //存在就绪队列,显示{tmp=ReadyList;cout<<"就绪队列中的进程:"<<endl;cout<<" 进程名 "<<" 进程优先数 "<<" 已运行的时间 "<<" 还需运行时间 "<<"进程总共花费时间 "<<" 进程状态 "<<endl;while(tmp){cout<<" "<<tmp->Name<<" "<<tmp->Priority<<""<<tmp->WorkTime<<" "<<tmp->NeedTime<<""<<tmp->WaitTime<<" "<<tmp->State<<endl;tmp=tmp->Next;}}if(FinishList) //运行至结束,显示{tmp=FinishList;cout<<"显示已运行好的进程调度结果:"<<endl;cout<<" 进程名 "<<" 进程优先数 "<<" 已运行的时间 "<<" 还需运行时间 "<<"进程总共花费时间 "<<" 进程状态 "<<endl;while (tmp){cout<<" "<<tmp->Name<<" "<<tmp->Priority<<""<<tmp->WorkTime<<" "<<tmp->NeedTime<<""<<tmp->WaitTime<<" "<<tmp->State<<endl;tmp=tmp->Next;}}}void FreeProcess() //释放进程{PCB *tmp;if(!FinishList) //就绪队列为空,报错cout<<endl<<"\n发生错误!";for(;FinishList->Next;) //删除进程{tmp=FinishList;FinishList=FinishList->Next;delete tmp;}ReadyList=NULL; //将所有队列置空FinishList=NULL;RearReady=NULL;CurrentRun=NULL;RearFinish=NULL;}void RunOnce() //单步调度{AdjustRunProcess(); //调整运行队列}char SelectStyle() //选择类型{char i;printf("\n"); //人机交互选择下一步的操作printf("点击1--继续下一次调度,并显示就绪队列中的进程情况\n");printf("点击2--向就绪队列添加新进程\n");printf("点击3--运行程序\n");printf("请选择你要的操作:");do{i=(char)_getch();}while(i!='1'&&i!='2'&&i!='3');cout<<i<<endl<<endl;return i;}void RunAlor() //进程运行控制{char j='1';RunOk=false;GetAllPCB(); //获取全部进程do {if(j!='3'&&!RunOk)j=SelectStyle(); //调用选择操作if(j=='3')RunOnce(); //调用单步运行if(j=='1'){RunOnce();ShowProcess(); //调用显示队列}if(j=='2') //添加新进程{system("cls");cout<<" 新进程名:";GetOnePCB();}}while(!RunOk); //当进程全部运行完毕cout<<"运行完成,显示进程调度结果:\n";ShowProcess(); //显示进程队列FreeProcess(); //释放进程}int main() //主程序{char Key;ReadyList=NULL; //设置链表为空FinishList=NULL;RearReady=NULL;CurrentRun=NULL;RearFinish=NULL;while(true) //人机交互界面{system("cls");printf("==========================================\n");printf(" +++ 优先数进程调度算法 +++\n\n");printf("==========================================\n");printf("\n");printf("******************************************\n");printf("+++++ 按1 执行 ! +++++\n");printf("+++++ 按2 退出 ! +++++\n");printf("+++++ 状态0 表示进程还没运行完! +++++\n");printf("+++++ 状态1 表示进程运行已结束! +++++\n");printf("******************************************\n");printf("请选择:");do{Key=(char)_getch();}while(Key!='1'&&Key!='2'); //重新输入/* system("cls");*/if(Key=='2') //退出系统return 0;else if(Key=='1') //开始模拟 RunAlor();printf("\n按任意键继续");_getch();}return 0;}五.实验结果主界面运行过程添加新进程实验二主存空间的分配和回收一.实验目的帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。
操作系统实验之处理机调度实验报告一、实验目的处理机调度是操作系统中的核心功能之一,本次实验的主要目的是通过模拟不同的处理机调度算法,深入理解操作系统对处理机资源的分配和管理策略,比较不同调度算法的性能差异,并观察它们在不同负载情况下的表现。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 Python 38。
实验中使用了 Python 的相关库,如`numpy`、`matplotlib`等,用于数据生成、计算和图形绘制。
三、实验原理1、先来先服务(FCFS)调度算法先来先服务算法按照作业到达的先后顺序进行调度。
先到达的作业先被服务,直到完成或阻塞,然后再处理下一个到达的作业。
2、短作业优先(SJF)调度算法短作业优先算法选择预计运行时间最短的作业先执行。
这种算法可以有效地减少作业的平均等待时间,但可能导致长作业长时间等待。
3、时间片轮转(RR)调度算法时间片轮转算法将处理机的时间分成固定长度的时间片,每个作业轮流获得一个时间片的处理时间。
当时间片用完后,如果作业还未完成,则将其放入就绪队列的末尾等待下一轮调度。
4、优先级调度算法优先级调度算法为每个作业分配一个优先级,优先级高的作业先被执行。
优先级可以根据作业的性质、紧急程度等因素来确定。
四、实验内容与步骤1、数据生成首先,生成一组模拟的作业,包括作业的到达时间、预计运行时间和优先级等信息。
为了使实验结果更具代表性,生成了不同规模和特征的作业集合。
2、算法实现分别实现了先来先服务、短作业优先、时间片轮转和优先级调度这四种算法。
在实现过程中,严格按照算法的定义和规则进行处理机的分配和调度。
3、性能评估指标定义了以下性能评估指标来比较不同调度算法的效果:平均等待时间:作业在就绪队列中的等待时间的平均值。
平均周转时间:作业从到达系统到完成的时间间隔的平均值。
系统吞吐量:单位时间内完成的作业数量。
4、实验结果分析对每种调度算法进行多次实验,使用不同的作业集合,并记录相应的性能指标数据。
实验课程名称:实验项目名称处理机调度 实验成绩实验者专业班级名且另IJ同组者实验日期年 月 日第一部分:实验分析与设计(可加页)一、 实验内容描述(问题域描述)实验目的:掌握处理机调度的相关内容,对进程调度算法有深入理解。
实验内容:模拟实现进程调度功能。
实验要求:1、任选一种高级语言实现;2、选择1-2种调度算法;3、能够输入进程的基本信息,如进程名、提交时间、预估运行时间等;4、根据选择的调度算法显示进程调度顺序;5、显示完成调度后每个进程的开始时间、完成时间呢、周转时间,带权周转时间;6、计算平均周转时间和平均带权周转时间。
二、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述) 数据结构:一个作业的描述结构: struct WORK {int num;//进程序号startTim;//开始时间 upTim;//提交时间 offTim;//结束时间 costTim;//耗费时间长度 Ti;//周转时间 Tr;//带权周转时间输出模块float floatfloat floatfloat float };功能说明:输入模块、输出模块:负责进程的输入及模拟结果的输出;处理机调度函数调用模块:选择调用算法完成进程调度;先入先出算法模拟模块、短进程优先算法模拟模块:实际完成模拟调度功能;相关时间计算模块:计算开始时间、结束时间,周转时间,带权周转时间。
三、主要仪器设备及耗材硬件:pc机;软件:windows2007旗舰版、VS 2010开发环境。
第二部分:实验调试与结果分析(可加页)一、实验源程序:# include <iostream>using namespace std;struct WORK{int num;//进程序号float startTim;//开始时间float upTimJ/提交时间float offTim;//结束时间float costTim;//耗费时间长度float Ti;〃周转时间float Tr;//带权周转时间};void FIFO(WORK *workspace,int workNum);void SJF(WORK *workspace,int workNum);void SUM(WORK *workspace,int workNum,float *T,float *W);int main(){int num;float upTim;float costTim;int workNum;cout<<"请输入需要被调度的作业的数目:"<<endl;cin>>workNum;WORK *workspace=new WORK[workNum];cout<<"请依次输入需要被调度的作业(输入格式:作业序号作业提交时间(用数字表示) 执行时间):"<<endl;int n=0;while(cin>>num>>upTim>>costTim && n<workNum){workspace[n].num=num;workspace[n].upTim=upTim;workspace[n].costTim=costTim;n++;}cin.clear();cin.sync();cout<<"作业序号\t作业提交时间\t执行时间):"<<endl;for(int i=0;i<workNum;i++) {cout<<workspace[i].num<<"\t\t"<<workspace[i].upTim<<"\t\t<<workspace[i].costTim<<endl;/****************** 选择算法,执行算法,结果输出*****************/int cho=0;float * T=new float[0],* W=new float[0];cout<<"请选择调度算法:"<<endl;cout<<0<<"--->FIFO\n"<<1<<"--->最短优先"<<endl;cin>>cho;switch(cho){case 0:FIFO(workspace,workNum);SUM(workspace,workNum,T,W);break;case 1:SJF(workspace,workNum);SUM(workspace,workNum,T,W);break;}cout<<"执行顺序"<<"\t"<<"提交时间"<<"\t"<<"执行时间"<<"\t"<<"开始时间"<<"\t"<<"结束时间"<<endl;for(int i=0;i<workNum;i++) {cout<<workspace[i].num<<"\t\t"<<workspace[i].upTim<<"\t\t"<<workspace[i].costTim <<"\t\t"<<workspace[i].startTim<<"\t\t"<<workspace[i].offTim<<endl;}cout<<"平均周转时间:"<<(*T)/workNum<<"\t 平均带权周转时间:"<<(*W)/workNum<<endl;system("PAUSE"); return 0;}void FIFO(WORK *workspace,int workNum)for(int i=0;i<workNum-1;i++) 〃按提交时间排序for(int j=0;j<workNum-1;j++)if(workspace[j].upTim>workspace[j+1].upTim) 〃大数沉底{WORK temp;temp=workspace[j+1];workspace[j+1]=workspace[j];workspace[j]=temp;}}void SJF(WORK *workspace,int workNum){float MinUptime=0;//最早的提交时间FIFO(workspace,workNum);//先按提交时间排序MinUptime=workspace[0].upTim+workspace[0].costTim;for(int i=0;i<workNum-1;i++) 〃按照最短的作业时间排序for(int j=1;j<workNum-1;j++){if(workspace[j].upTim<MinUptime&&workspace[j+1].upTim<MinUptime) {if(workspace[j].costTim>workspace[j+1].costTim) 〃提交时间大且耗时多的作业沉底{WORK temp;temp=workspace[j+1];workspace[j+1]=workspace[j]; workspace[j]=temp;}} else {MinUptime=workspace[j].upTim+workspace[j].costTim;//更新}}}void SUM(WORK *workspace,int workNum,float *T,float *W){*T=0;*W=0;for(int i=0;i<workNum;i++)//计算开始时间、结束时间,周转时间,带权周转时间{ if(i==0)//计算第一个作业{workspace[i].startTim=workspace[i].upTim;workspace[i].offTim=workspace[i].upTim+workspace[i].costTim;workspace[i].Ti=workspace[i].offTim-workspace[i].upTim;workspace[i].Tr=workspace[i].Ti/workspace[i].costTim;}else//计算第一个作业基础上的其他作业相关时间{if(workspace[i-1].offTim<workspace[i].upTim)workspace[i].startTim=workspace[i].upTim;elseworkspace[i].startTim=workspace[i-1].offTim;workspace[i].offTim=workspace[i].costTim+workspace[i].startTim; workspace[i].Ti=workspace[i].offTim-workspace[i].upTim; workspace[i].Tr=workspace[i].Ti/workspace[i].costTim; }*T+=workspace[i].Ti;//计算平均周转时间 *W+=workspace[i].Tr;//计算平均带权周转时间 } } 二、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)测试用例一结果:请依次前A 需要被洞度的作止:葡人格式;作出序号 执行时间M 1 10 2,眼糟翎要被调度的作业(输入格式:作业序号1 10 2作止提交升间1用道字表示)|2 10.2 1 1? 10a 4 0a 5 L 10a 5 0a 2■(此序]作业提父H J 闫 L 10Z 10.23 10.4k10.5青选择调度算法:0——>FIF0 i-—>最超优先 执行时间), 暨 1 0.5 0.3a 二顺序提交时间 执行时间开始时间结束时间1 10210 12,10.2i 12 13 卜 10.4 8.5 13 13.E 口 1Q.5 0.3平均周转时间.2.8 平均带权周转时间吗.26岛北旺京银继纨 -±3.513.8邛业序与 作北提交时、日h 1M 执行时间)।21«.2 13 10.4 0.5 MIB.E情选区调度算法,同——>FIF0 口一》最短优先 0.3执行顺序 提交时间1 10 执行时间 2开始时间10 结克时间 124IB.E 0.3 12 12.3 10.4 0.5 12.3 12.81M-21句周转时间:2.45平均带权周转时间:3.8512.JS13=8日数据细撷处理机调度废锚纵员或吐理挑洞庭模物n京葡a 需要神话后日作业的数诸输妻萼猫调康的作斗的豹目:2 1M-2 1 □ 10.4 0.5 4 10-5 0,3回作业提交时间(用数字表。
实验报告学院(系)名称:计算机与通信工程学院
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
一、实验效果:
1)打开主界面
2)初始化线程的时间和优先级,设置各个进程的时间和优先级。
3) 开始运行模拟线程。
绿色代表当前正在运行的线程。
二、实验代码
1)本实验使用Java的Swing绘制GUI,能够简单便捷的观察到处理机是如何根据时间和优先级来调度进程的。
代码结构:Swing绘制GUI:
2)Java ,Swing优点:
使用Swing的Jtable,JTabbedPane,能清楚的观察某一时刻各个进程的状态,以及正在运行哪个进程
3)模拟进程的数据结构:
自定义一个类ThreadBean,通过这种数据结构来代表进程。
这个类中有id,time(时间), property(优先级)的属性
4) 进程调度算法:
一、编写了一个SortList类,来完成调度算法
二、每一次通过遍历每个进程,找出优先级以及时间最多的进程,准备被处理机调度。
三、处理机调度后,这个线程的时间以及优先级减1
5)细节的处理
一、果没有进行初始设置进程的优先级和时间就点击了运行,会弹出提示框,不允许运行。
二、数据过滤,输入时间,优先级时只能填写整数,如果不是整数会进行过滤,提示。
三、扩展性
程序各个部分已经模块化,可以直接进行扩展。
通过选择不同的标签来显示几个不同的实验,完成三个实验均可以同时显示,不影响程序性能。
处理机调度实验报告处理机调度实验报告一、引言处理机调度是计算机操作系统中一个重要的概念,它涉及到如何合理地分配处理机资源以提高系统的运行效率。
本文将针对处理机调度进行实验,探讨不同调度算法对系统性能的影响。
二、实验目的本实验的目的是通过模拟不同的处理机调度算法,比较它们在不同负载下的性能表现,进而分析其优缺点,为实际操作系统的调度算法选择提供参考。
三、实验方法1. 实验环境本实验使用了一台配置较高的计算机作为实验环境,操作系统为Linux,处理器为Intel Core i7,内存为8GB。
2. 实验设置为了模拟不同的负载情况,我们使用了三个不同的测试程序:程序A、程序B和程序C。
程序A是一个计算密集型任务,程序B是一个I/O密集型任务,程序C是一个混合型任务。
3. 实验步骤首先,我们分别运行程序A、程序B和程序C,并记录它们的运行时间。
然后,我们使用不同的调度算法来调度这些任务,并记录它们的运行时间和系统资源利用率。
四、实验结果与分析1. 调度算法1:先来先服务(First-Come, First-Served,FCFS)FCFS算法按照任务到达的先后顺序进行调度,即先到先服务。
实验结果显示,在计算密集型任务下,FCFS算法表现较好,但在I/O密集型任务和混合型任务下,其性能明显下降。
这是因为在FCFS算法中,任务的执行顺序是固定的,无法根据任务的特性进行灵活调度。
2. 调度算法2:最短作业优先(Shortest Job First,SJF)SJF算法根据任务的执行时间进行调度,即执行时间最短的任务先执行。
实验结果显示,在计算密集型任务和混合型任务下,SJF算法表现较好,但在I/O密集型任务下,其性能较差。
这是因为在I/O密集型任务中,任务的执行时间不仅与计算量有关,还与I/O操作的耗时有关,因此SJF算法无法有效地进行调度。
3. 调度算法3:时间片轮转(Round Robin,RR)RR算法将处理机的运行时间划分为若干个时间片,每个任务在一个时间片内执行一定的时间,然后切换到下一个任务。
课程实验报告
在单处理机的情况下模拟用优先权的时间片轮转调度策略实现处理机调度,以加深了解处理机调度的工作过程。
要求:
可利用先来先服务、短作业优先、响应比高者优先、多级反馈队列模型、时间片轮转法等,来实现处理机的调度。
根据单处理机,多任务的问题特性做好软件实现的需求分析。
可根据问题的实际需要,可选择进程数量。
当系统运行时,能直观地、动态地反映当前处理机状态及各进程执行的状况。
描述6.create函数用于创建队列
7.insert为插入函数,用于将一个时间片运行结束的进程插入到就绪进程的
队尾
8.priority函数:如果有进程就绪,就将处理机分配给该进程让他执行。
调试过程及实验结果
总结每次运行一步,电脑将会将该时刻所有进程控制块的运行状态显示给用户。
包括进程名、要求运行时间、已经运行时间、还需要运行时间、状态等信息。
当每个进程运行一个时间片之后将它从该队列中移除,添加到就绪队列队尾中以便使每个进程可以循环执行。
当要求运行时间和已运行时间相等时,说明该进程运行结束,将该进程撤出该队列并且不再添加到就绪队列中。
直到就绪队列中没有就绪进程为止
附录#define _CRT_SECURE_NO_DEPRECATE #include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct node
{
char pname[10]; //进程名
int rtime; //已运行时间
int sytime; //剩余时间。
实验一处理机调度实验报告一、实验目的处理机调度是操作系统中的一个重要组成部分,其目的是合理地分配处理机资源,以提高系统的性能和效率。
本次实验的主要目的是通过模拟处理机调度算法,深入理解不同调度算法的工作原理和性能特点,并能够对它们进行比较和分析。
二、实验环境本次实验使用了以下软件和工具:1、操作系统:Windows 102、编程语言:Python3、开发环境:PyCharm三、实验内容1、先来先服务(FCFS)调度算法先来先服务调度算法按照作业或进程到达的先后顺序进行调度。
即先到达的作业或进程先得到处理机的服务。
2、短作业优先(SJF)调度算法短作业优先调度算法优先调度运行时间短的作业或进程。
在实现过程中,需要对作业或进程的运行时间进行预测或已知。
3、高响应比优先(HRRN)调度算法高响应比优先调度算法综合考虑作业或进程的等待时间和运行时间。
响应比的计算公式为:响应比=(等待时间+要求服务时间)/要求服务时间。
4、时间片轮转(RR)调度算法时间片轮转调度算法将处理机的时间分成固定大小的时间片,每个作业或进程在一个时间片内运行,当时间片用完后,切换到下一个作业或进程。
四、实验步骤1、设计数据结构为了表示作业或进程,设计了一个包含作业或进程 ID、到达时间、运行时间和等待时间等属性的数据结构。
2、实现调度算法分别实现了上述四种调度算法。
在实现过程中,根据算法的特点进行相应的处理和计算。
3、模拟调度过程创建一组作业或进程,并按照不同的调度算法进行调度。
在调度过程中,更新作业或进程的状态和相关时间参数。
4、计算性能指标计算了平均周转时间和平均带权周转时间等性能指标,用于评估不同调度算法的性能。
五、实验结果与分析1、先来先服务(FCFS)调度算法平均周转时间:通过计算所有作业或进程的周转时间之和除以作业或进程的数量,得到平均周转时间。
在 FCFS 算法中,由于按照到达顺序进行调度,可能会导致长作业或进程长时间占用处理机,从而使平均周转时间较长。
操作系统实验---处理机调度(总11页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--实验报告实验题目姓名:学号:课程名称:操作系统实验所在学院:信息科学与工程学院专业班级:计算机任课教师:处理机调度实验项目名称一、实验目的与要求:1、给出所选实验题目。
2、给出源程序文件名和执行程序文件名。
源程序中要有详细的注释。
3、给出程序中使用的数据结构和符号说明。
4、给出程序的流程图。
5、给出运行结果。
6、总结收获体会和对题解的改进意见及见解。
二、实验设备及软件:装有Linux操作系统的PC机一台三、实验方法(原理、流程图)设计一个按时间片轮转法调度的算法1.进程控制块内容和先来先服务调度的算法一样,如右图所示。
系统设置一个队头和一个队尾指针,分别指向队列的第一个和最后一个进程。
2.为每个进程确定一个要求运行时间和到达时间。
3.按进程到达的先后次序排成一个循环队列。
4.处理机调度时,开始选择队首第一个进程运行,另外再设一个当前运行进程指针,指向当前正运行的进程。
5.本实验是模拟,所选进程并不实际运行,只是执行:估计运行时间减1和输出当前运行进程名。
6.进程运行一次后,应将当前运行进程指针下移一个位置,指向下一个进程。
同时还应判断该进程的剩余运行时间是否为0。
若不为0,则等待下一轮调度;若为0,则则状态改为完成状态,并撤出就绪队列。
7.若就绪队列不空,重复上述5,6步。
8.程序中应有显示和打印语句,显示每次选中进程名字和队列变化情况。
进程名链接指针到达时间估计运行时间进程状态程序流程图如下:建立就绪队列函数五、实验数据(现象)处理分析进一步生成可执行文件时出现错误1:解决办法:#include <>是一个控制输出的头文件,getch()函数不能使用,所以去掉头文件并且修改getch()函数。
具体修改部分如下图所示:进一步生成可执行文件时出现错误2:解决办法:malloc的功能与头文件#include <>有关,但是本参考代码没有给出头文件,所以添加头文件以后malloc的功能可以实现了。
探索处理机调度与死锁的实验本次实验主要针对处理机调度与死锁展开,旨在让学生深入理解操作系统中的重要概念,掌握具体的解决方案。
一、实验目的
1. 探究操作系统中的处理机调度算法并了解其原理。
2. 了解死锁概念及其分类,并学习有关死锁预防和避免的方法。
二、实验内容
1. 处理机调度实验
在实验中,我们学习了几种不同的处理机调度算法:先来先服务(FCFS)、短作业优先(SJF)、优先级调度(PS)、时间片轮转调度(RR)等。
通过模拟不同进程的到达和运行,学生们了解每个算法的特点和缺点,并分析在不同场景下使用算法的合理性。
2. 死锁实验
在死锁实验中,学生们学习了死锁的原理和分类。
为了更好地理解死锁的产生,我们首先逐步增加资源请求数量来模拟进程的资源竞争。
在后面的实验中,我们使用了银行家算法和资源分配图等工具来预防和避免死锁。
三、实验结果
在本次实验中,学生们深入理解了处理机调度的相关概念,并通过实践提高了分析和解决问题的能力。
同时,学生们也掌握了死锁的原理和可能出现的场景,并学会了如何通过预防和避免的方法解决这些问题。
总之,本次实验是一次极为成功的尝试,也是学生们加深对操作系统理论知识的关键步骤。
通过深入探究实验中的内容,可以帮助学生更好地理解和掌握操作系统相关知识,并为今后在实际工作中提供指导和支持。
实验一处理器调度一、实验内容选择一个调度算法,实现处理器调度。
二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实习模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、实验题目第二题:设计一个按时间片轮转法实现处理器调度的程序。
[提示]:(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。
进程控制块的格式为:其中,Q1,Q2,Q3,Q4,Q5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。
当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2) 每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3) 把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到P2执行,则有:标志单元K1K2K3K4K5PCB1 PCB2 PCB3 PCB4 PCB5(4)处理器调度总是选择标志单元指示的进程运行。
由于本实习是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请同学注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。
实验一处理机调度实验一、实验目的:用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验要求:用C++语言实验对N个进程采用非抢占式的动态优先权优先算法的进程调度三、实验内容:(1)设计一个有N个进程并发的进程调度程序。
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)算法。
(2)每个进程有一个进程控制块(PCB)表示。
PCB用结构来描述,包括以下字段:●进程标识ID、●优先数,为初始设定的模拟条件●到达时间,为初始设定的模拟条件●需要运行时间,为初始设定的模拟条件●已用CPU时间,为初始设定的模拟条件●进程阻塞时间startblock(表示进程在运行startblock个时间片后,进程将进入阻塞状态),为初始设定的模拟条件●进程被阻塞的时间blocktime(表示进程等待blocktime个时间片后,将转换成就绪状态),为初始设定的模拟条件,模拟执行I/O操作需要的时间●进程状态state,就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态●队列指针next等等。
(3)优先数改变的规则进程在就绪对列中呆一个时间片,优先数增加1;进程每运行一个时间片,优先数减3;(4)运行过程描述首先按照初始化输入,按照各进程优先级高低排列就绪队列中进程顺序,优先级最高的进程最先获得CPU控制权运行。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,此时应将进程的优先数减3(即降低一级),如果到了进程需被阻塞的时间点,阻塞进程,然后把它插入阻塞队列,等待经过blocktime后,再唤醒进程,把它按照优先级高低,插入就绪队列相应位置等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
操作系统实验一处理机调度算法的实现操作系统中的处理机调度算法是为了合理地分配和利用处理器资源,提高系统的性能和响应速度。
这些算法主要用于决定下一个要执行的进程或线程。
在本篇文章中,我们将介绍几种常见的处理机调度算法以及它们的实际应用。
首先,我们要了解什么是处理机调度算法。
处理机调度是指从就绪队列中选择一个进程,并分配处理机给它。
调度算法的目标是合理地选择进程,以达到最佳的系统性能指标。
这些指标可以包括响应时间、吞吐量、公平性等。
最简单的调度算法是先来先服务(FCFS)。
这种算法按照进程到达的顺序来进行调度。
当一个进程完成后,下一个进程在队列头被选中执行。
FCFS算法的优点是实现简单,但缺点是不考虑进程的执行时间,导致平均等待时间较长。
FCFS主要用于批处理环境中,例如打印任务的排队。
另一种常见的调度算法是短作业优先(SJF)。
这种算法选择剩余执行时间最短的进程进行调度。
为了实现SJF算法,系统需要预测进程的执行时间,这可能是一个难题。
SJF算法的优点是能够最小化平均等待时间,但缺点是可能导致长作业的饥饿。
SJF算法主要用于交互式系统或具有预测性能的任务。
另一个常见的调度算法是轮转调度(RR)。
这种算法将处理机时间分成一定大小的时间片(时间片就是一段处理器运行的时间),每个进程在一个时间片内执行,然后进入队列尾部等待。
轮转调度算法的目的是实现公平性,每个进程都有机会被执行。
RR算法的优点是能够减少各个进程的响应时间,但缺点是可能造成高负载下的处理机浪费。
RR算法主要用于实时系统或多用户环境。
另一个调度算法是最高响应比优先(HRRN)。
响应比是指进程等待时间与预计执行时间的比率。
HRRN算法选择响应比最高的进程进行调度。
这种算法考虑了等待时间和执行时间的权衡,能够实现较好的性能。
但是,HRRN算法计算响应比需要实时监测和更新进程的等待时间和执行时间。
HRRN算法适用于交互式或多用户系统。
还有一种常见的调度算法是最短剩余时间优先(SRTF)。
实验一处理器调度一、实验内容选择一个调度算法,实现处理器调度。
二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实验模拟在单处理器情况下处理器调度,帮助学生加深了解处理器调度的工作。
三、实验题目设计一个按优先数调度算法实现处理器调度的程序提示:(1)假定系统有五个进程,每一个进程用一个进程控制块PCB 来代表。
进程控制块的格式为:其中,进程名----作为进程的标识,假设五个进程的进程名分别是P1,P2,P3,P4,P5。
指针----按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针为“0”。
要求运行时间----假设进程需要运行的单位时间数。
优先数----赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态----可假设有两种状态,“就绪”状态和“结束“状态,五个进程的初始状态都为“就绪“状态,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。
(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列,用一单元指出队首进程,用指针指出队列的连接情况。
例:队首标志(4)处理器调度总是选队首进程运行。
采用动态改变优先数的办法,进程每运行一次优先数就减“1”。
由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。
提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,它占有处理器运行,直到出现等待事件或运行结束。
在这里省去了这些工作。
(5)进程运行一次后,若要求运行时间≠0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改为“结束”(),且退出队列。
实验一处理机调度实验实验目的:用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
实验要求:用C++语言实验对N个进程采用非抢占式的动态优先权优先算法的进程调度实验内容:设计一个有N个进程并发的进程调度程序。
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)算法。
每个进程有一个进程控制块(PCB)表示。
PCB用结构来描述,包括以下字段:进程标识ID、优先数,为初始设定的模拟条件到达时间,为初始设定的模拟条件需要运行时间,为初始设定的模拟条件已用CPU时间,为初始设定的模拟条件进程阻塞时间startblock(表示进程在运行startblock个时间片后,进程将进入阻塞状态),为初始设定的模拟条件进程被阻塞的时间blocktime(表示进程等待blocktime个时间片后,将转换成就绪状态),为初始设定的模拟条件,模拟执行I/O操作需要的时间进程状态state,就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态队列指针next等等。
优先数改变的规则进程在就绪对列中呆一个时间片,优先数增加1;进程每运行一个时间片,优先数减3;运行过程描述首先按照初始化输入,按照各进程优先级高低排列就绪队列中进程顺序,优先级最高的进程最先获得CPU控制权运行。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,此时应将进程的优先数减3(即降低一级),如果到了进程需被阻塞的时间点,阻塞进程,然后把它插入阻塞队列,等待经过blocktime后,再唤醒进程,把它按照优先级高低,插入就绪队列相应位置等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
备注:进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间或顺序。
参考资料:部分数据结构说明:struct pcb { /* 定义进程控制块PCB */char name[10];char state;int super;int ntime;int rtime;。
struct pcb* link;};部分函数说明:sort( ) /* 建立对进程进行优先级排列函数*/input( ) /* 建立进程控制块函数,初始化数据*/disp( ) /*建立进程显示函数,用于显示当前进程信息*/running( ) /* 建立进程执行函数(进程运行时间到,置就绪状态*/main( ) /*主函数*/源代码:#include<stdio.h>#include<stdlib.h>#include<conio.h>#define getpch(type) (type*)malloc(sizeof(type))#define NULL 0#define TIME 2//时间片长度typedef struct pcb{//进程管理块char name[10];//进程名字char state; //进程状态int queue; //进程所在的队列int ntime; //进程需要运行的时间int rtime; //进程已经运行的时间int etime; //进程在本队列可运行的时间片struct pcb *link;}PCB;PCB *ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL; //就绪队列,进程插入位置的变量int geti() //使用户仅能输入整数{char ch;int i = 0;fflush(stdin);ch = getchar();while(ch == '\n'){printf("\tf输入不能为空..请重新输入\n");fflush(stdin);ch = getchar();}while(ch != '\n'){if(ch > '9' || ch < '0'){printf("\t输入有误!!输入只能为正整数,请重新输入...\n");fflush(stdin);i = 0;ch = getchar();}else{i = i*10 + (ch - '0');ch = getchar();}}return i;}void findpos()//更新状态量{PCB *ps = pfend;if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1) pinsert = ps;else{while (ps->link && ps ->link->queue != (pfend ->queue +2)) ps = ps->link;pinsert = ps;}}void insert()//插入进程{if(!ready ){ready = p;pfend = p;pinsert = p;}else if(ready ->queue == 1){//第一队列存在p->link = pfend->link;pfend->link = p;pfend = p;findpos();}else{p->link = ready;ready = p;findpos();}}void input()/*建立进程控制块函数*/{int i,num;printf("\n请输入进程的个数?");num = geti();for(i=0; i < num; i++){printf("\n进程号No.%d:\n",i+1);p=getpch(PCB);printf("\n输入进程名:");scanf("%s",p->name);printf("\n输入进程运行时间:");p ->ntime = geti();printf("\n");p->rtime=0;p->state='w';p->queue =1;p->etime = TIME;p->link=NULL;insert();/*调用insert函数*/}}void disp(PCB *pr)/*建立进程现实函数,用于显示当前进程*/{printf("\nname\t state\t queue\t ntime\t rtime\t在队列可停留时间\t \n");printf("|%s\t",pr->name);printf(" |%c\t",pr->state);printf(" |%d\t",pr->queue);printf(" |%d\t",pr->ntime);printf(" |%d\t",pr->rtime);printf(" |%d\t",pr->etime);printf("\n");}void check()/*建立进程查看函数*/{PCB *pr;printf("\n ****当前正在运行的进程是:%s",ready->name);/*显示当前运行的进程*/ disp(ready);pr= ready ->link;printf("\n****当前就绪队列状态为:\n");/*显示就绪队列状态*/while(pr!=NULL){disp(pr);pr=pr->link;}}void sort()//调整进程队列{if(!ready->link ||ready->queue < ready->link->queue) return;p = ready ->link;ready ->link = pinsert ->link;pinsert ->link = ready;pinsert = ready;ready = p;if (ready && ready -> queue == pinsert ->queue){findpos();}}void addnew()//添加新的进程{if(ready ->queue != 1){(ready -> queue)++;ready->etime *= 2;ready -> state='w';sort();/*调用sort函数*/input();}else{input();}}void destroy()/*建立进程撤销函数(进程运行结束,撤销进程)*/ { printf("\n进程[%s]已完成.\n",ready->name);p = ready;ready = ready->link;free(p);if (ready && ready -> queue == pinsert ->queue)findpos();}void running()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/ { (ready -> rtime)++;ready ->etime --;if(ready->rtime == ready->ntime){destroy();return;}else if(ready ->etime == 0){int time = 2;(ready -> queue)++;for(int i = 2; i != ready->queue; ++i)time *= 2;ready->etime = time;ready -> state='w';sort();/*调用sort函数*/}}void main(){char ch;input();while(ready != NULL){printf("\nThe execute name:%s\n",ready ->name);ready ->state = 'R';check();running();printf("\n按i键添加新进程....按其他任意键继续运行..."); fflush(stdin); ch = getchar();if (ch == 'i'|| ch=='I')addnew();}printf("\n\n 进程已经完成\n");getchar();}。