處理機-優(yōu)先數(shù)
#include <stdlib.h>
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type))
//定義一個方法,malloc(sizeof(type)分配一個塊大小為sizeof(type)的內(nèi)存,并返回首地址賦值
//(type*)把這個地址強制轉(zhuǎn)化為type*的指針
#define NULL 0 //定義一個字符NULL的值為0
/* 定義進程控制塊PCB */
struct pcb {
char name[3]; //進程名
char state; //狀態(tài) /*進程的狀態(tài):'R':運行,'W':等待,'F':結(jié)束*/
int super; //優(yōu)先數(shù)
int ntime; //要求運行時間
struct pcb *link; //定義一個link指針,其類型是pcb,表示下一個進程的指針
}*ready=NULL,*p; //ready和p是pcb的指針
// ready 和p 指針主要還是對進程pcb里的 就緒隊列的隊首指針,
typedef struct pcb PCB; //使pcb數(shù)據(jù)類型像int,char等數(shù)據(jù)類型,可以直接使用,同時也起了一個別名
void sort() /* 建立對進程進行優(yōu)先級排列函數(shù)*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*優(yōu)先級最大者,插入隊首*/
{
p->link=ready;
ready=p;
}
else /* 進程比較優(yōu)先級,插入適當(dāng)?shù)奈恢弥?/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->super)>(second->super)) /*若插入進程比當(dāng)前進程優(yōu)先數(shù)大,*/
{ /*插入到當(dāng)前進程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else /* 插入進程優(yōu)先數(shù)最低,則插入到隊尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}
void input() /* 建立進程控制塊函數(shù)*/
{
int i,num;
system("cls"); /*清屏*/
printf("\n 請輸入進程數(shù): ");
scanf("%d",&num);
for(i=1;i<=num;i++)
{
printf("\n 進程號No.%d:\n",i);
p=getpch(PCB);
printf("\n 輸入進程名:");
scanf("%s",p->name);
printf("\n 輸入進程優(yōu)先數(shù):");
scanf("%d",&p->super);
printf("\n 輸入進程運行時間:");
scanf("%d",&p->ntime);
printf("\n");
p->state='W'; //指針變量p所指的對象的成員state賦值為'w',表示進程等待
p->link=NULL; //指針變量p所指的對象的成員link賦值為
sort(); /* 調(diào)用sort函數(shù)*/
}
}
int space()
{
int l=0;
PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
void disp(PCB * pr) /*建立進程顯示函數(shù),用于顯示當(dāng)前進程*/
{
printf("\n 進程名\t 狀態(tài)\t 優(yōu)先數(shù)\t 需要運行時間\n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t\t",pr->ntime);
printf("\n");
}
void check() /* 建立進程查看函數(shù) */
{
PCB* pr;
printf("\n **** 當(dāng)前正在運行的進程是:\n"); /*顯示當(dāng)前運行進程*/
disp(p);
pr=ready;
printf("\n **** 當(dāng)前就緒隊列狀態(tài)為:\n"); /*顯示就緒隊列狀態(tài)*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
void destroy() /*建立進程撤消函數(shù)(進程運行結(jié)束,撤消進程)*/
{
printf("\n 進程 [%s] 已完成.\n",p->name);
free(p);
}
void running() /* 建立進程就緒函數(shù)(進程運行時間到,置就緒狀態(tài)*/
{
(p->ntime)--;
if(p->ntime==0)
destroy(); /* 調(diào)用destroy函數(shù)*/
else
{
(p->super)--; //優(yōu)先數(shù)自減一
p->state='W'; //狀態(tài)變成等待
sort(); /*調(diào)用sort函數(shù)*/
}
}
void main() /*主函數(shù)*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar(); //從控制臺讀取數(shù)據(jù)
h++; //h自加一
printf("-----------------------------------------------------");
printf("\n 現(xiàn)在是第%d次運行: \n",h);
p=ready; //
ready=p->link; //
p->link=NULL; //把
p->state='R'; //把進程改變?yōu)檫\行狀態(tài)
check();
running();
printf("\n 按任意鍵繼續(xù)......\n");
}
printf("\n\n 進程已經(jīng)完成.\n");
}
參考代碼
#include <stdlib.h>
#include <stdio.h>
#define getpch(type) (type*)malloc(sizeof(type))
//定義一個方法,malloc(sizeof(type)分配一個塊大小為sizeof(type)的內(nèi)存,并返回首地址賦值
//(type*)把這個地址強制轉(zhuǎn)化為type*的指針
#define NULL 0 //定義一個字符NULL的值為0
/* 定義進程控制塊PCB */
struct pcb {
char name[3]; //進程名
char state; //狀態(tài) /*進程的狀態(tài):'R':運行,'W':等待,'F':結(jié)束*/
int super; //優(yōu)先數(shù)
int ntime; //要求運行時間
int rtime; //已經(jīng)運行時間
struct pcb *link; //定義一個link指針,其類型是pcb,表示下一個進程的指針
}*ready=NULL,*p; //ready和p是pcb的指針
// ready 和p 指針主要還是對進程pcb里的 就緒隊列的隊首指針,
typedef struct pcb PCB; //使pcb數(shù)據(jù)類型像int,char等數(shù)據(jù)類型,可以直接使用,同時也起了一個別名
void sort() /* 建立對進程進行優(yōu)先級排列函數(shù)*/
{
PCB *first, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*優(yōu)先級最大者,插入隊首*/
{
p->link=ready;
ready=p;
}
else /* 進程比較優(yōu)先級,插入適當(dāng)?shù)奈恢弥?/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->super)>(second->super)) /*若插入進程比當(dāng)前進程優(yōu)先數(shù)大,*/
{ /*插入到當(dāng)前進程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else /* 插入進程優(yōu)先數(shù)最低,則插入到隊尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}
void input() /* 建立進程控制塊函數(shù)*/
{
int i,num;
system("cls"); /*清屏*/
printf("\n 請輸入進程數(shù): ");
scanf("%d",&num);
for(i=1;i<=num;i++)
{
printf("\n 進程號No.%d:\n",i);
p=getpch(PCB);
printf("\n 輸入進程名:");
scanf("%s",p->name);
printf("\n 輸入進程優(yōu)先數(shù):");
scanf("%d",&p->super);
printf("\n 輸入進程運行時間:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0; //指針變量p所指的對象的成員rtime賦值為0,表示已經(jīng)運行時間為0
p->state='W'; //指針變量p所指的對象的成員state賦值為'w',表示進程等待
p->link=NULL; //指針變量p所指的對象的成員link賦值為
sort(); /* 調(diào)用sort函數(shù)*/
}
}
int space()
{
int l=0;
PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
void disp(PCB * pr) /*建立進程顯示函數(shù),用于顯示當(dāng)前進程*/
{
printf("\n 進程名\t 狀態(tài)\t 優(yōu)先數(shù)\t 需要運行時間\t 已經(jīng)運行時間\n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
void check() /* 建立進程查看函數(shù) */
{
PCB* pr;
printf("\n **** 當(dāng)前正在運行的進程是:\n"); /*顯示當(dāng)前運行進程*/
disp(p);
pr=ready;
printf("\n **** 當(dāng)前就緒隊列狀態(tài)為:\n"); /*顯示就緒隊列狀態(tài)*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
void destroy() /*建立進程撤消函數(shù)(進程運行結(jié)束,撤消進程)*/
{
printf("\n 進程 [%s] 已完成.\n",p->name);
free(p);
}
void running() /* 建立進程就緒函數(shù)(進程運行時間到,置就緒狀態(tài)*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 調(diào)用destroy函數(shù)*/
else
{
(p->super)--; //優(yōu)先數(shù)自減一
p->state='W'; //狀態(tài)變成等待
sort(); /*調(diào)用sort函數(shù)*/
}
}
void main() /*主函數(shù)*/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar(); //從控制臺讀取數(shù)據(jù)
h++; //h自加一
printf("-----------------------------------------------------");
printf("\n 現(xiàn)在是第%d次運行: \n",h);
p=ready; //
ready=p->link; //
p->link=NULL; //把
p->state='R'; //把進程改變?yōu)檫\行狀態(tài)
check();
running();
printf("\n 按任意鍵繼續(xù)......\n");
}
printf("\n\n 進程已經(jīng)完成.\n");
}
#include <stdio.h>
#include <stdlib.h>
void banker();
int main(int argc, char *argv[])
{
banker();
system("PAUSE");
return 0;
}/*銀行家算法 用于死鎖的避免 */
#define N 5 //進程數(shù)目
#define M 3 //資源數(shù)目
int max[N][M];//max[i][j] 表示進程 i 對進程 j 的資源需求量
int allocation[N][M]; // allocation[i][j] 表示進程 i 已經(jīng)獲得的 j 資源的量
int need[N][M]; //need[i][j] 表示進程 i 尚需要 資源 j 的量
int avaiable[M];//avaiable[j] 表示進程 j 還有的資源量
int process[N] ;//進程的記錄
int status = 0 ;//能否分配 0 不能 1 能
int work[M]; // 系統(tǒng)中當(dāng)前所有的資源數(shù)目
int finish[N];//進程的完成情況
int count = 0 ;//安全序列的個數(shù)
void initialize()
{
int j =0 ;//資源
int i= 0 ;//進程
for(j=0;j<M;j++){
printf("%d資源的avaiable數(shù)目:\t",j);
scanf("%d",&avaiable[j]);
} //輸入avaiable 數(shù)目
for(i=0;i<N;i++){
for(j=0;j<M;j++){
printf("進程 %d 所需 %d 資源的最大數(shù)目:\t",i,j);
scanf("%d",&max[i][j]);
}
}//輸入 max 數(shù)目
for(i=0;i<N;i++){
for(j=0;j<M;j++){
printf("進程%d占有%d資源的數(shù)目:\t",i,j);
scanf("%d",&allocation[i][j]);
}
}// 輸入 allocation 數(shù)目
for(i=0;i<N;i++){
for(j=0;j<M;j++){
need[i][j] = max[i][j]-allocation[i][j];
}
}//計算 need 數(shù)目
for(j=0;j<M;j++){
finish[j] = 0 ;
}//賦值 finish 為零 表示 均未完成
for(j=0;j<M;j++){
work[j] = avaiable[j]; //賦值 初始 為系統(tǒng)可用的資源數(shù)
}
for(i=0;i<N;i++){
process[i] = i ;
}//對進程的編號進行 賦值
} //對 上述各個變量賦值
void trace(int i){
if(i>=N){
count++ ;
status = 1 ;//可以分配
int p = 0 ;
printf("按如下次序分配安全\n");
for(p=0;p<N;p++){
printf("%d\t",process[p]);
}
printf("\n");
return ;
}//邊界的處理
int k= i ;//進程的記錄 k 表示 第 k 個進程
for(k=i;k<N;k++){
int j=0 ;//資源 j 表示第 j 個資源
int smaller = 1 ;// 1 need<=work 0 need>work
for(j=0;j<M;j++){
if(need[process[k]][j]>work[j]){
smaller = 0 ;//不夠分
break ;
}
}
//篩選條件
if(smaller){
int temp = process[i];
process[i] = process[k];
process[k] = temp ;
int tempProcess = process[i];//當(dāng)前執(zhí)行進程
printf("進程 %d 執(zhí)行 : ",tempProcess);
for(j=0;j<M;j++){
printf("%d ",work[j]);
}
printf("\t");
for(j=0;j<M;j++){
printf("%d ",need[tempProcess][j]);
}
printf("\t");
for(j=0;j<M;j++){
printf("%d ",allocation[tempProcess][j]);
}
printf("\t");
for(j=0;j<M;j++){
work[j] += allocation[tempProcess][j]; //釋放其所占有的資源
printf("%d ",work[j]);
}
printf("\n");
finish[tempProcess] = 1 ;//正常結(jié)束
trace(i+1);
temp = process[i];
process[i] = process[k];
process[k] = temp ;
for(j=0;j<M;j++){
work[j] -= allocation[tempProcess][j];
}
finish[tempProcess] = 0 ;
//恢復(fù)數(shù)據(jù)
}//夠分
}
} //安全性檢測
void request(){
int i =0 ;//申請進程 i
printf("請輸入申請進程的編號:\t");
scanf("%d",&i);
int j = 0 ;
int request[M];// request[j] 進程 i 對 資源 j 的 請求量
for(j=0;j<M;j++){
printf("進程 %d 申請%d 資源數(shù)目:\t",i,j);
scanf("%d",&request[j]);
}
for(j=0;j<M;j++){
if(request[j]>need[i][j])
{
printf("超過事先聲明的最大需求量 ,該申請不能被分配 \n");
return ;
}
}
for(j=0;j<M;j++){
if(request[j]>avaiable[j])
{
printf("無足夠資源分配 ,該申請不能被分配 \n");
return ;
}
}
for(j=0;j<M;j++){
allocation[i][j]+=request[j];
avaiable[j] -= request[j];
need[i][j] -= request[j];
}
//需要改變work向量的值。
trace(0);
if(!status){
printf("無法進入安全序列,系統(tǒng)處于不安全狀態(tài)\n");
}
}
void banker(){
initialize();
int choice = 0 ;
int j ;
while(1){
printf("請選擇要進行的操作 : 1 判斷當(dāng)前的狀態(tài) 2 請求 3 exit \n");
scanf("%d",&choice);
if(choice==1){
trace(0);
if(!status){
printf("無法進入安全序列,系統(tǒng)處于不安全狀態(tài)\n");
}
for(j=0;j<M;j++){
finish[j] = 0 ;
}//賦值 finish 為零 表示 均未完成
for(j=0;j<M;j++){
work[j] = avaiable[j]; //賦值 初始 為系統(tǒng)可用的資源數(shù)
}}
if(choice==2){
request();
for(j=0;j<M;j++){
finish[j] = 0 ;
}//賦值 finish 為零 表示 均未完成
for(j=0;j<M;j++){
work[j] = avaiable[j]; //賦值 初始 為系統(tǒng)可用的資源數(shù)
}
}
if(choice==3){
return ;
}
}
}//銀行家算法