线程同步、死锁以及银行家算法模拟小例子

//首先是摘自孙鑫老师vc++里的一些典型例子,然后是模拟了一下银行家算法

1.使用互斥对象进行线程同步

#include <Windows.h>
#include <iostream>
using namespace std;
//使用互斥对象进行线程同步
DWORD WINAPI Thread1(LPVOID lpParameter);
DWORD WINAPI Thread2(LPVOID lpParameter);
int index=0;
int tickets=100;
HANDLE hMutex;
void main(int argc,char *argv[])
{
	HANDLE hThread1,hThread2;
	//创建互斥对象
	hMutex=CreateMutex(NULL,TRUE,NULL);//FALSE表示没有线程拥有这个互斥对象,操作系统将互斥对象设为有信号状态
	//创建线程
	hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
	hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	ReleaseMutex(hMutex);
	Sleep(4000);
}
DWORD WINAPI Thread1(LPVOID lpParameter)
{
	while (1)
	{
		WaitForSingleObject(hMutex,INFINITE);//等待的互斥对象hMutex变为有信号状态才往下执行
		if (tickets>0)
		{
			Sleep(1);//人为切换线程
			cout<<"Thread1 selling ticket: "<<tickets--<<endl;
		}
		else
			break;
		ReleaseMutex(hMutex);
	}
	return 0;
}

DWORD WINAPI Thread2(LPVOID lpParameter)
{
	while (1)
	{
		WaitForSingleObject(hMutex,INFINITE);//等待的互斥对象hMutex变为有信号状态才往下执行
		if (tickets>0)
		{
			Sleep(1);
			cout<<"Thread2 selling ticket: "<<tickets--<<endl;
		}
		else
			break;
		ReleaseMutex(hMutex);
	}
	return 0;
}


2.使用事件对象进行线程同步

DWORD WINAPI Thread1(LPVOID lpParameter);
DWORD WINAPI Thread2(LPVOID lpParameter);
int index=0;
int tickets=100;
HANDLE g_hEvent;
int main(int argc,char *argv[])
{
	HANDLE hThread1,hThread2;
	//创建自动重置事件内核对象
	g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
	SetEvent(g_hEvent);//把事件对象设为有信号状态 
	//创建线程
	hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
	hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	Sleep(4000);
	CloseHandle(g_hEvent);
}


DWORD WINAPI Thread1(LPVOID lpParameter)
{
	while (1)
	{
		//请求事件对象
		WaitForSingleObject(g_hEvent,INFINITE);
		//请求到事件后,操作系统会自动把事件对象设置为无信号状态
		if (tickets>0)
		{
			Sleep(1);//人为切换线程
			cout<<"Thread1 selling ticket: "<<tickets--<<endl;
			SetEvent(g_hEvent);//调用SetEvent把事件对象设置为有信号状态
		}
		else
		{
			SetEvent(g_hEvent);//调用SetEvent把事件对象设置为有信号状态
			break;
		}
	}
	return 0;
}

DWORD WINAPI Thread2(LPVOID lpParameter)
{
	while (1)
	{
		//请求事件对象
		WaitForSingleObject(g_hEvent,INFINITE);
		if (tickets>0)
		{
			Sleep(1);
			cout<<"Thread2 selling ticket: "<<tickets--<<endl;
			SetEvent(g_hEvent);
		}
		else
		{
			SetEvent(g_hEvent);
			break;
		}
	}
	return 0;
}

3.使用关键代码段实现线程同步

DWORD WINAPI Thread1(LPVOID lpParameter);
DWORD WINAPI Thread2(LPVOID lpParameter);
int index=0;
int tickets=100;
CRITICAL_SECTION g_cs;
int main(int argc,char *argv[])
{
	HANDLE hThread1,hThread2;
	//创建线程
	hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
	hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	InitializeCriticalSection(&g_cs);//初始化关键代码段(建立电话亭)
	Sleep(4000);
	DeleteCriticalSection(&g_cs);//释放临界区对象所有资源(拆除电话亭)
}


DWORD WINAPI Thread1(LPVOID lpParameter)
{
	while (1)
	{
		EnterCriticalSection(&g_cs);//请求临界区对象所有权(进入电话亭)
		if (tickets>0)
		{
			Sleep(1);//人为切换线程
			cout<<"Thread1 selling ticket: "<<tickets--<<endl;
			LeaveCriticalSection(&g_cs);//释放临界区对象所有权(离开电话亭)
		}
		else
		{
			LeaveCriticalSection(&g_cs);//释放临界区对象所有权(离开电话亭)
			break;
		}
	}
	return 0;
}

DWORD WINAPI Thread2(LPVOID lpParameter)
{
	while (1)
	{
		EnterCriticalSection(&g_cs);//请求临界区对象所有权(进入电话亭)
		if (tickets>0)
		{
			Sleep(1);//人为切换线程
			cout<<"Thread2 selling ticket: "<<tickets--<<endl;
			LeaveCriticalSection(&g_cs);//释放临界区对象所有权(离开电话亭)
		}
		else
		{
			LeaveCriticalSection(&g_cs);//释放临界区对象所有权(离开电话亭)
			break;
		}
	}
	return 0;
}

//线程死锁问题:

//线程1拥有临界区对象A,等待临界区对象B的所有权;
//线程2拥有临界区对象B,等待临界区对象A的所有权;

DWORD WINAPI Thread1(LPVOID lpParameter);
DWORD WINAPI Thread2(LPVOID lpParameter);
int index=0;
int tickets=100;
CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;
int main(int argc,char *argv[])
{
	HANDLE hThread1,hThread2;
	//创建线程
	hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
	hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	InitializeCriticalSection(&g_csA);
	InitializeCriticalSection(&g_csB);
	Sleep(4000);
	DeleteCriticalSection(&g_csA);
	DeleteCriticalSection(&g_csB);
}


DWORD WINAPI Thread1(LPVOID lpParameter)
{
	while (1)
	{
		EnterCriticalSection(&g_csA);//请求临界区对象A的所有权
		Sleep(1);
		EnterCriticalSection(&g_csB);//请求临界区对象A的所有权
		if (tickets>0)
		{
			Sleep(1);
			cout<<"Thread1 selling ticket: "<<tickets--<<endl;
			LeaveCriticalSection(&g_csB);//先释放临界区对象B所有权再释放临界区对象A的所有权(与请求顺序相反)
			LeaveCriticalSection(&g_csA);
		}
		else
		{
			LeaveCriticalSection(&g_csB);
			LeaveCriticalSection(&g_csA);
			break;
		}
	}
	return 0;
}

DWORD WINAPI Thread2(LPVOID lpParameter)
{
	while (1)
	{
		EnterCriticalSection(&g_csB);//请求临界区对象A的所有权
		Sleep(1);
		EnterCriticalSection(&g_csA);//请求临界区对象A的所有权
		if (tickets>0)
		{
			Sleep(1);
			cout<<"Thread2 selling ticket: "<<tickets--<<endl;
			LeaveCriticalSection(&g_csA);//与请求顺序相反
			LeaveCriticalSection(&g_csB);
		}
		else
		{
			LeaveCriticalSection(&g_csA);
			LeaveCriticalSection(&g_csB);
			break;
		}
	}
	return 0;
}

/*
Analysis:
线程1得到临界区对象g_csA所有权后,调用sleep函数,线程1睡眠1ms,放弃执行机会;
操作系统选择线程2执行,线程2首先等待临界区对象g_csB的所有权,当它得到所有权
后,调用sleep,线程2也睡眠1ms;于是轮到线程1执行,它此时等待临界区对象g_csB
的所有权,但是g_csB已经被线程2所拥有,因此线程1继续等待;线程1等待时,线程2
开始执行,这时它需要临界区资源g_csA,然而g_csA被A所拥有,此时线程2进入等待;
这就导致了线程1和线程2发生死锁;
线程同步三种方式对比:
(1)互斥对象和事件对象属于内核对象,利用内核对象进行线程同步时,速度较慢,但是
利用内核对象可以在多个进程的各个线程中进行同步
(2)关键代码段工作在用户方式,同步速度快,但在使用时,很容易进入死锁状态,因为
在等待进入关键代码段时无法设定超时值。
*/

//银行家算法-解决死锁

/*
Copyright Keiko,2014. All rights reserved.
银行家算法:
银行在发放贷款之前都会预测贷款是否会导致资金周转问题出现。
1.可用资源向量Available
具有m个元素的数组,每个元素代表一类可利用的资源的数目,初始
值为系统中该资源的最大可用数目,其值随着该类资源的分配回收而
动态地改变。Avaliable[j]=k,可用的Rj类资源有k个
2.最大需求矩阵MAX
n*m矩阵,定义系统中n个进程中每一个进程对m类资源的最大需求。
MAX[i][j]=k,进程i需要Rj类资源k个
3.分配矩阵Allocation
n*m矩阵,Allocation[i][j]=k,进程i已分得Rj类资源k个
4.剩余需求量矩阵Need
n*m矩阵,每一个进程已经剩余需要的资源个数
Need[i][j]=k,进程i还需要资源k个
算法:
设进程ri提出请求request[m],则银行家算法按如下规则进行判断。
(1)如果request[m]<=need[n][m],则转(2);否则,出错。
(2)如果request[m]<=available[m],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
available[m]= available[m]-request[m]
allocation[ri][m]=allocation[ri][m]+request[m]
need[ri][m]=need[ri][m]-request[m]
其中,pn指第pn行申请资源。
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
安全检查
(1)设置两个工作向量work=available;finish[n]=0;
(2)从进程集合中找到一个满足下述条件的进程,
finish[i]=0
need<=work
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源:
work=work+allocation;finish[i]=1;转(2);
(4)如所有的进程finish[p]=1,则表示安全;否则系统不安全。
*/
#include <iostream>
using namespace std;
#define n 4 //进程个数
#define m 3 //资源个数


int Available[m];
int MAX[n][m];
int Allocation[n][m];
int Need[n][m];


void Initialze()
{
	cout<<"请输入可用资源向量"<<endl;
	for (int i=0;i<m;i++)
	{
		cin>>Available[i];
	}
	cout<<"请输入最大需求矩阵MAX"<<endl;
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<m;j++)
		{
			cin>>MAX[i][j];
		}
	}
	cout<<"请输入分配矩阵Allocation"<<endl;
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<m;j++)
		{
			cin>>Allocation[i][j];
		}
	}
	cout<<"剩余需求量矩阵Need"<<endl;
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<m;j++)
		{
			cin>>Need[i][j];
		}
	}


}
bool Compare(int need[m],int avail[m])//need<=available,return true
{
	for (int i=0;i<m;i++)
	{
		if (need[i]>avail[i])
		{
			return false;
		}
	}
	return true;
}


bool IsSafety(int allocation[][m],int need[][m],int available[])
{
	int finish[n];
	int need_col[m];
	int available_col[m];
	memset(finish,0,sizeof(finish));//finish[i]=1表示第i个进程可以实现
	memcpy(available_col,available,sizeof(available_col));
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<n;j++)//轮询状态是否可以使得全部进程满足
		{
			if (finish[j]==1)//第j个进程已经完成,继续下一趟轮询
			{
				continue;
			}
			else
			{
				memcpy(need_col,need[j],sizeof(need[j]));
				if (Compare(need_col,available_col)==true)
				{
					finish[j]=1;
					//进程完成,释放所有资源
					for (int k=0;k<m;k++)
					{
						available_col[k]+=allocation[j][k];
					}
					break;
				}
			}
		}
	}
	for (int i=0;i<n;i++)
	{
		if (finish[i]!=1)
		{
			return false;
		}
	}
	return true;
}




//#define n 4 //进程个数
//#define m 3 //资源个数
bool Banker(int allocation[][m],int need[][m],int available[m],int request[m],int ri)
{
	int index=ri-1;
	int need_col[m];
	memcpy(need_col,need[index],sizeof(need[index]));
	//如果request[]<=need[index][],则转(2);否则出错
	//如果request[]<=available[],则转(3);否则出错
	if (Compare(request,need_col)&&Compare(request,available))
	{
		//试探性分配资源
		for (int i=0;i<m;i++)
		{
			allocation[index][i]+=request[i];
			need[index][i]-=request[i];
			available[i]-=request[i];
		}
		//进行安全性检查
		if (IsSafety(allocation,need,available))
		{
			cout<<"允许第"<<ri<<"个进程申请资源"<<endl;
		}
		else
		{
			cout<<"不允许第"<<ri<<"个进程申请资源"<<endl;
			//恢复状态
			for (int i=0;i<m;i++)
			{
				allocation[index][i]-=request[i];
				need[index][i]+=request[i];
				available[i]+=request[i];
			}
		}
		return true;
	}
	else
	{
		cout<<"第"<<ri<<"个进程申请资源出错"<<endl;
		return false;
	}
}




int main(int argc,char *argv[])
{
	Initialze();
	if (IsSafety(Allocation,Need,Available))//判断初始状态是否安全)
	{
		cout<<"初始状态安全"<<endl;
	}
	else
	{
		cout<<"初始状态不安全"<<endl;
		return -1;
	}
	int request[m]={0};
	int ri;
	cout<<"申请资源的进程号为:"<<endl;
	cin>>ri;
	cout<<"申请的资源向量为:"<<endl;
	for (int i=0;i<m;i++)
	{
		cin>>request[i];
	}
	Banker(Allocation,Need,Available,request,ri);
}


/*
请输入可用资源向量
0 1 1
请输入最大需求矩阵MAX
3 2 2
6 1 3
3 1 4
4 2 2
请输入分配矩阵Allocation
1 0 0
6 1 2
2 1 1
0 0 2
剩余需求量矩阵Need
2 2 2
0 0 1
1 0 3
4 2 0
初始状态安全
申请资源的进程号为:
2
申请的资源向量为:
0 0 1
允许第2个进程申请资源
========================
申请资源的进程号为:
1
申请的资源向量为:
0 0 1
不允许第1个进程申请资源
========================
申请资源的进程号为:
4
申请的资源向量为:
1 2 0
第4个进程申请资源出错
========================
初始状态安全
申请资源的进程号为:
4
申请的资源向量为:
0 1 0
允许第4个进程申请资源
*/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
操作系统课的实验(银行家算法)#include "malloc.h"   #include "stdio.h"   #include "stdlib.h"   #define alloclen sizeof(struct allocation)   #define maxlen sizeof(struct max)   #define avalen sizeof(struct available)   #define needlen sizeof(struct need)   #define finilen sizeof(struct finish)   #define pathlen sizeof(struct path)   struct allocation   {   int value;   struct allocation *next;   };   struct max   {   int value;   struct max *next;   };   struct available /*可用资源数*/   {   int value;   struct available *next;   };   struct need /*需求资源数*/   {   int value;   struct need *next;   };   struct path   {   int value;   struct path *next;   };   struct finish   {   int stat;   struct finish *next;   };   int main()   {   int row,colum,status=0,i,j,t,temp,processtest;   struct allocation *allochead,*alloc1,*alloc2,*alloctemp;   struct max *maxhead,*maxium1,*maxium2,*maxtemp;   struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;   struct need *needhead,*need1,*need2,*needtemp;   struct finish *finihead,*finish1,*finish2,*finishtemp;   struct path *pathhead,*path1,*path2;   printf("\n请输入系统资源的种类数:");   scanf("%d",&colum);   printf("请输入现时内存中的进程数:");   scanf("%d",&row);   printf("请输入已分配资源矩阵:\n");   for(i=0;i<row;i++)   {   for (j=0;jnext=alloc2->next=NULL;   scanf("%d",&allochead->value);   status++;   }   else   {   alloc2=(struct allocation *)malloc(alloclen);   scanf("%d,%d",&alloc2->value);   if(status==1)   {   allochead->next=alloc2;   status++;   }   alloc1->next=alloc2;   alloc1=alloc2;   }   }   }   alloc2->next=NULL;   status=0;   printf("请输入最大需求矩阵:\n");   for(i=0;i<row;i++)   {   for (j=0;jnext=maxium2->next=NULL;   scanf("%d",&maxium1->value);   status++;   }   else   {   maxium2=(struct max *)malloc(maxlen);   scanf("%d,%d",&maxium2->value);   if(status==1)   {   maxhead->next=maxium2;   status++;   }   maxium1->next=maxium2;   maxium1=maxium2;   }   }   }   maxium2->next=NULL;   status=0;   printf("请输入现时系统剩余的资源矩阵:\n");   for (j=0;jnext=available2->next=NULL;   work1->next=work2->next=NULL;   scanf("%d",&available1->value);   work1->value=available1->value;   status++;   }   else   {   available2=(struct available*)malloc(avalen);   work2=(struct available*)malloc(avalen);   scanf("%d,%d",&available2->value);   work2->value=available2->value;   if(status==1)   {   avahead->next=available2;   workhead->next=work2;   status++;   }   available1->next=available2;   available1=available2;   work1->next=work2;   work1=work2;   }   }   available2->next=NULL;   work2->next=NULL;   status=0;   alloctemp=allochead;   maxtemp=maxhead;   for(i=0;i<row;i++)   for (j=0;jnext=need2->next=NULL;   need1->value=maxtemp->value-alloctemp->value;   status++;   }   else   {   need2=(struct need *)malloc(needlen);   need2->value=(maxtemp->value)-(alloctemp->value);   if(status==1)   {   needhead->next=need2;   status++;   }   need1->next=need2;   need1=need2;   }   maxtemp=maxtemp->next;   alloctemp=alloctemp->next;   }   need2->next=NULL;   status=0;   for(i=0;inext=finish2->next=NULL;   finish1->stat=0;   status++;   }   else   {   finish2=(struct finish*)malloc(finilen);   finish2->stat=0;   if(status==1)   {   finihead->next=finish2;   status++;   }   finish1->next=finish2;   finish1=finish2;   }   }   finish2->next=NULL; /*Initialization compleated*/   status=0;   processtest=0;   for(temp=0;temp<row;temp++)   {   alloctemp=allochead;   needtemp=needhead;   finishtemp=finihead;   worktemp=workhead;   for(i=0;istat==0)   {   for(j=0;jnext,worktemp=worktemp->next)   if(needtemp->valuevalue)   processtest++;   if(processtest==colum)   {   for(j=0;jvalue+=alloctemp->value;   worktemp1=worktemp1->next;   alloctemp=alloctemp->next;   }   if(status==0)   {   pathhead=path1=path2=(struct path*)malloc(pathlen);   path1->next=path2->next=NULL;   path1->value=i;   status++;   }   else   {   path2=(struct path*)malloc(pathlen);   path2->value=i;   if(status==1)   {   pathhead->next=path2;   status++;   }   path1->next=path2;   path1=path2;   }   finishtemp->stat=1;   }   else   {   for(t=0;tnext;   finishtemp->stat=0;   }   }   else   for(t=0;tnext;   alloctemp=alloctemp->next;   }   processtest=0;   worktemp=workhead;   finishtemp=finishtemp->next;   }   }   path2->next=NULL;   finishtemp=finihead;   for(temp=0;tempstat==0)   {   printf("\n系统处于非安全状态!\n");   exit(0);   }   finishtemp=finishtemp->next;   }   printf("\n系统处于安全状态.\n");   printf("\n安全序列为: \n");   do   {   printf("p%d ",pathhead->value);   }   while(pathhead=pathhead->next);   printf("\n");   return 0;   } #include "string.h" #include #include #define M 5 #define N 3 #define FALSE 0 #define TRUE 1 /*M个进程对N类资源最大资源需求量*/ int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*系统可用资源数*/ int AVAILABLE[N]={10,5,7}; /*M个进程对N类资源最大资源需求量*/ int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; /*M个进程已经得到N类资源的资源量 */ int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*M个进程还需要N类资源的资源量*/ int Request[N]={0,0,0}; void main() { int i=0,j=0; char flag='Y'; void showdata(); void changdata(int); void rstordata(int); int chkerr(int); showdata(); while(flag=='Y'||flag=='y') { i=-1; while(i=M) { printf("请输入需申请资源的进程号(从0到"); printf("%d",M-1); printf(",否则重输入!):"); scanf("%d",&i); if(i=M)printf("输入的进程号不存在,重新输入!\n"); } printf("请输入进程"); printf("%d",i); printf("申请的资源数\n"); for (j=0;jNEED[i][j]) { printf("进程"); printf("%d",i); printf("申请的资源数大于进程"); printf("%d",i); printf("还需要"); printf("%d",j); printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); /*printf("申请不合理,出错!请重新选择!\n");*/ flag='N'; break; } else { if(Request[j]>AVAILABLE[j]) { printf("进程"); printf("%d",i); printf("申请的资源数大于系统可用"); printf("%d",j); printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); /*printf("申请不合理,出错!请重新选择!\n");*/ flag='N'; break; } } } if(flag=='Y'||flag=='y') { changdata(i); if(chkerr(i)) { rstordata(i); showdata(); } else showdata(); } else showdata(); printf("\n"); printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: "); scanf("%c",&flag); } } void showdata() { int i,j; printf("系统可用的资源数为:\n"); printf(" "); for (j=0;j<N;j++){ printf(" 资源"); printf("%d",j); printf(":"); printf("%d",AVAILABLE[j]); /*printf("\n");*/ /* cout<<endl; // cout<<"各进程资源的最大需求量:"<<endl<<endl; // for (i=0;i<M;i++) // { // cout<<"进程"<<i<<":"; // for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<MAX[i][j]; // cout<<endl; */ } printf("\n"); printf("各进程还需要的资源量:\n"); for (i=0;i<M;i++) { printf(" 进程"); printf("%d",i); printf(":"); for (j=0;j<N;j++){ printf("资源"); printf("%d",j); printf(":"); printf("%d",NEED[i][j]); /*printf("\n");*/ } printf("\n"); } printf("各进程已经得到的资源量: \n"); for (i=0;i<M;i++) { printf(" 进程"); printf("%d",i); /*printf(":\n");*/ for (j=0;j<N;j++){ printf("资源"); printf("%d",j); printf(":"); printf("%d",ALLOCATION[i][j]); /*printf("\n");*/ } printf("\n"); } } void changdata(int k) { int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j]; } }; void rstordata(int k) { int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } }; int chkerr(int s) { int WORK,FINISH[M],temp[M]; int i,j,k=0; for(i=0;i<M;i++)FINISH[i]=FALSE; for(j=0;j<N;j++) { WORK=AVAILABLE[j]; i=s; while(i<M) { if (FINISH[i]==FALSE&&NEED[i][j]<=WORK) { WORK=WORK+ALLOCATION[i][j]; FINISH[i]=TRUE; temp[k]=i; k++; i=0; } else { i++; } } for(i=0;i<M;i++) if(FINISH[i]==FALSE) { printf("\n"); printf("系统不安全!!! 本次资源申请不成功!!!\n"); printf("\n"); return 1; } } printf("\n"); printf("经安全性检查,系统安全,本次分配成功。\n"); printf("\n"); printf(" 本次安全序列:"); for(i=0;i"); } printf("\n"); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值