コード例 #1
0
int checkForDeadlock(int N,int M)
{
	acquireMutexLock(MATRIX_MUTEX);

	int matrix[N][M];
	FILE *fp = fopen(MATRIX_FILENAME, "r+");

	int i,j;
	for(i=0;i< N ;i++)
	{
		for(j=0;j< M ;j++)
		{
			fscanf(fp, "%d", &matrix[i][j]);
		}
	}
	fclose(fp);
	releaseMutexLock(MATRIX_MUTEX);

	int pos[N];
	for(i=0;i<N;i++)pos[i]=-1;
	int flag=-1;

	printf("\nChecking for Deadlock...\n\n");

	j=0;
	int k=0;
	int found=0;
	while(k<N && !found)
	{
		if(flag==-1)j=0;
		for(i=0;i<N;i++)
			if(matrix[i][j]==2) {pos[k]=i; break;}
		if(pos[k]==-1) return 0;
		if(pos[k]==pos[0] && k!=0) {found=1; break;}
		flag=-1;
		for(j=0;j<M;j++)
			if(matrix[pos[k]][j]==1) {flag=j; break;}
		if(flag==-1) return 0;
		k++;
	}


	if(found)
	{
		printf("\n\nDeadlock !!!\n\nDeadlocked Cycle : \n");
		//printf("k = %d\n",k );
		for(i=0;i<k;i++)
				printf("Train %d from %s is waiting for Train %d from %s\n",pid_arr[pos[i]], direction_arr[pos[i]] ,pid_arr[pos[i+1]] , direction_arr[pos[i+1]] );
		
		printf("\n\nPress a key to kill all Processes and exit !\n");
		getch();
		killAllProcesses();
		//appendResults(probability);
		return 1;
	}
	else return 0;

}
コード例 #2
0
int checkInternalCommand(char *args[]){
                if (!strcmp(args[0],"clear")) { // "clear" command
					pid_t pid;
					int status;
                    if((pid = fork())==0)
						execl("/usr/bin/clear", "clear", NULL);
					else
						waitpid(pid, &status, 0);
                    //continue;
                    return 1;
                }
                if (!strcmp(args[0],"exit")){   // "quit" command
					killAllProcesses();
                    return -1;
                }
                
                if (!strcmp(args[0],"ps_all")){  // list
					listAllProcesses();
                    return 1;
                }
				if (!strcmp(args[0],"kill")){  // kill
					int index = 0;
					char Index[10];
					if(args[1][0] == '%')//INDEX
						strcpy(Index, &args[1][1]);
					else
						strcpy(Index, &args[1][0]);
					index = atoi(Index);
					if(args[1][0] == '%')
						killWithIndex(index);
					else
						killWithProcessId(index);
                    return 1;
                }
				if (!strcmp(args[0],"fg")){  // fg
					int index = 0;
					char Index[10];
					if( args[1][0] != '%'){//INDEX
						fprintf(stderr, "\nUsage : fg %cindex",'%');
						return 1;
					}
						strcpy(Index, &args[1][1]);
					index = atoi(Index);
					bringForeground(index);
                    return 1;
                } 
				if (!strcmp(args[0],"bg")){  // bg
					bringBackground();
                    return 1;
                }                                            
	return 0;
}
コード例 #3
0
void main(int argc,char* argv[])
{
	int DPP;
	float probability = 0.2;

	if(argc!=3)
	{
		printf("Please run the program with 2 arguments : <DPP_toggle (0 or 1)> <probability> \n"); // DPP --> Deadlock Prevention Protocol
		exit(1);
	}
	else
	{
		sscanf(argv[1],"%d",&DPP);
		sscanf(argv[2],"%f",&probability);
		if((DPP != 0 && DPP != 1)||(probability<0 || probability >1))
		{
			printf("Please run the program with valid arguments : <DPP_toggle (0 or 1)> <probability>\n"); // DPP --> Deadlock Prevention Protocol
			exit(1);
		}
	}

	semID = semget((key_t)SEMAPHORE_KEY,7,IPC_CREAT|0666);

	initializeAllSubSemaphoreValues();

	acquireMutexLock(MATRIX_MUTEX);
	initializeMatrixFile();
	releaseMutexLock(MATRIX_MUTEX);

	int mssgQ0_ID=msgget((key_t)MSSG_Q0_KEY,IPC_CREAT|0666);
	int mssgQ1_ID=msgget((key_t)MSSG_Q1_KEY,IPC_CREAT|0666);

	int i;
	for(i=0;i<NUM_PRODUCERS;i++)
	{
		char command[50];
		sprintf(command,"xterm -hold -e ./producer %d %d %d &",MSSG_Q0_KEY,MSSG_Q1_KEY,i);
		system(command);
		sleep(1);	// otherwise the item to be first inserted becomes the same for all the Queues due to the timeseeding : srand(time(NULL)) 
	}

	for(i=0;i<NUM_CONSUMERS;i++)
	{
		char command[50];
		sprintf(command,"xterm -hold -e ./consumer %d %d %d %f %d &",MSSG_Q0_KEY,MSSG_Q1_KEY,NUM_PRODUCERS+i,probability,DPP);
		system(command);
	}


	while(1)
	{
		int m,n;	// if Deadlock is found, then Consumer m (Cm) and Consumer n (Cn) are such that Q0 --> Cm --> Q1 --> Cn --> Q0, in the Resource Allocation Graph 

		int found_deadlock = 0;
		printf("Checking for Deadlock...\n");

		acquireMutexLock(MATRIX_MUTEX);
		found_deadlock = checkForDeadlock(&m,&n);
		releaseMutexLock(MATRIX_MUTEX);

		if(found_deadlock)
		{
			printf("\n\nDeadlock !!!\n\nDeadlocked Cycle : Q0 --> C%d --> Q1 --> C%d --> Q0 \n\nKilling all Processes...",m,n);
			printf("\n\nPress a key to kill all Processes\n");
			getch();
			killAllProcesses();
			appendResults(probability);
			exit(0);
		}
		sleep(2);
	}
}