1. 程式人生 > >進程調度之FCFS算法(先來先運行算法)

進程調度之FCFS算法(先來先運行算法)

進程調度 clas continue temp 邏輯 現狀 stdio.h 安全 div

#include<stdio.h>
#define PNUMBER 5//進程個數
#define SNUMBER 3//資源種類個數

//資源的種類,三種
char stype[SNUMBER]={A,B,C};

//各種資源的總數量,a種資源總10,b種資源總5,c種資源總7
int avalable[SNUMBER]={10,5,7};

//每個進程對應的完成進程需要的各種類型的資源需求量,靜態值
int pmax[PNUMBER][SNUMBER]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

//每個進程已經分配的資源情況,動態值
int allocation[PNUMBER][SNUMBER]={{0
,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //每一個進程還需要的資源 int pneed[PNUMBER][SNUMBER]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //臨時的數組 int request[SNUMBER]; //當前正在分配資源的進程 int pindex=0; //顯示每一個進程對資源擁有的現狀 void showdate(); //接受進程分配的請求 void accepetRequest(); //模擬分配 void SimMllocation(int pindex); //回滾 void rollback(int pindex);
//安全性檢查 int checkIsSafe(); int main() { //主邏輯 int exit=0; //顯示每一個進程現狀 showdate(); do { //接受進程分配的請求 accepetRequest(); //模擬分配資源 SimMllocation(pindex); //顯示現在資源現狀 showdate(); //檢查是否存在安全序列,數據要保證至少一個進程能完成分配 if(checkIsSafe()==0
) { //當前進程不存在安全序列,當前進程數據回滾 rollback(pindex); } printf("是否繼續0/1\n"); scanf("%d",&exit); }while(exit==1); return 0; } //顯示每一個進程對資源擁有的現狀 void showdate() { int index=0; int index_=0; printf("當前資源情況.....\n"); printf("資源類類型\t資源數量\n"); for(index=0;index<SNUMBER;index++) { printf("%c\t\t%d\n",stype[index],avalable[index]); } printf("\n\n每一個進程所需要資源的最大值.........\n\n"); printf("進程編號\t資源類型A\t資源類型B\t資源類型C\n"); for(index=0;index<PNUMBER;index++) { printf("%d\t\t",index); for(index_=0;index_<SNUMBER;index_++) { printf("%d\t\t",pmax[index][index_]); } printf("\n"); } printf("\n\n每一個進程所分配的情況......\n\n"); printf("進程編號\t資源類型A\t資源類型B\t資源類型C\n"); for(index=0;index<PNUMBER;index++) { printf("%d\t\t",index); for(index_=0;index_<SNUMBER;index_++) { printf("%d\t\t",allocation[index][index_]); } printf("\n"); } printf("\n\n每一個進程還需要的資源的情況......\n\n"); printf("進程編號\t資源類型A\t資源類型\t資源類型C\n"); for(index=0;index<PNUMBER;index++) { printf("%d\t\t",index); for(index_=0;index_<SNUMBER;index_++) { printf("%d\t\t",pneed[index][index_]); } printf("\n"); } printf("---------------------------------------------------------------------------------------------\n"); } void accepetRequest() { int index=0; printf("請輸入你要分配資源的進程編號(0~%d)\n",PNUMBER-1); //需要分配資源的進程 scanf("%d",&pindex); //輸入需要各種資源的具體數量 for(index=0;index<SNUMBER;) { printf("請輸入%c類資源的數量\n",stype[index]); scanf("%d",&request[index]); //小於進程對資源的最大要求 if(request[index]<=pmax[pindex][index]&&request[index]<=avalable[index]) { index++; } } } //模擬分配 void SimMllocation(int pindex) { int index=0; for(index=0;index<SNUMBER;index++) { //總資源減少 avalable[index]-=request[index]; //當前進程已經分配的資源 allocation[pindex][index]+=request[index]; //還需要的資源 pneed[pindex][index]-=request[index]; } } //回滾 void rollback(int pindex) { int index=0; for(index=0;index<SNUMBER;index++) { avalable[index]+=request[index]; allocation[pindex][index]-=request[index]; pneed[pindex][index]+=request[index]; }//回滾與模擬分配剛好相反 } int checkIsSafe() { int index=0; int index_=0; int count=0; int k=0; int temp[PNUMBER]; //余下的資源要保證每一個進程都能得到資源 int finish[PNUMBER]={0,0,0,0,0}; //資源 int work[SNUMBER]; for(index=0;index<SNUMBER;index++) { work[index]=avalable[index]; } //所有進程找到 for(index=0;index<PNUMBER;index++) { count=0; if(finish[index]==1) continue; //余下的資源是否能滿足某一進程的需要 for(index_=0;index_<SNUMBER;index_++) { if(pneed[index][index_]<=work[index_]) { count++; } if(count==SNUMBER) { //余下的資源如果滿足一個進程的需要,也就能回收 finish[index]=1; for(index_=0;index_<SNUMBER;index_++) { work[index_]+=allocation[index][index_]; } //記下此進程的編號 temp[k]=index; k++; //因為有資源回收,所以讓所有進程試試看能不能重新分配 index=-1; } } } //判斷所有進程理論上是否能分配到資源 for(index=0;index<PNUMBER;index++) { //只要有一個進程分配不到資源,則不存在安全序列 if(finish[index]==0) { printf("***不存在安全序列***"); return 0; } } printf("安全序列............\n"); for(index=0;index<PNUMBER;index++) { printf("%d--->",temp[index]); } printf("\n"); return 1; }

進程調度之FCFS算法(先來先運行算法)