测试过程:(实验中出现的问题、错误、解决方法) 1. 在短作业优先和先来先服务中如何实现排序,即实现链表中的排序比较麻烦,方法有待改正 2. 由于此试验模仿的是多个进程调度,就绪队列为五个进程,所以一次调度后就绪对列为空,此时要在新建进程,所以此时要保证进程的为节点跟头结点相同,且都指向空 3. 每次调度后对就绪队列的修改对不同调度方法都不同,当只剩下一个进程时特殊处理 4. 开始时pcb的名字用数组存储,但在排序时不好实现交换,就改为字符串类型的名字 |
实验总结: 圣诞快乐 英语写程序时必须要自己明白思路,明白下一步应该这样运行和使用,要不不能将程序很好的写出 并且基础要扎实,要对C++基础掌握好才能很好地应用 签名 孙发玉 2012年 4月 25日 |
评语与成绩: 教师签名: 年 月 日 |
实验名称 | 进程的调度 | |||||
实验类型 | 验证性 | 实验时间 | 2012年4月25日 | |||
实验环境 | Windows7+DEV c++ | |||||
实验目的与要求:加深对进程概念的理解,明确进程和程序的区别,深入理解系统如何组织进程,创建进程,进一步认识如何实现处理机调度。 | ||||||
实验内容:编写程序完成单处理机系统中的进程调度,要求采用“先来先服务”、“短作业优先”、“最高优先数优先”、“时间片轮转”等调度算法之一对五个进程进行调度。实验具体包括:首先确定进程控制块的内容和组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所做工作进行测试 | ||||||
实验步骤:(算法描述、源程序、操作步骤和方法) 1.创建进程,即创建PCB结构体,假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名,指针,要求运行时间,已运行时间,优先数,进程大小,其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。指针——根据算法要求建立五个进程的队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。 要求运行时间——假设进程需要运行的单位时间数。 已运行时间——假设进程已经运行的单位时间数,初始值为“0”。 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态——可假设有两种状态,“就绪”状态和“执行”状态。五个进程的初始状态都为“就绪”,用“R”表示 ,手动创建 2.进程调度: 包含四种调度算法:先来先服务,短作业优先,时间片轮转,最高优先级优先,每调度一次后显示就就绪队列中的进程情况,先来先服务和短作业优先是非抢占式,每个进程都一次性运行完,时间片轮转和优先级对被选中的进程并不实际的启动运行,而是执行:优先数-1,要求运行时间-1,已运行时间+1,来模拟进程的一次运行,表示进程已经运行过一个单位的时间 源程序: #include<iostream> #include<string> using namespace std; void creatPCB();//进程创建 void diaodu();//进程调度 void ff();//先来先服务 void sf();//短作业优先 void tf();//时间片轮转 void pf();//优先级优先 void runFirst(); void show(); void paixu(int x); typedef struct PCB你是我的梦中情人 { string name; //作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5 struct PCB *next;//根据算法要求建立五个进程的队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为"0" int needTime;//假设进程需要运行的单位时间数 int finishTime;//假设进程已经运行的单位时间数,初始值为"0" int daxiao;//作业大小 int priority;// 优先级 char state; //状态 }PCB; PCB *head;//建立就绪对列头 结点 PCB *rear; //建立就绪对列尾 结点 int main(){ head=rear=new PCB; head->next=NULL; while(1){ cout<<"***************************"<<endl; cout<<"* 1. 创建进程 *"<<endl; cout<<"* *"<<endl; cout<<"* 2.进程调度 *"<<endl; cout<<"* *"<<endl; cout<<"***************************"<<endl; cout<<"请先创建进程 ,请选择:"; char a; cin>>a; switch(a){ ca '1': creatPCB(); break; ca '2': diaodu(); break; default:cout<<"error\n";break; }} system("pau"); 2014年12月英语六级 } void creatPCB(){ cout<<"创建5个进程到就绪对列,请输入:"<<endl; for(int i=1;i<=5;i++){ PCB *p; p=new PCB; cout<<"第"<<i<<"个进程的名字"<<":"; cin>>p->name; cout<<"要求运行时间:"; cin>>p-> needTime; p->finishTime = 0; cout<<"进程大小:"; cin>>p->daxiao; cout<<"优先级:"; cin>>p->priority; p->state = 'R'; rear->next=p; rear=p; rear->next=NULL; } cout<<"创建进程成功"<<endl; } void diaodu(){ while(1){ cout<<"***************************************"<<endl; cout<<"* *"<<endl; cout<<"* 1.先来先服务 *"<<endl; cout<<"* 2.短作业优先 *"<<endl; cout<<"* 3.时间片轮转 *"<<endl; cout<<"* 4.最高优先数优先和时间片轮转 *"<<endl; cout<<"* 5.退出 *"<<endl; cout<<"***************************************"<<endl; cout<<"请选择调度算法:"; char b; cin>>b; switch(b){ ca'1': ff(); return; ca'2': sf(); return; ca'3':tf(); return; ca'4':pf(); return; ca'5': return; } } } void ff(){ cout<<"初始状态为:"<<endl; show(); int times=0; while(head->next!=NULL){ if(head->next->next!=NULL){ times++; cout<<"第"<<times<<"次调度后就绪队列为:"<<endl; } PCB* p1; p1=head->next; if(p1==rear){ head->next=p1->next; rear=head; } head->next=p1->next; PCB* p2; p2=head->next; cout<<"名字"<<"\t"<<"大小"<<"\t"<<"状态"<<endl; while(p2!=NULL){ cout<<p2->name<<"\t"<<p2->daxiao<<"\t"<<p2->state<<endl; p2=p2->next; } } } bonnyvoid sf(){ int times=0; while(head->next != NULL){ cout<<"第"<<times<<"次调度后就绪队列为:"<<endl; times++; paixu(1); cout<<"名字"<<"\t"<<"所需时间"<<"\t"<<"状态"<<endl; PCB* p2; p2=head->next; while(p2!=NULL){ cout<<p2->name<<"\t"<<p2->needTime<<"\t\t"<<p2->state<<endl; p2=p2->next; } head->next=head->next->next; if(head->next==NULL) rear=head; } cout<<"第"<<times<<"次调度后就绪队列为空"<<endl; } void tf(){ cout<<"初始状态为:"<<endl; show(); int times= 0; while(head->next != NULL){ times++; cout<<"第"<<times<<"次调度后就绪队列为:"<<endl; runFirst(); } } void pf(){ cout<<"初始状态为:"<<endl; paixu(2); show(); int times= 0; while(head->next!= NULL){ times++; cout<<"第"<<times<<"次调度后就绪队列为:"<<endl; head->next->priority--; head->next->needTime--; head->next->finishTime++; if(head->next->needTime==0){ 小沈阳补办婚礼 head->next=head->next->next; if(head->next==NULL) rear=head; } paixu(2); if(head->next!=NULL) show(); el cout<<"就绪队列为空"<<endl; } } void runFirst(){ PCB* first = head->next; first->needTime--; first->finishTime++; if(first->needTime == 0){ head->next = first->next; if(first->next==NULL){ head->next = first->next; rear=head; } } el{ if(first->next!=NULL){ PCB* node = first->next; rear->next = first; first->next = NULL; rear = first; head->next =node; } } show(); } void show(){ PCB* p1 = head->next; cout<<"名字"<<"\t"<<"需要总时间"<<"\t"<<"已运行时间"<<"\t"<<"大小"<<"\t"<<"优先级"<<"\t"<<"状态"<<endl; while(p1!=NULL) { cout<<p1->name<<"\t"<<p1->needTime<<"\t\t"<<p1->finishTime<<"\t\t"<<p1->daxiao<<"\t"<<p1->priority<<"\t"<<p1->state<<endl; p1=p1->next; quo } } void paixu(int x){ PCB* p1; PCB* p2; PCB* p3; PCB* p4; p3=rear; while(head->next->next!=NULL&&p3!=head->next->next){ p1=head; p2=p1->next; while(p2!=p3){ switch(x){ ca 1: {口译英语 p1=p2; p2=p2->next; if(p1->needTime>p2->needTime){ string name1; 圣诞快乐 英语 int needTime1; int finishTime1; int daxiao1; name1=p1->name; p1->name=p2->name; p2->name=name1; needTime1=p1->needTime; p1->needTime=p2->needTime; p2->needTime=needTime1; finishTime1=p1->finishTime; p1->finishTime=p2->finishTime; p2->finishTime=finishTime1; daxiao1=p1->daxiao; p1->daxiao=p2->daxiao; p2->daxiao=daxiao1; } } break; ca 2: { p1=p2; p2=p2->next; if(p1->priority<p2->priority){ string name1; int needTime1; int finishTime1; int daxiao1; 番禺英语培训 int priority1; name1=p1->name; p1->name=p2->name; p2->name=name1; needTime1=p1->needTime; p1->needTime=p2->needTime; p2->needTime=needTime1; finishTime1=p1->finishTime; p1->finishTime=p2->finishTime; p2->finishTime=finishTime1; daxiao1=p1->daxiao; p1->daxiao=p2->daxiao; p2->daxiao=daxiao1; priority1=p1->priority; p1->priority=p2->priority; p2->priority=priority1; } } break; } } p3=p1; } abc教育集团 } | ||||||
本文发布于:2023-05-20 14:34:17,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/78/708423.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |