Lỗi giải thuật nhà băng (banker) ngăn chặn deadlock trong hệ điều hành?

mình đang code giải thuật banker bằng c ngăn chặn deadlock trong hệ điều hành
gồm 2 công việc chính là kiểm tra tình trạng hệ thống và cấp phát tài nguyên cho tiến trình
chương trình đã kiểm tra được tình trạng deadlock chính xác, nhưng khi chạy phần cấp phát tài nguyên, thì nó phải kiểm tra lại hệ thống 1 lần nữa sau khi cập nhật các bảng, thì lại lỗi ,mặc dù hệ thống vẫn như cũ, vì mình cho cấp thêm toàn 0 cả, tương đương với việc không cấp, nghĩa là cùng 1 hệ thống, nhưng lần đầu kiểm tra thì đúng mà lần 2 thì lại sai :smile:
vì code chương trình khá dài, nên mình chỉ đăng những phần cần thiết cho câu hỏi lên đây
lỗi ở đâu nhỉ mình đã xem đi xem lại, vẫn k phát hiện ra được lỗi ở đâu, vẫn đúng logic chương trình, xin cảm ơn :slight_smile:

 #define P 10	// so tien trinh toi da
#define R 10	// so tai nguyen toi da


int allocation[P][R];	// so luong the hien cua moi tai nguyen da cap phat cho cac tien trinh
int request[P][R];	// so luong the hien cua tai nguyen ma tien trinh yeu cau
int available[R];	// so luong the hien con kha dung cua moi tai nguyen
int need[P][R];	// so luong the hien cua moi tai nguyen ma tien trinh can them
int finish[P];	// kiem tra cac tien trinh co thuc hien duoc het hay khonh
int update[R];	// cap nhat tai nguyen sau khi tien trinh su dung va da giai phong
int add[R]; // tien trinh yeu cau cap them
int p, r;	// so tai nguyen va tien trinh doc tu file
int p_get_more; // tien trinh yeu cau cap them


int test_deadlock(); // kiem tra he thong co bi deadlock khong
int compares(int); // so sanh tai nguyen kha dung voi tai nguyen tien trinh can them
void releases(int);	// thu hoi tai nguyen allocation + update
void get_more();	// xu ly yeu cau cap them tai nguyen cua tien trinh

hàm test deadlock

int test_deadlock(){
	int i, check, flag;
	for (i = 0; i < r; i++) update[i] = available[i];
	for (i = 0; i < r; i++) finish[i] = 0;

	printf("\nupdate\n");
	printf_resources(update);
	do{
		flag = 0;
		for (i = 0; i < p; i++){
			if (!finish[i]){
				check = compares(i);
				if (check){
					releases(i);
					printf_resources(update);
					finish[i] = 1;
					flag = 1;
				}
			}
		}
	} while (flag);

	for (i = 0; i < p; i++){
		if (finish[i] == 0)		return 1;
	}
	return 0;

}

.

int compares(int process){
	int j;
	for (j = 0; j < r; j++)	if (need[process][j] > update[j]) return 0;
	return 1;
}
//------------------------------------
void releases(int process){
	int j;
	for (j = 0; j < r; j++) 	update[j] += allocation[process][j];
}

hàm cấp phát tài nguyên

void get_more(){
	p_get_more--;
	int j;
	for (j = 0; j < r; j++)
		if (need[p_get_more][j] < add[j]){
			printf("System can not allocate resources!\n\n");
			return;
		}

	for (j = 0; j < r; j++)
		if (available[j] < add[j]){
			printf("System not enough resources for allocate. Please wait!\n\n");
			return;
		}

	for (j = 0; j < r; j++){
		available[j] -= add[j];
		allocation[p_get_more][j] += add[j];
		need[p_get_more][j] -= add[j];
	}

	printf("\nallocation:\n");
	printf_process(allocation);

	printf("\nrequest:\n");
	printf_process(request);

	printf("\navailable:    ");
	calculate_available();
	printf_resources(available);

	printf("\nneed:\n");
	calculate_need();
	printf_process(need);


	int check =0;
	check = test_deadlock();
	if (!check) printf("\nAllocated\n");
	else printf("\nSystem can not allocate. Will be deadlock\n\n");
}
1 Like

hếp mê :smile: :smile:

hêp mê , hếp me :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?