一. 實驗目的
理解進程運行的並發性
理解進程各種狀態及其之間的轉換
理解進程管理中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();
}