-
쓰레드 vs 멀티 프로세스Computer Science 2022. 3. 13. 21:57
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tacma&logNo=220245341360
쓰레드(Thread) 그리고 멀티프로세스(fork)
항상 다뤄왔던 녀석들인데 어느순간 갑자기 각각의 장단점, 특징에 대해 설명하려니 내 스스로 정리하고 있...
blog.naver.com
* 위 블로그를 요약했습니다. *
쓰레드 (Thread)
대부분의 서버/클라이언트에서 사용하고 있는 서버 프로그래밍 방법.
멀티프로세스인 fork 방식에 비해 적은 메모리를 사용하고 빠르게 동작이 가능.
멀티 프로세스의 경우 모든 자원을 복사하여 볼도의 자식프로세스를 구동하는 반면, 쓰레드를 생성하게 되면 현재 상태의 자원을 모두 공유하여 사용이 가능.
단, 쓰레드를 이용할 경우 교착상태에 빠지지 않도록 공유자원 관리가 철저하게 이뤄질 수 있음
빠른 프로세스 생성
적은 메모리 사용
자원을 쉽게 공유 (쓰레드는 코드, 데이터, 힙 영역을 공유한다. 스택 영역말 독립적으로 할당)
쓰레드간의 통신이 쉽다. (IPC 기법이 불필요)
공유자원 관리 방법은 뮤텍스, 세마포어 등이 있다.
멀티 프로세스 (fork)
fork를 통해 자식 프로세스를 생성할 경우 데이터, 힙, 스택 영역 모두 독립적으로 복제됨.
fork 명령을 실행한 시점부터 부모와 자식 프로세스는 동일한 지점부터 동일한 코드를 수행하게 되며, 이 때문에 부모와 자식 프로세스에 대한 코드는 분기하여 개발해야 함.
파일 디스크립터나 환경변수, 권한을 그대로 자식 프로세스가 부여 받는다.
-> 동일한 작업 가능.. but 자원 낭비와 시스템 부하 문제점
fork를 이용한 경우 부모프로세스와 자식프로세스 혹은 자식 프로세스간의 통신이 필요한데,
이는 자원을 서로 공유하지 않기에 IPC를 이용해야 한다.
** fork 사용시 주의 점
1. 부모가 자식보다 먼저 종료되면 고아 프로세스 생성
2. 자식이 부모보다 먼저 종료되면 좀비 프로세스 생성 (wait()으로 회수하지 않은 경우)
1. 부모 프로세스가 자식 프로세스보다 먼저 종료되어 부모 프로세스가 없는 자식 프로세스를 고아 프로세스라고 한다.
운영체제는 고아 프로세스를 허용하지 않기에 부모 프로세스가 먼저 종료되면 자식 프로세스의 새로운 부모 프로세스로 init(PID = 1)가 설정된다.
init 프로세스는 자식 프로세스가 종료될 때까지 기다린 후 wait 함수를 호출하여 좀비 프로세스가 되는 것을 방지한다.
시스템이 프러세스가 종료될 때 까지 추적을 해야하기 때문에 성능 저하의 원인이 된다.
2. 자식 프로세스를 생성할 때 최소한의 정보(PID)가 생성되는데, 자식 프로세스가 끝난 이후에 부모 프로세스에서 wait()으로 자식의 종료를 회수하지 않으면 자식 프로세스의 최소한의 정보가 메모리에 좀비처럼 남아있게 된다.
자식 프로세스의 종료를 기다리고 최소한의 정보를 회수하는 wait(), waitpid() 필요
레퍼런스
https://latter2005.tistory.com/106
[운영체제] 좀비 프로세스, 고아 프로세스
좀비 프로세스 자식 프로세스가 부모 프로세스보다 먼저 죽는 경우 부모 프로세스가 종료 상태를 회수하기 위해 커널이 자식 프로세스의 최소한의 정보(PID, 종료 상태 등, 리눅스의 경우 커널에
latter2005.tistory.com