Deadlock Detect 프로그램(C언어) -1

유형주·2022년 3월 15일
0

목표

(학부생 수준에서만든 연습용 프로그램임)

C언어의 pthread_mutex_lock, pthread_mutex_unlock을 interpositioning하여 Deadlock을 detect하는 프로그램을 만든다.

Runtime Deadlock Detect Program


이번 포스트에서는 interposotioning과정까지만 이야기하겠다.

pthread_mutex_lock와 pthread_mutex_unlock을 내가 만든 함수로 정의한다.

  • 추가한 pthread함수의 주요 기능
    - mkfifo로 채널을 생성하여 매 번 mutex함수가 실행 될 때마다 그 정보를 채널을 통해 detect프로그램으로 전송한다.
    - 그 외에는 dylsm함수를 이용해 원래 mutex함수가 하던 기능을 하도록 한다.
interpositioning한 mutex의 code

https://github.com/Yuhyeingjoo/Deadlock-detector/blob/master/ddmon.c

내가 정의한 mutex함수의 동작을 이해하기 위한 함수 설명

앞서 위에서 언급한 "주요 기능"과 관련된 함수리스트이다.

  1. ret_fd : detect프로그램에게 전송할 채널의 파일 디스크립터를 리턴해주는 함수. 처음 실행 때는 채널을 만들고 그 후 실행에는 channel이 exist하기 때문에 그 채널의 파일 디스크립터만 return한다.

  2. send_message : detect프로그램으로 데이터를 보내는 함수. thread ID, Mutex ID 그리고 미리 정해둔 규칙(protocol)을 전송한다.

  3. dlsym : 동적라이브러리를 열어서 내가 찾는 함수의 포인터를 리턴해주는 함수다. 여기서 return받은 함수 포인터로 원래의 pthread_mutex_lock과 pthread_mutex_unlock을 실행할 수 있다.


ddmon.c 의 그 외의 설정들

여기서 설명하는 함수들은, 주요 기능과 관련된 함수는 아니지만 프로그램의 competence와 reliability를 위해 내가 추가한 코드이다.

  1. send의 race를 방지하기 위한 설정, send_message앞 뒤로 lock과 unlock을 해서 데이터가 race현상으로 오염되는 것을 방지한다.
if(mutex_p(&fifo_m)){
		printf("Lock error\n");
		exit(1);
	}
    
send_message(fd, protocol, thread_id, lock_m, addr);

if(mutex_p_un(&fifo_m)){
		printf("Unlock error\n");
		exit(1);
	}
  1. relative_addr함수 : deadlock이 발생한 코드 라인을 detect프로그램에서 출력하기 위해서 필요한 데이터도 같이 send한다.

  2. send하는 데이터의 프로토콜 : detect프로그램에 무작정 mutex ID와 thrad ID를 보내면 receive하는 detect프로그램에서는 이게 무슨 용도의 데이터인지 알 수 없다. 그러므로 lock할 때와 unlock할 때를 구분해주는 flag가 존재할 필요가 있다. 그 역할을 send하는 데이터의 처음 4바이트가 한다. 처음 4바이트의 값이 1이면 lock, 0이면 unlock의 데이터라고 판단하도록 정했다.

    보내지는 데이터 chunk : 4 8 8 4 (bytes)
    처음 4 : 0 or 1 (flag)
    두번째 8 : thread ID
    세번째 8 : mutex ID
    네번째 4 : relative address (라인넘버에 대한 데이터)

    이렇게 24바이트를 한 덩어리로 정하여 detect프로그램에 전송한다.

다음 포스트에서는 여기서 보낸 데이터를 받아서 Deadlock을 detect 프로그램의 대한 설명으로 이어가겠다.

링크 : https://github.com/Yuhyeingjoo/Deadlock-detector/blob/master/ddmon.c

0개의 댓글