您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 计算机操作系统-处理机调度实验报告
中南大学实验名称:处理机调度课程名称:计算机操作系统学生姓名盛希玲学号0903060215学院信息科学与工程学院专业班级电子信息工程0602完成时间2008年10月12日1目录一实验内容......................................................................................2二实验目的......................................................................................2三实验题目......................................................................................2四基本思想......................................................................................2五算法分析......................................................................................2六流程图..........................................................................................3七算法描述......................................................................................4八运行输出结果..............................................................................92一实验内容选择一个调度算法,实现处理机调度。二实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。三实验题目设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。四基本思想先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。五算法分析定义一个结构体,此包含了PCB的信息:structPCB{charPID[5];/*进程名*/intneedtime;/*要求运行的时间*/intcputime;/*已运行时间*/intpriority;/*优先权(越小越高)*/intstarttime;/*进入就绪队列的时间*/intovertime;/*运行完成的时间*/intstate;/*状态:1就绪2运行3完成*/structPCB*next;};子函数structPCB*create(intnum,intn)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。3main()函数中用一while循环输出进入时间片的进程状态。六流程图开始调用creat()函数,初始化进程PCB,各进程按优先级排序按优先级选择绪队列中进程放入时间片运转是否开始运行运行,每运行一秒优先权和已运行时间加一时间片结束,是否就绪进程队列不为零将进入就绪队列的进程就绪队列是否有新进程进入是否所有进程运行结束结束4七算法描述#defineNULL0#defineLENsizeof(structPCB)#includestdio.h#includestdlib.hstructPCB{charPID[5];/*进程名*/intneedtime;/*要求运行的时间*/intcputime;/*已运行时间*/intpriority;/*优先权(越小越高)*/intstarttime;/*进入就绪队列的时间*/intovertime;/*运行完成的时间*/intstate;/*状态:1就绪2运行3完成*/structPCB*next;};structPCB*create(intnum,intn)/*创建进程,并将进程按优先级顺序插入队列中*/{structPCB*head,*p,*p1,*p2;inti;head=NULL;/*头指针指零*/for(i=1;i=num;i++)/*循环建立所有进程*/{printf(请输入第%d个进程的信息\n,i);p=(structPCB*)malloc(LEN);/*开辟一个空间*/printf(进程名:);/*输入进程名*/scanf(%s,p-PID);printf(要求运行的时间:);/*输入要运行的时间*/scanf(%d,&p-needtime);p-cputime=0;/*占用处理机的时间赋为零*/printf(优先权:);/*输入优先权*/scanf(%d,&p-priority);if(n==1)p-starttime=0;/*进入就绪队列的时间赋为零*/else{printf(进入就绪队列时间:);/*输入进入就绪队列的时间*/scanf(%d,&p-starttime);}p-overtime=-1;/*运行没有结束所以运行完成的时间赋为-1*/5p-state=1;/*状态赋为就绪状态*/p1=head;/*p1指针指向头指针*/if(head==NULL)/*如果头指针为零将头指针指向新建立的进程*/{head=p;head-next=NULL;}else/*头指针不为零的情况*/{if(n==1)while(p1!=NULL&&p-priorityp1-priority)/*查找插入点*/{p2=p1;p1=p1-next;}elsewhile(p1!=NULL&&p-starttimep1-starttime)/*查找插入点*/{p2=p1;p1=p1-next;}if(head==p1)/*优先权的值最小作为表头*/{p-next=head;p2=head=p;}else/*否则的话插入*/{p2-next=p;p-next=p1;}}}return(head);}voidmain(){charnow[5];intcho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0;structPCB*head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3;over=NULL;printf(初始化进程...\n);printf(输入总的就绪进程数:);scanf(%d,&num);head=create(num,1);/*建立就绪进程的链表*/printf(输入将会就绪的进程数:);scanf(%d,&num1);/*建立将会进入就绪进程的链表*/later=create(num1,2);printf(cpu是否开始运行:1是2不是--);scanf(%d,&cho);if(cho==1)/*处理机开始进行调度*/{printf(现在的时间是:);scanf(%s,now);6printf(显示所有就绪的进程:\n);p2=head;printf(进程名\t要求运行时间\t已运行时间\t优先权\t状态(1就绪2运行3结束)\n);while(p2!=NULL){printf(%s\t%d\t\t%d\t\t%d\t%d\n,p2-PID,p2-needtime,p2-cputime,p2-priority,p2-state);p2=p2-next;}printf(请输入时间片总数:);scanf(%d,&timepiece);printf(请输入时间片的时间:);scanf(%d,&time);printf(运行正式开始!\n);head1=head;printf(\t\t进程名\t要求运行时间\t已运行时间\t优先权\t状态\n);for(i=1;i=timepiece;i++)/*将进入时间片运行的进程用头指针head1指示,并改变就绪进程头指针head的指向*/{if(head!=NULL){p=head;head=head-next;}elsebreak;}p-next=NULL;while(head1!=NULL)/*就绪进程头指针不为零就循环*/{head1-state=2;/*状态:1就绪2运行3完成*/for(j=1;j=time;j++)/*每个时间片所需时间的循环*/{clock++;/*定时器每秒加1*/if(later!=NULL&&clock==later-starttime)/*如果将进入就绪队列的进程时间到达加入就绪队列*/{l=later;l1=head;later=later-next;if(head==NULL){head=l;head-next=NULL;}else{while(l1!=NULL&&l1-priority=l-priority)7{l2=l1;l1=l1-next;}if(l1==head){l-next=head;head=l;}else{l2-next=l;l-next=l1;}}}flag=0;printf(\n%3d秒时间片第%d秒,clock,j);q=head1;if(head1-needtimehead1-cputime)/*以运行时间和优先权都加1*/{head1-cputime++;head1-priority++;while(q)/*运行队列不为零输出其信息*/{if(q==head1)printf(%s\t%d\t\t%d\t\t%d\t%d\n,q-PID,q-needtime,q-cputime,q-priority,q-state);elseprintf(\t\t%s\t%d\t\t%d\t\t%d\t%d\n,q-PID,q-needtime,q-cputime,q-priority,q-state);q=q-next;}}if(head1-needtime==head1-cputime)/*运行完成将其放入over为头指针的链表中*/{head1-state=3;head1-overtime=clock;if(over==NULL){over=head1;head1=head1-next;over-next=NULL;}elseif(over!=NULL&&head1!=NULL){p1=head1-next;8p0=over;over=head1;over-next=p0;head1=p1;}flag=1;}if(flag==1)break;}if(flag==1)/*有进程结束的情况*/{if(head!=NULL)/*就绪队列不为零将优先权最高的放入运行链表中*/{q1=head;head=head-next;q2=head1;while(q2!=NULL&&q2-priority=q1-priority){q3=q2;q2=q2-next;}if(q2==head1){q1-next=head1;head1=q1;}else{q3-next=q1;q1-next=q2;}}}else/*无进程结束的情况,寻找优先权最高的运行*/{head1-state=1;q1=head1;head1=head1-next;q2=head1;while(q2!=NULL&&q2-priority=q1-priority){q3=q2;q2=q2-
本文标题:计算机操作系统-处理机调度实验报告
链接地址:https://www.777doc.com/doc-6450121 .html