进程调度.docx
《进程调度.docx》由会员分享,可在线阅读,更多相关《进程调度.docx(16页珍藏版)》请在冰豆网上搜索。
![进程调度.docx](https://file1.bdocx.com/fileroot1/2022-10/29/79d0ba92-2f8e-4e34-9f91-68e6ee16be6d/79d0ba92-2f8e-4e34-9f91-68e6ee16be6d1.gif)
进程调度
操作系统实验报告
姓名
学号
日期
2013.04.24
实验室
指导教师
设备编号
实验题目
进程调度算法
一、实验目的
1.了解计算机操作系统的一些有关进程调度等方面的知识。
2.掌握利用简单的数据结构,模拟操作系统中的进程调度。
二.实验内容
要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由进程调度程序完成的。
常用的有优先级调度算法、先来先服务算法、时间片轮转算法。
三、源代码及实验结果
1.设计思想
对于先到先服务算法,只需要给定每个进程的进程号,然后依次顺序执行就可以了。
对于优先度调度算法,需要先判断优先度的大小,优先度最大的先执行,进程运行完毕以后,按照优先数的改变的原则进行改变,然后继续判断所有的优先数的大小,依旧是优先数最大的先执行,直到执行完毕。
2.源代码
#include
#include
#include
#include
#include
typedefstructPROC
{
intpid;//进程标志符
intpri;//进程优先级
intcputime;//cpu时间统计
intalltime;//运行所需时间
intstate;//进程状态
}PROC;
//进程控制块结构
typedefstructNode
{
PROCinfo;//进程控制块信息
structNode*next;//下一个结点指针
}Node;//链表结点结构
typedefNode*LinkList;
//初始化有序链表,返回一个链表的头结点
Node*InitSortedList()
{
Node*head=(Node*)malloc(sizeof(Node));
head->next=NULL;
returnhead;
}
voidInsertSortedList(LinkListL,PROCProc)
{
Node*pre=L;
Node*p=pre->next;
Node*NewProc=(Node*)malloc(sizeof(Node));
NewProc->info=Proc;
while(p!
=NULL&&Proc.pri<=(p->info).pri)
{//寻找合适的插入点
pre=p;
p=p->next;
}
if(p==NULL)
{
pre->next=NewProc;
NewProc->next=NULL;
}
else
{
NewProc->next=p;
pre->next=NewProc;
}
}
//摘取有序链表的第一个结点(这个结点从链表中移出)
PROC*GetHeadElement(LinkListL)
{
PROC*p;
if(L->next==NULL)
{
returnNULL;
}
else
{
p=&((L->next)->info);
L->next=(L->next)->next;
returnp;
}
}
//打印有序链表内容
voidPrintSortedList(LinkListL)
{
Node*p=L->next;
if(p==NULL)
{
printf("\n这个队列没节点!
");
}
else
{
printf("\n现实现在的队列:
");
while(p!
=NULL)
{
printf("\n进程id:
%d",(p->info).pid);
printf("进程优先级:
%d",(p->info).pri);
printf("CPU时间:
%d",(p->info).cputime);
printf("运行时间:
%d",(p->info).alltime);
printf("进程状态:
%d\n",(p->info).state);
p=p->next;
}
}
}
//打印进程控制块信息
voidPrintPROC(PROC*Proc)
{
if(Proc==NULL)
{
printf("\nProcessPointisNULL!
");
}
else
{
printf("\n进程id:
%d",Proc->pid);
printf("进程优先级:
%d",Proc->pri);
printf("CPU时间:
%d",Proc->cputime);
printf("所需总时间:
%d",Proc->alltime);
printf("进程状态:
%d\n",Proc->state);
}
}
voidDisplay(structPROCp[],intp_num,inti)//显示函数
{
intj;
for(j=i-1;j{
printf("\n进程id:
%d",p[j].pid);
printf("进程优先级:
%d",p[j].pri);
printf("所需总时间:
%d",p[j].alltime);
printf("进程状态:
%d\n",p[j].state);
printf("\n");
}
}
intmain()
{
inti,count,choice;
intp_num;
PROCp[100];
PROC*pp;
charM;
time_tt;
srand((unsigned)time(&t));
printf("选择1产生新的进程调度/选择2不产生并结束(1/2)\n");
scanf("%d",&M);
while(M==1)
{
printf("请输入所选择的算法:
1:
先到先服务调度2:
优先权调度3:
按0退出\n");
scanf("%d",&choice);
switch(choice)//选择进程调度算法
{
case1:
{
printf("*****************************************\n");
printf("*先到先服务调度*\n");
printf("**\n");
printf("*****************************************\n");
printf("输入需要的进程数:
");
scanf("%d",&p_num);
printf("1.手工输入\n2.自动生成\n");
intP_Input;
scanf("%d",&P_Input);
LinkListL=InitSortedList();
switch(P_Input)
{
case1:
{
intP_Pri,P_AllTime;
printf("请输入优先级(最高20)需要的时间\n");
for(i=0;i{
scanf("%d",&P_Pri);
scanf("%d",&P_AllTime);
p[i].pid=i+1;
p[i].cputime=0;
p[i].state=1;
p[i].pri=P_Pri;
p[i].alltime=P_AllTime;
}
break;
}
case2:
{
for(i=0;i{
p[i].pid=i+1;
p[i].pri=rand()%20;
p[i].cputime=0;
p[i].alltime=rand()%20+1;
p[i].state=1;
}
break;
}
}
for(i=1;i<=p_num;i++)
{
printf("*******步骤#%d******************",i);
Display(p,p_num,i);
printf("\n进程%d运行完毕,进入完成队列!
\n",i);
}
printf("该进程调度完成!
\n\n");
break;
}
case2:
{
printf("*****************************************\n");
printf("*优先权调度*\n");
printf("**\n");
printf("*****************************************\n");
printf("输入需要的进程数:
");
scanf("%d",&p_num);
printf("1.手工输入\n2.自动生成\n");
intP_Input;
scanf("%d",&P_Input);
LinkListL=InitSortedList();
switch(P_Input)
{
case1:
{
printf("请输入优先级(最高20)CPU时间(限定30以内)需要的时间\n");
intP_Pri,P_CpuTime,P_AllTime;
for(i=0;i{
scanf("%d",&P_Pri);
scanf("%d",&P_CpuTime);
scanf("%d",&P_AllTime);
p[i].pid=i+1;
p[i].pri=P_Pri;//优先级最高20
p[i].cputime=P_CpuTime;//cpu时间统计限定在30以内
p[i].alltime=p[i].cputime+P_AllTime;//所需全部时间
p[i].state=1;
}
break;