叙操作系统实验报告二,实现处理器调度的进程.doc
约4页DOC格式手机打开展开
叙操作系统实验报告二,实现处理器调度的进程,叙操作系统实验报告二实现处理器调度的进程 全文4页1332字时间:2005.4.10实验题目:实现处理器调度的进程年级:2002级 班级:计算机(5)姓名:学号:任课教师:实验要求:选择一个调度算法,实现处理器调度。在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪状态进程个数大于处理器数时,就必须依...
内容介绍
此文档由会员 黄药师 发布
叙操作系统实验报告二实现处理器调度的进程
全文4页1332字 时间:2005.4.10
实验题目:实现处理器调度的进程
年级:2002级 班级:计算机(5)
姓名: 学号: 任课教师:
实验要求:
选择一个调度算法,实现处理器调度。
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪状态进程个数大于处理器数时,
就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下处理器调度,帮助学生
加深了解处理器调度的工作。
解题思路(流程图):
主函数流程图
实验结果(部分源码):
#include
#include
#include
struct PCB //定义结构体PCB,用来描述一个进程。
{char PID[3]; //表示进程ID
int PTIME; //表示进程所需要的运行时间
int PPRIORITY; //表示进程的优先级
char STATE; //表示进程的状态,为r时表示就绪,为e时表示已执行完
struct PCB *next;//指向下一个进程
};
struct PCB *create() //创建进程就绪队列,一个按照进程优先级排序的有序队列
{
//head为头指针,tail为一个遍历指针,pretail是指向tail所指的前一个结点的指针,p指向新申请到的结点
struct PCB *head,*tail,*pretail,*p;
int i; //用于for循环
char id[3];
int time;
int priority;
char state='r'; //初始时进程的状态都设为就绪
head=NULL; //初始时,头指针为空
for(i=0;i<5;i++) //五个进程,五次循环
{ pretail=tail=head;
p=(struct PCB *)malloc(sizeof(struct PCB));//申请一个新结点
printf("please input the process's ID:");//提示用户输入新进程的ID
scanf("%s",id);
strcpy(p->PID,id);
printf("please input the process's running time:");//提示用户输入新进程执行完所需要的时间
scanf("%d",&time);
//如果用户输入的新进程执行完所需时间为0,则让用户重新输入执行完所需时间
while(time==0)
{
printf("time can not be zero!,please input againn");
printf("please input the process's running time:");
scanf("%d",&time);
}
p->PTIME =time;
printf("please input the process's priority:");//提示用户输入该进程的优先级
scanf("%d",&priority);
p->PPRIORITY =priority;
p->STATE =state;//创建时,将所有的进程状态都设为就绪状态
if(head==NULL)
{head=pretail=tail=p;p->next =NULL;}//插入第一个进程时,直接把头指针指向这个进程结点即可
else
{ while((p->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))//遍历整个链表,直到找到合适的插入位置
{
pretail=tail;
tail=tail->next;
}
if((p->PPRIORITY) >(tail->PPRIORITY))//找到了合适的位置则插入新进程
{ if(head==tail)//如果此时链表中只有一个进程结点
{
p->next =head;
head=p;
}
else//如果此时链表中有多个进程结点
{
pretail->next =p;
pretail=p;
p->next =tail;
}
}
else //如果新进程结点比链表中的所有进程优先级都高,则插入链表尾部
{ tail->next =p;
p->next =NULL;
}
}
}//创建完五个进程结点组成的有序链表
printf("初始状态如下:n");
for(p=head;p!=NULL;p=p->next )//显示现在所有的进程
{
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",p->PID ,p->PTIME,p->PPRIORITY ,p->STATE );
}
printf("nnnnnn");
return (head);//返回此链表的头指针
}
void run(struct PCB *head)//模拟进程运行的函数
{
//tail是一个遍历指针,pretail是指向tail所指向的前一个进程结点的指针,temp指向当前运行的进程结点
struct PCB *temp,*tail,*pretail;
while(head!=NULL)//如果链表不空
{
temp=head;
//temp指向链表的第一个进程结点,因为是按优先数排序的有序链表,所以第一个结点就是将要运行的进程结点
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//将此进程结点信息显示出来,
temp->PPRIORITY--;//将该进程的优先数减一
temp->PTIME--;//将该进程运行完所需要的时间减一
if(head->next!=NULL)//如果该链表不只一个进程
{
head=head->next ;
tail=pretail=head;
if(temp->PTIME ==0)//如果刚刚运行的进程已运行完,做以下操作
{
temp->STATE='e';//修改进程状态为结束
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//再次显示次进程信息
free(temp);//释放该进程所占内存空间
}
else //如果刚刚运行的进程还没有运行结束,将这个进程结点再插入到链表队列中,并保持链表的有序性
{
//此段代码与建立链表函数create()中插入结点代码一致,这里不再重复添加注释。
//本来准备将此段代码作为一个子函数单独写出,但是考虑到这段代码并不长,就直接用文本复制了一遍
while((temp->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))
{
pretail=tail;
tail=tail->next;
}
if((temp->PPRIORITY) >(tail->PPRIORITY))
{
if(head==tail)
{
temp->next =head;
head=temp;
}
else
{
pretail->next =temp;
pretail=temp;
temp->next =tail;
}
}
else
{
tail->next =temp;
temp->next =NULL;
}
}
}
else //如果该链表中只有一个进程结点了,做以下操作
{
head=tail=pretail=temp;//直接将head,tail,pretail都指向此结点
if(temp->PTIME ==0)//如果这个结点也执行结束,则把这个结点状态置为结束,并将此链表销毁,释放内存
{
temp->STATE='e';
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );
head=NULL;
free(temp);
}
}
}
}
void main()
{
struct PCB *y;
y=create();//创建链表
printf("执行序列如下:n");
run(y); //模拟运行进程
printf("the end!");//提示用户所有进程都已经执行完
}
述详尽
全文4页1332字 时间:2005.4.10
实验题目:实现处理器调度的进程
年级:2002级 班级:计算机(5)
姓名: 学号: 任课教师:
实验要求:
选择一个调度算法,实现处理器调度。
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪状态进程个数大于处理器数时,
就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下处理器调度,帮助学生
加深了解处理器调度的工作。
解题思路(流程图):
主函数流程图
实验结果(部分源码):
#include
#include
#include
struct PCB //定义结构体PCB,用来描述一个进程。
{char PID[3]; //表示进程ID
int PTIME; //表示进程所需要的运行时间
int PPRIORITY; //表示进程的优先级
char STATE; //表示进程的状态,为r时表示就绪,为e时表示已执行完
struct PCB *next;//指向下一个进程
};
struct PCB *create() //创建进程就绪队列,一个按照进程优先级排序的有序队列
{
//head为头指针,tail为一个遍历指针,pretail是指向tail所指的前一个结点的指针,p指向新申请到的结点
struct PCB *head,*tail,*pretail,*p;
int i; //用于for循环
char id[3];
int time;
int priority;
char state='r'; //初始时进程的状态都设为就绪
head=NULL; //初始时,头指针为空
for(i=0;i<5;i++) //五个进程,五次循环
{ pretail=tail=head;
p=(struct PCB *)malloc(sizeof(struct PCB));//申请一个新结点
printf("please input the process's ID:");//提示用户输入新进程的ID
scanf("%s",id);
strcpy(p->PID,id);
printf("please input the process's running time:");//提示用户输入新进程执行完所需要的时间
scanf("%d",&time);
//如果用户输入的新进程执行完所需时间为0,则让用户重新输入执行完所需时间
while(time==0)
{
printf("time can not be zero!,please input againn");
printf("please input the process's running time:");
scanf("%d",&time);
}
p->PTIME =time;
printf("please input the process's priority:");//提示用户输入该进程的优先级
scanf("%d",&priority);
p->PPRIORITY =priority;
p->STATE =state;//创建时,将所有的进程状态都设为就绪状态
if(head==NULL)
{head=pretail=tail=p;p->next =NULL;}//插入第一个进程时,直接把头指针指向这个进程结点即可
else
{ while((p->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))//遍历整个链表,直到找到合适的插入位置
{
pretail=tail;
tail=tail->next;
}
if((p->PPRIORITY) >(tail->PPRIORITY))//找到了合适的位置则插入新进程
{ if(head==tail)//如果此时链表中只有一个进程结点
{
p->next =head;
head=p;
}
else//如果此时链表中有多个进程结点
{
pretail->next =p;
pretail=p;
p->next =tail;
}
}
else //如果新进程结点比链表中的所有进程优先级都高,则插入链表尾部
{ tail->next =p;
p->next =NULL;
}
}
}//创建完五个进程结点组成的有序链表
printf("初始状态如下:n");
for(p=head;p!=NULL;p=p->next )//显示现在所有的进程
{
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",p->PID ,p->PTIME,p->PPRIORITY ,p->STATE );
}
printf("nnnnnn");
return (head);//返回此链表的头指针
}
void run(struct PCB *head)//模拟进程运行的函数
{
//tail是一个遍历指针,pretail是指向tail所指向的前一个进程结点的指针,temp指向当前运行的进程结点
struct PCB *temp,*tail,*pretail;
while(head!=NULL)//如果链表不空
{
temp=head;
//temp指向链表的第一个进程结点,因为是按优先数排序的有序链表,所以第一个结点就是将要运行的进程结点
printf("PID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//将此进程结点信息显示出来,
temp->PPRIORITY--;//将该进程的优先数减一
temp->PTIME--;//将该进程运行完所需要的时间减一
if(head->next!=NULL)//如果该链表不只一个进程
{
head=head->next ;
tail=pretail=head;
if(temp->PTIME ==0)//如果刚刚运行的进程已运行完,做以下操作
{
temp->STATE='e';//修改进程状态为结束
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );//再次显示次进程信息
free(temp);//释放该进程所占内存空间
}
else //如果刚刚运行的进程还没有运行结束,将这个进程结点再插入到链表队列中,并保持链表的有序性
{
//此段代码与建立链表函数create()中插入结点代码一致,这里不再重复添加注释。
//本来准备将此段代码作为一个子函数单独写出,但是考虑到这段代码并不长,就直接用文本复制了一遍
while((temp->PPRIORITY <=tail->PPRIORITY) &&(tail->next!=NULL))
{
pretail=tail;
tail=tail->next;
}
if((temp->PPRIORITY) >(tail->PPRIORITY))
{
if(head==tail)
{
temp->next =head;
head=temp;
}
else
{
pretail->next =temp;
pretail=temp;
temp->next =tail;
}
}
else
{
tail->next =temp;
temp->next =NULL;
}
}
}
else //如果该链表中只有一个进程结点了,做以下操作
{
head=tail=pretail=temp;//直接将head,tail,pretail都指向此结点
if(temp->PTIME ==0)//如果这个结点也执行结束,则把这个结点状态置为结束,并将此链表销毁,释放内存
{
temp->STATE='e';
printf("tttttPID=%s,PTIME=%d,PPRIORITY=%d,STATE=%cn",temp->PID ,temp->PTIME,temp->PPRIORITY ,temp->STATE );
head=NULL;
free(temp);
}
}
}
}
void main()
{
struct PCB *y;
y=create();//创建链表
printf("执行序列如下:n");
run(y); //模拟运行进程
printf("the end!");//提示用户所有进程都已经执行完
}
述详尽