实验二:先来先服务进程调度

#include <stdio.h>

#include <malloc.h>

typedef struct jinchen  //定义结构体

{

char name[5];

int tijiaoshijian;

int reachtime;

int runtime;

int beirun;

int accomplishtime;

char state;

int flag;

struct jinchen *next;

}PCB;

PCB *finish,*ready;//定义队列 一个完成一个就绪

int time=0;

int t=0;

int num;

void InitPcb()    //进程初始化

{

int i,j=0;

PCB *p,*q,*l,*m,*k,*n;

printf("请输入进程个数:");

scanf("%d",&num);

ready=(PCB *)malloc(sizeof(PCB));

ready->next=NULL;

finish=(PCB *)malloc(sizeof(PCB));

finish->next=NULL;

l=(PCB *)malloc(sizeof(PCB));

l->next=NULL;

p=l;

for(i=0;i<num;i++)

{

q=(PCB *)malloc(sizeof(PCB));

printf("\n进程号 %d:\n",i);

printf("请输入进程名:");

scanf("%s",q->name);

q->reachtime=0;

printf("请输入提交时间:");

scanf("%d",&(q->tijiaoshijian));

printf("请输入运行时间:");

scanf("%d",&(q->runtime));

q->beirun=q->runtime;

q->state=‘R‘;

q->flag=0;

if(i!=0)       //链接就绪进程

{

//q->next=NULL;

q->next=p->next;

p->next=q;

p=p->next;

}

else    //第一个进程插入就绪队列

{

p->next=q;

p=p->next;

p->next=NULL;

}

}

p=l->next;

k=ready;

for(i=0;i<num;i++)   //按照提交时间排序

{

q=l->next;

t=1000;

while(q!=NULL)

{

if(q->tijiaoshijian<t&&q->flag==0)

{

t=q->tijiaoshijian;

m=(PCB *)malloc(sizeof(PCB));

m->next=NULL;

m->accomplishtime=q->accomplishtime;

m->beirun=q->beirun;

m->flag=q->flag;

for(j=0;j<5;j++)

m->name[j]=q->name[j];

m->reachtime=q->reachtime;

m->runtime=q->runtime;

m->state=q->state;

m->tijiaoshijian=q->tijiaoshijian;

n=q;

}

q=q->next;

}

p=p->next;

n->flag=1;

m->flag=1;

k->next=m;

k=k->next;

}

k->next=NULL;

}

void display()   //函数作用:计算和显示相关输出

{

PCB *p;

int m,n=0,k=0,l;

p=finish->next;

while(p!=NULL)

{

printf("进程名 :%s",p->name);

m=p->accomplishtime-p->tijiaoshijian;

printf("周转时间:%d",m);

l=m/(p->beirun);

printf("带权周转时间:%d",l);

printf("\n");

n=m+n;

k=l+k;

p=p->next;

}

printf("平均周转时间:%d\n",n/num);

printf("平均带权周转时间:%d\n",k/num);

}

void Use()//进程调用

{

int j;

PCB *p=ready->next,*k=ready,*q,*n=finish;

while(k->next!=NULL)

{

p=ready->next;

for(j=0;j<num&&p!=NULL;j++)

{

time++;

//printf("%d\n\n",++t);

if(p->reachtime==0)

p->reachtime=time;

if(p->state!=‘C‘)

{

printf("正在运行:%s\n",p->name);

p->runtime--;

if(p->runtime!=0)    //进程没有运行完,放入队列最后

{

q=p;

while(q->next!=NULL)

q=q->next;

ready->next=p->next;

q->next=p;

p=ready->next;

q=q->next;

q->next=NULL;

}

else    //进程运行完,放入完成队列

{

p->state=‘C‘;

printf("%s进程完成\n",p->name);

p->accomplishtime=time;

n->next=p;

n=p;

ready->next=p->next;

p->next=NULL;

}

}

}

}

}

int main()

{

PCB *p;

InitPcb();

Use();

display();

p=finish->next;

printf("运行完毕!*说明:已运行完成的进程放入完成队列,未运行完成的进程放在队列最后");

}

时间: 2024-12-15 17:35:01

实验二:先来先服务进程调度的相关文章

实验二、进程调度模拟程序1.0

一.    实验目的 用C语言模拟进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.    实验内容及要求 设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法: (1)  先来先服务调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. (2)  优先级调度算法,为每个作业设置一个优先级,调度之前先比较各作业的优先级,优先数高者优先调度,若优先级相同则用先来先服务算法. 1)每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.

实验二进程调度模拟程序

实验二进程调度模拟程序 一.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.           实验内容和要求 设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. (2). 

实验三 、进程调度模拟程序

实验三.进程调度模拟程序 专业 网络工程   姓名 方俊晖 学号 201406114309 一.        实验目的 通过本实验可以加深对有关进程控制块.进程队列的概念的进一步理解. 二.        实验内容和要求 1.进程PCB的结构体定义 2.定义结构体 3.输入进程序列 4.排序(按到位时间) 5.输出进程运行的结果 三.        实验方法.步骤及结果测试 #include<stdio.h> #include<stdlib.h> #include<stri

实验二、作业调度模拟程序实验 (已修改格式)

实验二.作业调度模拟程序实验 专业:计算机科学与技术网络工程   姓名:陈玉婷  学号201306114132 一.实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序. 作业调度算法:1)采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业.2)短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业.3)响应比高者优先(HRRN)调度算法,为每个作业

操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短进程优先的进程调度算法. 5.       掌握时间片轮转的进程调度算法. 二.     实验设备 1.     安装windows或者linux操作系统的PC机 2.     C程序编译环境 三.     实验内容 用c语言编程模拟实现至少一个操作系统的常见进程调度算法.常见的进程调度算法有先来先

实验二 作业调度模拟程序

实验二 作业调度模拟程序 一.        实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.        实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)      采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间

实验二 实验报告

实验二 作业调度模拟程序 13物联网  陈梓帆  201306104108 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统

1111实验二 作业调度模拟实验

实验二.作业调度模拟实验 物联网工程 张怡 201306104149 一.实验目的  (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.实验内容和要求 1.至少用三种调度算法: 1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业. 3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高

实验二作业调度

实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1)       采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2)      

操作系统 实验二 作业调度模拟程序

实验二.作业调度模拟程序 专业:商软一班   姓名:赖新耀 学号:201406114129 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)        采用先来先服务(FCFS)调度算法,即按作业到