[Philosopers] 과제 정리

SonHero·2022년 3월 27일
0

42cursus

목록 보기
1/5
post-thumbnail

Philosopers 과제를 마치고 나서 중요한 점을 정리하는 문서이다.

과제 설명

쓰레드와 뮤텍스 개념을 활용하여 철학자 프로그램을 만들어라.
https://github.com/42seoul-translation/subject_ko/blob/master/philosophers/philosophers.ko.md

필수 파트(Mandatory Part)

중요한 개념

  1. 멀티쓰레딩
  2. 뮤텍스
  3. 밀리초와 마이크로초

관련 함수는 직접 찾아보고 사용해보면서 익히는 것을 권한다.

대략적인 로직

  1. 인자를 받고 적합성 검사를 한다. (argc의 개수 체크, 인자가 숫자 맞는지, 인자의 범위)
  2. mutex를 만들고, philo를 만든다. arg에서 받은 정보를 저장하는 구조체를 사용한다.
  3. pthread_create, detach를 사용하여 philo의 루틴을 반복하는 쓰레드를 만든다.
    3.1. philo가 죽었는지, 정해진 만큼 다 먹었는지 체크하는 모니터 쓰레드를 만든다.
  4. 모니터 쓰레드에 의해서 완료조건이 만족되었을 때, 쓰레드를 종료시킨다.
  5. free, mutex_destroy 등을 활용하여 할당을 해제한다.

주의 사항

  1. 각 철학자가 "하나의 쓰레드"로 구성되어 있는가? (2개 이상이면 안됨)
  2. 프로그램 인자에서 숫자 외의 문자가 들어왔거나, 인자의 범위에서 벗어났을 때.
  3. pthread나 mutex 관련 함수의 에러 처리를 열심히 하자. (대부분 성공 시 0, 실패 시 -1)

보너스 파트 (Bonus Part)

중요한 개념

  1. 세마포어 (+ 뮤텍스와의 차이)
  2. 멀티프로세싱 (+ 멀티쓰레딩과의 차이)

세마포어와 뮤텍스의 차이

뮤텍스와 세마포어는 둘 다 임계 구역을 보호(?)하는 역할을 한다. 뮤텍스는 하나당 하나의 쓰레드를 관리할 수 있다. 그러나, 세마포어는 n개를 관리할 수 있다. 그리고 뮤텍스는 메모리 영역에서 관리되고, 세마포어는 파일 영역에서 관리된다. 그래서 멀티 쓰레딩에는 뮤텍스, 멀티 프로세싱에는 세마포어를 사용하는 것이 좋다. fork() 등으로 프로세스를 분기시키면, 메모리도 같이 분화되는데, 이 과정에서 뮤텍스는 무용지물이 된다. 세마포어는 파일 영역에서 관리되기 때문에 사용할 수 있다.

주의 사항

  1. sem_unlink를 하지 않으면, 이후 프로그램을 다시 실행시킬 때, 동명의 세마포어를 만들 때 에러가 발생할 수 있음.
    • sem_unlink가 있더라도 프로그램을 ctrl + c 등으로 강제로 종료시키면 에러가 발생할 수 있음.
profile
개발하는 학생입니다.

0개의 댓글