河北传媒学院
学生实践报告书
学 院 河北传媒学院
专业班级 计算机科学与技术
学生学号 130809010129
学生姓名 张众谦
实践课程 计算机操作系统
实践报告
附: 要求附加学生作品、音视频资料、实验步骤登记表(教师自行制定,记录学生实验步骤完成情况)以作为教师评定成绩的依据。
第二篇:计算机操作系统-处理机调度实验报告
中南大学
实验名称:处理机调度
课程名称:计算机操作系统
学生姓名 盛 希 玲
学 号 0903060215
学 院 信息科学与工程学院
专业班级 电子信息工程0602
完成时间 20##年10月12日
目 录
一 实验内容... 2
二 实验目的... 2
三 实验题目... 2
四 基本思想... 2
五 算法分析... 2
六 流程图... 3
七 算法描述... 4
八 运行输出结果... 9
一 实验内容
选择一个调度算法,实现处理机调度。
二 实验目的
多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。
三 实验题目
设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。
四 基本思想
先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。
五 算法分析
定义一个结构体,此包含了PCB的信息:
struct PCB
{
char PID[5]; /*进程名*/
int needtime; /*要求运行的时间*/
int cputime; /*已运行时间*/
int priority; /*优先权(越小越高)*/
int starttime; /*进入就绪队列的时间*/
int overtime; /*运行完成的时间*/
int state; /*状态:1就绪2运行3完成*/
struct PCB *next;
};
子函数struct PCB *create(int num,int n)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。
main()函数中用一while循环输出进入时间片的进程状态。
六 流程图
七 算法描述
#define NULL 0
#define LEN sizeof(struct PCB)
#include"stdio.h"
#include"stdlib.h"
struct PCB
{
char PID[5]; /*进程名*/
int needtime; /*要求运行的时间*/
int cputime; /*已运行时间*/
int priority; /*优先权(越小越高)*/
int starttime; /*进入就绪队列的时间*/
int overtime; /*运行完成的时间*/
int state; /*状态:1就绪2运行3完成*/
struct PCB *next;
};
struct PCB *create(int num,int n)
/*创建进程,并将进程按优先级顺序插入队列中*/
{
struct PCB *head,*p,*p1,*p2;
int i;
head=NULL; /*头指针指零*/
for(i=1;i<=num;i++) /*循环建立所有进程*/
{
printf("请输入第%d个进程的信息\n",i);
p=(struct PCB *)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*/
p->state=1; /*状态赋为就绪状态*/
p1=head; /*p1指针指向头指针*/
if(head==NULL) /*如果头指针为零将头指针指向新建立的进程*/
{head=p;head->next=NULL;}
else /*头指针不为零的情况*/
{
if(n==1)
while(p1!=NULL&&p->priority>p1->priority) /*查找插入点*/
{p2=p1;
p1=p1->next;
}
else
while(p1!=NULL&&p->starttime>p1->starttime) /*查找插入点*/
{p2=p1;
p1=p1->next;
}
if(head==p1) /*优先权的值最小作为表头*/
{p->next=head;p2=head=p;}
else /*否则的话插入*/
{p2->next=p;p->next=p1;}
}
}
return(head);
}
void main()
{
char now[5];
int cho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0;
struct PCB *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);
printf("显示所有就绪的进程:\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;
}
else break;
}
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)
{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->needtime>head1->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);
else
printf("\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;}
else
if(over!=NULL&&head1!=NULL)
{
p1=head1->next;
p0=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->next;}
if(q2==head1)
{q1->next=head1;head1=q1;}
else
{q3->next=q1;q1->next=q2;}
}
}
}
printf("cpu结束运行!\n");
printf("是否输出所有结束的进程:1是2不是--");
scanf("%d",&choo);
if(choo==1) /*输出所有完成运行的进程*/
{
printf("开始时间:%s\n",now);
printf("进程名\t要求运行时间\t进入就绪队列的时间\t运行完成的时间\n");
while(over!=NULL)
{
printf("%s\t%d\t\t%d\t\t\t%d\n",over->PID,over->needtime,over->starttime,over->overtime);
over=over->next;
}
}
}
八 运行输出结果
初始化进程如右图
显示现在的时间和所有就绪的进程
输入时间片的总数和每个时间片的时间
运行时显示的信息