Philosopers 과제를 마치고 나서 중요한 점을 정리하는 문서이다.
과제 설명
쓰레드와 뮤텍스 개념을 활용하여 철학자 프로그램을 만들어라.
https://github.com/42seoul-translation/subject_ko/blob/master/philosophers/philosophers.ko.md
필수 파트(Mandatory Part)
중요한 개념
- 멀티쓰레딩
- 뮤텍스
- 밀리초와 마이크로초
관련 함수는 직접 찾아보고 사용해보면서 익히는 것을 권한다.
대략적인 로직
- 인자를 받고 적합성 검사를 한다. (argc의 개수 체크, 인자가 숫자 맞는지, 인자의 범위)
- mutex를 만들고, philo를 만든다. arg에서 받은 정보를 저장하는 구조체를 사용한다.
- pthread_create, detach를 사용하여 philo의 루틴을 반복하는 쓰레드를 만든다.
3.1. philo가 죽었는지, 정해진 만큼 다 먹었는지 체크하는 모니터 쓰레드를 만든다.
- 모니터 쓰레드에 의해서 완료조건이 만족되었을 때, 쓰레드를 종료시킨다.
- free, mutex_destroy 등을 활용하여 할당을 해제한다.
주의 사항
- 각 철학자가 "하나의 쓰레드"로 구성되어 있는가? (2개 이상이면 안됨)
- 프로그램 인자에서 숫자 외의 문자가 들어왔거나, 인자의 범위에서 벗어났을 때.
- pthread나 mutex 관련 함수의 에러 처리를 열심히 하자. (대부분 성공 시 0, 실패 시 -1)
보너스 파트 (Bonus Part)
중요한 개념
- 세마포어 (+ 뮤텍스와의 차이)
- 멀티프로세싱 (+ 멀티쓰레딩과의 차이)
세마포어와 뮤텍스의 차이
뮤텍스와 세마포어는 둘 다 임계 구역을 보호(?)하는 역할을 한다. 뮤텍스는 하나당 하나의 쓰레드를 관리할 수 있다. 그러나, 세마포어는 n개를 관리할 수 있다. 그리고 뮤텍스는 메모리 영역에서 관리되고, 세마포어는 파일 영역에서 관리된다. 그래서 멀티 쓰레딩에는 뮤텍스, 멀티 프로세싱에는 세마포어를 사용하는 것이 좋다. fork() 등으로 프로세스를 분기시키면, 메모리도 같이 분화되는데, 이 과정에서 뮤텍스는 무용지물이 된다. 세마포어는 파일 영역에서 관리되기 때문에 사용할 수 있다.
주의 사항
- sem_unlink를 하지 않으면, 이후 프로그램을 다시 실행시킬 때, 동명의 세마포어를 만들 때 에러가 발생할 수 있음.
- sem_unlink가 있더라도 프로그램을 ctrl + c 등으로 강제로 종료시키면 에러가 발생할 수 있음.