操作系统实验报告.docx
- 文档编号:16970248
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:12
- 大小:179.17KB
操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(12页珍藏版)》请在冰点文库上搜索。
操作系统实验报告
一、实验内容
•实现短进程优先调度算法(SPF)
•实现时间片轮转调度算法(RR)
二、实验目的
•通过对进程调度算法的设计,深入理解进程调度的原理。
•进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
•进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。
3、实验题目
1.短进程优先调度算法(SPF)
原理:
每次调度是从就绪队列中,选择一个最短的进程,把处理器分配给该进程,使之得到执行。
该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。
2.时间片轮转调度算法RR
原理:
时间片轮转法主要用于进程调度。
采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。
进程调度按一定时间片(q)轮番运行各个进程。
进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。
4、打印的源程序及附上的注释
#defineMAX100
#include
#include
intm,b,n,x;
intrt[10];//到达时间
intst[10];//服务时间
intct[10];//完成时间
intcyt[10];//周转时间
/**************RR算法***************/
voidRR(intN)
{
inti,t,k;
inta[MAX];//存放进程的剩余时间
intcnt[MAX];//存放进程调度次数
printf("pleaseinputthetimepiece(t):
");
scanf("%d",&t);
for(i=0;i { printf("pleaseinputtheserivetimeofprocess%d: \n",i+1); scanf("%d",&a[i]); cnt[i]=0; } k=1; while(k) { for(i=0;i { if(a[i]! =0) if(a[i]>=t) { a[i]-=t; b+=t; cnt[i]=cnt[i]+1; printf("processname: %d\ncallednumber: %d\nendtime: %d\nlefttime: %d\n",i+1,cnt[i],b,a[i]); printf("*********************************\n"); } else { b=b+a[i]; cnt[i]=cnt[i]+1; a[i]=0; printf("processname: %d\ncallednumber: %d\nendtime: %d\nlefttime: %d\n",i+1,cnt[i],b,a[i]); printf("*********************************\n"); } elsecontinue; } for(i=0;i if(a[i]! =0) { k=1;break; } else continue; if(i>=N) k=0; } printf("alltheprocesshavebeendone\n"); } /********SPF算法*********/ //定义进程结构体 structpro { intnum;//进程号 intarriveTime;//到达时间 intservice;//执行时间 structpro*next; }; //函数声明 structpro*creatList();//创建链表,按照进程的到达时间排列 voidinsert(structpro*head,structpro*s);//插入节点 structpro*searchByAT(structpro*head,intAT);//查找第一个到达时间大于AT的节点,返回其前一个指针 voidrun(structpro*head);//按短进程优先算法调度,并输出其运行情况 voiddel(structpro*p);//删除p的下一个节点 intgetCount(structpro*head,inttime);//查看当前就绪队列中的进程数 structpro*creatList()//创建链表,按照进程的到达时间排列 { structpro*head=(structpro*)malloc(sizeof(structpro)); structpro*s; inti; head->next=NULL; for(i=0;i { s=(structpro*)malloc(sizeof(structpro)); printf("plaeseinputprocessname(number): \n"); scanf("%d",&(s->num)); printf("pleaseinputprocessarrivetime\n"); scanf("%d",&(s->arriveTime)); printf("pleaseinputservicetime\n"); scanf("%d",&(s->service)); s->next=NULL; insert(head,s); } returnhead; } voidinsert(structpro*head,structpro*s)//插入节点 { structpro*p=searchByAT(head,s->arriveTime); s->next=p->next; p->next=s; return; } structpro*searchByAT(structpro*head,intAT)//查找第一个到达时间大于AT的节点,返回其前一个指针 { structpro*p,*q; p=head; q=head->next; while(q! =NULL&&q->arriveTime<=AT) { p=q; q=q->next; } returnp; } voiddel(structpro*p)//删除p的下一个节点 { structpro*tmp; tmp=p->next; p->next=tmp->next; free(tmp); return; } intgetCount(structpro*head,inttime)//查看当前就绪队列中的进程数 { intcount=0; structpro*p,*q; p=head; q=p->next; while(q! =NULL&&q->arriveTime<=time) { count++; p=q; q=q->next; } returncount; } structpro*SPF(structpro*head,intcount)//在头节点后的count个节点中选择service最小的,返回其前一个节点的指针 { intmin; structpro*p,*q,*flag; p=head; q=p->next; min=q->service; flag=p;//flag记录返回值 while(count>0) { if(q->service { min=q->service; flag=p; } count--; p=q; q=q->next; } returnflag; } voidrun(structpro*head)//按短进程优先算法调度,并输出其运行情况 { inttime=0,count,i; structpro*s,*t; while(head->next! =NULL) { count=getCount(head,time);//查看就绪队列中的进程数目 if(count==0)//如果当前就绪队列中没有进程,时间自增 time++; else if(count==1)//如果就绪队列中只有一个进程,则必定是第一个节点 { t=head; s=t->next; printf("processname: %d\n",s->num); printf("arrivetime: %d\n",s->arriveTime); printf("serivetime: %d\n\n",s->service); printf("startime: %d\n",time); time+=s->service; printf("endtime: %d\n",time); printf("turnaroundtime: %d\n",time-s->arriveTime); i=time-s->arriveTime; printf("*********************************\n"); del(t); } else//如果就绪队列中的进程数≥2,则在head后的count个节点中的短进程优先调度 { t=SPF(head,count); s=t->next; printf("processname: %d\n",s->num); printf("arrivetime: %d\n",s->arriveTime); printf("serivetime: %d\n\n",s->service); printf("startime%d\n",time); time+=s->service; printf("endtime: %d\n",time); printf("turnaroundtime: %d\n",time-s->arriveTime); i=time-s->arriveTime; printf("*********************************\n"); del(t); } } } voidmain() { intswich;//选择使用算法 structpro*head; intc=1;//选择是否继续 for(;c==1;) { printf("pleaseinputthenumberoftheprocesses: "); scanf("%d",&x); printf("pleasechoosemethod(RR: 0SPF: 1): "); scanf("%d",&swich); if(swich==0) RR(x); elseif(swich==1) { head=creatList(); printf("SPF: \n"); run(head); } else printf("inputerror,pleaseinputagain: \n"); printf("continue: 1,quit: 0\npleaseinput: "); scanf("%d",&c); } printf("*************end***********\n"); } 五、打印的程序运行时初值和运行结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告