C언어의 pthread_mutex_lock, pthread_mutex_unlock을 interpositioning하여 Deadlock을 detect하는 프로그램을 만든다.
Runtime Deadlock Detect Program
이번 포스트에서는 interposotioning과정까지만 이야기하겠다.
pthread_mutex_lock와 pthread_mutex_unlock을 내가 만든 함수로 정의한다.
interpositioning한 mutex의 code
https://github.com/Yuhyeingjoo/Deadlock-detector/blob/master/ddmon.c
앞서 위에서 언급한 "주요 기능"과 관련된 함수리스트이다.
ret_fd : detect프로그램에게 전송할 채널의 파일 디스크립터를 리턴해주는 함수. 처음 실행 때는 채널을 만들고 그 후 실행에는 channel이 exist하기 때문에 그 채널의 파일 디스크립터만 return한다.
send_message : detect프로그램으로 데이터를 보내는 함수. thread ID, Mutex ID 그리고 미리 정해둔 규칙(protocol)을 전송한다.
dlsym : 동적라이브러리를 열어서 내가 찾는 함수의 포인터를 리턴해주는 함수다. 여기서 return받은 함수 포인터로 원래의 pthread_mutex_lock과 pthread_mutex_unlock을 실행할 수 있다.
여기서 설명하는 함수들은, 주요 기능과 관련된 함수는 아니지만 프로그램의 competence와 reliability를 위해 내가 추가한 코드이다.
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);
}
relative_addr함수 : deadlock이 발생한 코드 라인을 detect프로그램에서 출력하기 위해서 필요한 데이터도 같이 send한다.
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