操作系统实验二(进程调度之先来先服务)
一. 实验目的
理解进程运行的并发性
理解进程各种状态及其之间的转换
理解进程管理中PCB的结构
掌握FCFS进程调度算法
二. 实验内容
要求
根据相关数据结构和算法流程,按FCFS非抢占式调度算法实现进程调度
原理
多道环境中进程数一般多于处理机数目,系统需按照某种算法动态地把处理机分配给就绪队列中的一个进程使之运行,
系统将所有进程按状态组织成不同队列:就绪、执行和阻塞。
本程序在实现时要求采用非剥夺式先来先服务进行调度:即按照进程进入就绪队列的先后次序来分配处理器,
先进入就绪队列的进程优先被选择,一旦占有处理器就一直运行下去直到结束。
实现中应分别设计三个链表 队列表示运行、就绪和阻塞进程队列。
相关数据结构
进程的标识为PCB,PCB结构可自行设计也可采用如下结构:
typedef struct node
{
char name[10]; //进程标识符
int comet; //进程到来时间
char state; //进程状态
struct node *next;
}PCB;
算法流程
//pri基础上:PCB的定义简单化只需要到来时间项;就绪队列按照到来时间从小到大排序;fcfs调度时采用非抢占式,即每个进程只运行一次就可运行完成。
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct node
{
char name[10]; //进程标识符
int comet; //进程到来时间
char state; //进程状态
struct node *next;
}PCB;
PCB *ready, *finish, * run;
void insert(PCB *p);
void firstin();
void print();
/*优先数创建初始进程PCB信息*/
void creatp()
{
char na[10];
int time;
PCB *p;
int n;
printf("请输入要创建的进程数");
scanf("%d",&n);
printf("输入进程号和到达的时间:\n");
for(int i=0;i<n;i++)
{
p=(PCB *)malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->next=NULL;
p->comet=time;
p->state='w';
insert(p); //将新产生的进程插入到就绪队列的合适位置
}
printf(" 优先数算法输出信息:\n");
printf("**********************************\n");
print();
if(run==NULL) firstin();
return;
}
/*进程就绪链表的插入算法,就绪链表按到来时间从小到大排列*/
void insert(PCB *p)
{
PCB *p1,*q;
p1=ready;
q=p1;
if(p1==NULL) //当插入的是第一个结点
{
p1=p;
ready=p1;
return;
}
else
{
while(p1!=NULL&&p1->comet<p->comet)
{
q=p1;
p1=p1->next;
}
if(q!=p1) //在链表中间或链尾插入结点
{
p->next=p1;
q->next=p;
}
else //在链表的表头插入结点
{
p->next=p1;
ready=p;
}
return;
}
}
/*将就绪队列的第一个进程投入运行*/
void firstin()
{
run=ready;
run->state='R';
ready=ready->next;
return;
}
/*先来先服务调度算法*/
void fcfsschedule()
{
while(run!=NULL)
{
print();
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!=NULL) firstin();
}
}
/*进程PCB的输出*/
void print1()
{
printf("进程号 到达时间 状态\n");
}
void print2(PCB *p)
{
printf("%5s,%5d,%5c\n",p->name,p->comet,p->state);
}
void print()
{
PCB *q1;
q1=(PCB *)malloc(sizeof(PCB));
print1();
if(run!=NULL) print2(run);
q1=ready;
while(q1!=NULL)
{
print2(q1);
q1=q1->next;
}
q1=finish;
while(q1!=NULL)
{
print2(q1);
q1=q1->next;
}
//getchar();
}
/*主函数*/
void main()
{
ready=(PCB *)malloc(sizeof(PCB));
run=(PCB *)malloc(sizeof(PCB));
finish=(PCB *)malloc(sizeof(PCB));
ready=NULL;
run=NULL;
finish=NULL;
creatp();
fcfsschedule();
}
一纸高中万里风,寒窗读破华堂空。
莫道长安花看尽,由来枝叶几相同?