实验二

一、 实验目的

通过模拟进程的调度,进一步了解进程的调度的具体过程。

二、 实验内容和要求

1.进程PCB的结构体定义

2.定义队列

3.输入进程序列

4.排序(按到位时间)

5.输出进程运行的结果

三、程序

#include<stdio.h>
#include<malloc.h>
#include<time.h>

/*定义一个Course类型的结构体*/
typedef struct queue{
int number;
int intime;
int runningtime;
int alltime;
int waitingtime;
struct node *next;
}Course;
/*定义一个PCB类型来表示队列*/
typedef struct node2{
Course *front;
Course *rear;
}PCB;
/*初始化队列*/
PCB initqueue(){
PCB q;
q.front=(Course *)malloc(sizeof(Course));
q.front->next=NULL;
q.rear=q.front;
return(q);
}
/*进入队列*/
PCB inserq(PCB q,int x,int j,int y,int k){
Course *p;
p=(Course *)malloc(sizeof(Course)); //申请结点p
p->number=x;//x.j.y.k储存到新结点p中
p->intime=j;
p->runningtime=y;
p->waitingtime=k;
p->alltime=y+k;
p->next=NULL;//p的指针域置空
q.rear->next=p;//指针域指向p,p成为新的队尾
q.rear=p; //对尾指针域指向p,保证rear指向新的队尾
return (q);
}
/* 打印进程调度的结果*/
void display(PCB q)
{
Course *p;
printf("\n队列:\n");
p=q.front->next;
while(p!=NULL)
{
printf("进入的顺序:%d ",p->intime);printf("\n");
printf("进程的编号:%d ",p->number);
printf("运行的时间:%d ",p->runningtime);
printf("等待的时间:%d ",p->waitingtime);
printf("所用的总时间:%d ",p->alltime);
printf("\n");
p=p->next;
}
}

main(){
int x,y,z,i=0,k,j=1/*用来记录进程进入的顺序*/;
PCB q;
q=initqueue();
for(i=0;i<5;i++ ){
printf("请输入进程的编号:");
scanf("%d",&x);
printf("请输入进程的运行的时间:");
scanf("%d",&y);
k=rand()%10;//随机产生0-9的数,代表进程要等待的时间。
q=inserq(q,x,j,y,k);
j++;
}
display(q);

}
 

initqueue()//初始化队列
1
inserq()//进入队列
1
display()//打印队列
3. 主要程序段及其解释:

/*主函数,实现对结构体类型变量的定义以及对队列的使用*/<br>main(){
int x,y,z,i=0,k,j=1/*用来记录进程进入的顺序*/;
PCB q;
q=initqueue();
for(i=0;i<5;i++ ){
printf("请输入进程的编号:");
scanf("%d",&x);
printf("请输入进程的运行的时间:");
scanf("%d",&y);
k=rand()%10;//随机产生0-9的数,代表进程要等待的时间。
q=inserq(q,x,j,y,k);
j++;
}
display(q);<br>}

/*定义一个Course类型的结构体*/
typedef struct queue{
int number;
int intime;
int runningtime;
int alltime;
int waitingtime;
struct node *next;
}Course;

/*初始化队列*/
PCB initqueue(){
PCB q;
q.front=(Course *)malloc(sizeof(Course));
q.front->next=NULL;
q.rear=q.front;
return(q);
}
/*进入队列*/
PCB inserq(PCB q,int x,int j,int y,int k){
Course *p;
p=(Course *)malloc(sizeof(Course)); //申请结点p
p->number=x;//x.j.y.k储存到新结点p中
p->intime=j;
p->runningtime=y;
p->waitingtime=k;
p->alltime=y+k;
p->next=NULL;//p的指针域置空
q.rear->next=p;//指针域指向p,p成为新的队尾
q.rear=p; //对尾指针域指向p,保证rear指向新的队尾
return (q);
}

/* 打印进程调度的结果*/
void display(PCB q)
{
Course *p;
printf("\n队列:\n");
p=q.front->next;
while(p!=NULL)
{
printf("进入的顺序:%d ",p->intime);printf("\n");
printf("进程的编号:%d ",p->number);
printf("运行的时间:%d ",p->runningtime);
printf("等待的时间:%d ",p->waitingtime);
printf("所用的总时间:%d ",p->alltime);
printf("\n");
p=p->next;
}
}

四、总结

使用C语言来对进程的调度,是一件比较有难度的事情,有很多不懂得地方。

最新文章

  1. vs使用
  2. Windows Azure Active Directory (4) China Azure AD Self Password Reset
  3. C++学习之:括号匹配与栈的使用
  4. &lt;转&gt; jsp页面向action传值的方法(最后一种简单)
  5. 浏览器内置Console函数使用详解
  6. 通过公网连接云数据库Memcache--ECS Windows篇
  7. 什么是JavaScript?
  8. 解决xShell4某些情况下按删除键会输出^H的问题
  9. 【转】GPS网平差
  10. (98)Wangdao.com_第三十天_拖拉事件
  11. ireport使用总结
  12. redis---安装和开启和关闭
  13. 茶杯头开枪ahk代码
  14. pycharm破解
  15. yolov3实践(一)
  16. lvm创建 及 扩空 等相关
  17. RavenDb使用
  18. 精神状态: Confused
  19. 《MYSQL必知必会》
  20. 批处理-通过mono把c#编译成dll

热门文章

  1. 编译错误:/usr/bin/ld: cannot find -lz
  2. 本机ip+端口不能访问web server,外部却可以访问
  3. ListView遍历每个Item出现NullPointerException的异常
  4. 诚信的cpm广告联盟该怎么选择
  5. Nodejs express 文件上传
  6. Oracle EBS 初始化用户密码(转)
  7. 如何设置ASP.NET页面的运行超时时间 (转载)
  8. ios safari 标签发送到桌面自定义图标方法
  9. drdb
  10. install phpexcel using composer in thinkPHP