计算机软件基础实践报告

时间:2024.5.8

计算机软件实践报告

题 目 处理机调度

专 业 电子工程

班 级 电子1班

学生姓名 钟涛 指导教师 冯建群

二0一四 年 十 月

计算机软件基础实践报告

计算机软件基础实践报告

实验名称:处理机调度

一 实验内容

选择一个调度算法,实现处理机调度。

二 实验目的

多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。

三 实验题目

设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。

四 基本思想

先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。

五 算法分析

定义一个结构体,此包含了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;

}

}

}

八 运行输出结果

初始化进程如右图

计算机软件基础实践报告

显示现在的时间和所有就绪的进程 输入时间片的总数和每个时间片的时间

计算机软件基础实践报告

运行时显示的信息

计算机软件基础实践报告

计算机软件基础实践报告

计算机软件基础实践报告


第二篇:计算机软件基础二实践报告


计算机软件基础二实践报告

共计五个实践报告,请同学们认真抄好,在1225号之前由班长收集起交到我办公室(J021004),并附班级自考实践电子名单。

实践报告一:


实践报告二


实践报告三


实践报告四


实践报告五

更多相关推荐:
大学计算机基础实践报告

中南大学本科生课程设计(实践)任务书、设计报告(大学计算机基础)题目学生姓名指导教师学院专业班级学生学号美丽潮汕计算机基础教学实验中心20xx年x月x日美丽潮汕作为一个土生土长的潮汕人,我对潮汕有着深厚的感…

大学计算机基础实践报告

中南大学本科生课程设计实践任务书设计报告大学计算机基础题目学生姓名指导教师学院专业班级学生学号重庆印象计算机基础教学实验中心20xx年1月1日计算机实践报告主题描述我选的主题是重庆印象重庆这座城几千年来的历史给...

大学计算机基础实践报告书

中南大学本科生课程设计(实践)任务书、设计报告(大学计算机基础)题目曼城—英超不落的蓝月亮学生姓名指导教师学院专业班级学生学号计算机基础教学实验中心20xx年x月x日曼城——英超不落的蓝月亮计算机实践设计报告一…

大学计算机基础课程设计实践报告

中南大学本科生课程设计(实践)任务书、设计报告(大学计算机基础)题目学生姓名指导教师学院专业班级学生学号课程设计实践报告计算机基础教学实验中心20xx年x月x日⑴任务内容:本期我们进行了网页制作的实践,我选…

大学计算机基础实践 报告

中南大学本科生课程设计实践任务书设计报告大学计算机基础题目学生姓名指导教师学院专业班级学生学号我的家乡乌鲁木齐楚丁玮罗芳资源与安全工程学院安全工程1102班020xx10201计算机基础教学中心20xx年12月...

大学计算机基础上机实践报告册

1.1WindowsXP的基本操作【思考与实践】1.将一个文件删除,然后清空回收站,该文件还可以恢复到原来位置吗?答:一般情况下不能2.在桌面上新建一个名称为“计算器”的快捷方式。答:桌面空白处右击,新建→快捷…

《大学计算机基础》实习报告

实习报告实习名称大学计算机基础实习专业班级机制1144姓名张鑫杰学号1102411435指导教师姜亦文实习时间20xx3成绩目录一实习目的1二实习内容2一WORD操作2二EXCEL操作4三POWERPOINT操...

《大学计算机基础》实验报告格式(实验5-2)

《大学计算机基础》实验报告格式(实验5-2),内容附图。

计算机基础第2章实验(raptor实验)实验报告撰写要求

计算机基础实验报告实验名称基于流程图的可视化程序设计指导教师张冬慧实验日期专业电子信息科学与技术学生姓名王雨琪班级学号电技130220xx012649成绩实验一可视化程序设计环境入门一实验目的1掌握可视化环境R...

计算机基础实践设计报告

计算机基础实践设计报告学院信息科学与工程学院专业班级电气信息1126班学号0909112618姓名郑小乐实践日期20xx年12月倒立摆控制与研究调研报告一倒立摆的分类二倒立摆模型三倒立摆的控制策略分析四倒立摆的...

大学计算机基础实践性实验报告

一实验题目个人简历的制作二实验目的培养学生综合运用WORDEXCEL和POWERPOINT知识的能力三实验要求1以PPT为主线适当使用超链接2PPT文件中包含6张幻灯片其中第一张为标题幻灯片第二张为全部演示文稿...

中南财经政法大学《计算机应用基础》实验报告 综合实验一:掌握Windows 7系统及网络的常用操作

计算机应用基础实验报告

计算机基础实践报告(40篇)