資源簡介
基于Linux的實現進程的信號量互斥申請
包括說明書 源代碼 任務書
這事一個課程設計的最終答辯

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include??
#include?
#define?NUM?5?//資源數
pthread_t?thread[5];
pthread_mutex_t?mut;?//互斥信號量
struct?zy?{
char?type;?//資源的名稱
int?n;?//資源的數量
};
struct?jc?{
char?name;?//名稱
int?runtime;?//執行時間
int?waittime;?//等待時間
int?typenum;?//進程所申請的資源數
struct?zy?r[5];?//所申請資源的信息
};
struct?y?{
int?flag;?//標志,0:未出現過的資源,(進程a申請資源B?1個資源B?1個)1:該資源已申請
int?index;?//資源下標
int?tr;?//進程的下標
int?flag1;?//1:該資源不能再申請;0:該資源還可以申請
}?Y[10][NUM];
struct?jc?JC[5];
struct?zy?ZY[NUM];?//每種資源的名稱及數量
int?u?=?0;?//進程數
int?a?=?0;?//資源數
int?Available[NUM];?//可使用資源向量
int?Max[10][NUM];?//最大需求矩陣
int?Allocation[10][NUM];?//分配矩陣
int?Need[10][NUM];?//需求矩陣
int?Work[NUM];?//工作向量
int?Finish[NUM];?//狀態標志
int?Request[10][NUM];?//進程申請資源向量
//對銀行家算法中的需求矩陣進行初始化
int?init()?{
int?i?j?x;
for?(i?=?0;?i? for?(j?=?0;?j? Need[i][j]?=?Max[i][j]?-?Allocation[i][j];
}
}
return?0;
}
//輸入資源信息
int?ziyuan()
{
int?ix;
printf(“************************************************\n“);
printf(“請輸入資源的種類數:\n“);
fflush(stdin);
x=scanf(“%d“&a);
while(x==0)
{
printf(“不符合規則,請重新輸入!\n“);
fflush(stdin);
x=scanf(“%d“&a);
}
for(i=0;i {
printf(“請輸入第%d種資源的名稱(A---Z):\n“i);
scanf(“%c“&ZY[i].type);
while(ZY[i].type==‘\n‘)scanf(“%c“&ZY[i].type);
while(!isupper(ZY[i].type))
{
printf(“不符合規則,請重新輸入!\n“);
scanf(“%c“&ZY[i].type);
while(ZY[i].type==‘\n‘)scanf(“%c“&ZY[i].type);
}
printf(“請輸入資源%c的數量:“ZY[i].type);
fflush(stdin);
x=scanf(“%d“&ZY[i].n);
while(x==0)
{
printf(“不符合規則,請重新輸入!\n“);
fflush(stdin);
x=scanf(“%d“&ZY[i].n);
}
Available[i]=ZY[i].n;//對可使用資源向量進行初始化
}
return?0;
}
//對整個二維數組Y進行遍歷
int?judge_pro(int?m?int?p[10])?{
int?i?j;
for?(i?=?0;?i? for?(j?=?0;?j? if?(!(Y[i][j].flag1))?{
return?1;
}?//只要有1個進程的1種資源未申請完,則返回1
}
}
return?0;?//僅當所有進程對資源的申請都達到所需量時才返回0
}
//對二維數組中的某一行(對應某種進程)進行遍歷
int?panduan1(int?tr?int?p[10])?{
int?i;
for?(i?=?0;?i? if?(!(Y[tr][i].flag1))
return?0;?//該進程只要有1個資源未申請完,則返回0
}
return?1;?//僅當該進程所有資源都申請完時返回1
}
//產生隨機進程和進程所申請的資源,并調用銀行家算法
int?ra()?{
int?col[10];
int?i?j?k?=?0?w?=?0?m?=?0?n?=?0?q?=?0;?//k記錄最大需求矩陣中數目不為0的元素個數
printf(“\n“);
if?(u?==?0?||?a?==?0)?{
printf(“請先輸入信息!\n“);
return?0;
}
//對Max數組進行遍歷,篩選并記錄各進程對所有資源的最大申請量大于0的元素信息
for?(i?=?0;?i? for?(j?=?0;?j? if?(Max[i][j])?{
Y[m][n].index?=?j;?//index記錄資源下標
Y[m][n].tr?=?i;?//tr記錄進程下標
Y[m][n].flag?=?0;?//flag=1:所記錄的資源已申請過,flag=0:所記錄的資源尚未申請
Y[m][n].flag1?=?0;?//flag1=1:進程對該資源的申請已達到所需量,flag=0:還未達到所需量
n++;
}
}
col[m]?=?n;?//數組col記錄二維數組Y的每一行的列數
n?=?0;?//對n進行恢復,以便下次循環
m++;
}
//只要有資源未申請完就執行循環
while?(judge_pro(m?col))?{
int?_one?=?0;
int?tr;
//若該進程所有資源都申請完,則執行循環
do?{
tr?=?rand()?%?m;
}?while?(panduan1(tr?col));?//
printf(“%c進程申請\n“?JC[Y[tr][0].tr].name);
int?x?=?col[tr];
//若有資源申請完,則使x減
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2013-12-05?13:24??基于Linux的實現進程的信號量互斥申請\
?????目錄???????????0??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1622漢超\
?????文件???????31232??2013-12-05?13:37??基于Linux的實現進程的信號量互斥申請\1622漢超\基于Linux的實現進程的信號量互斥申請任務書.doc
?????文件??????130468??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1622漢超\漢超操作系統課程設計說明書.doc
?????目錄???????????0??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1632韓煒\
?????文件???????31232??2013-12-05?13:36??基于Linux的實現進程的信號量互斥申請\1632韓煒\基于Linux的實現進程的信號量互斥申請任務書.doc
?????文件??????147564??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1632韓煒\韓煒操作系統課程設計說明書?.doc
?????目錄???????????0??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1641張睿光\
?????文件???????31232??2013-12-05?13:36??基于Linux的實現進程的信號量互斥申請\1641張睿光\基于Linux的實現進程的信號量互斥申請任務書.doc
?????文件??????192702??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1641張睿光\張睿光操作系統課程設計說明書.doc
?????目錄???????????0??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1648白躍升\
?????文件???????31232??2013-12-05?13:35??基于Linux的實現進程的信號量互斥申請\1648白躍升\基于Linux的實現進程的信號量互斥申請任務書.doc
?????文件??????165611??2013-12-07?17:13??基于Linux的實現進程的信號量互斥申請\1648白躍升\白躍升說明書.doc
?????文件???????23969??2013-11-29?22:52??基于Linux的實現進程的信號量互斥申請\基于Linux的實現進程的信號量互斥申請.c
評論
共有 條評論