면접 단골질문! 프로세스와 스레드의 차이는 뭔가요?에 대해서 설명해볼게요~
프로세스
운영체제에서 실행중인 하나의 프로그램
- 프로세스: 동적 / 프로그램: 정적
- 실행중?? -> 시스템 자원을 할당 받은 상태
- CPU 시간
- 운영되기 위해 필요한 주소공간
- 독립된 메모리 공간 -> Code, Data, Stack, Heap
-> 다른 프로세스의 변수, 자료구조에 접근할 수 없음
=> 접근하려면 IPC(Inter-Process Communication, 커널이 제공하는 설비 중 하나)를 사용해야 함
프로세스 간 통신
다양한 IPC가 존재하기 때문에 상황에 따라 알맞는 IPC 설비를 선택해야 함
PIPE(익명 PIPE)
- 한 프로세스는 읽기, 다른 프로세스는 쓰기를 하는 간단한 구조
- 반이중, Half-duplex 통신
- 두 개의 파이프를 사용하면 송/수신 다 할 수 있긴 함. 근데 좋은 방법은 아님. n개의 프로세스에 nP2개의 파이프가 필요하기 때문!
- 익명? -> 말 그대로 이름이 없어서 외부에서 접근할 수 없음(사용이 제한적). 부모 프로세스가 자식 프로세스를 생성할 땐, 파일지정번호를 상속받아 익명 PIPE로 통신가능.
Named PIPE
- 익명 PIPE의 단점을 해결. 즉, 이름이 있는 파일을 사용
- 따라서, 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신 가능
- 하지만 역시 반이중 통신방식.. :(
Message Queue
- 하나의 구조체
- Named PIPE와 유사. 단, 메세지 단위로 동작
- 메세지에 최대 크기를 둬 제한
- 각 메세지는 메세지 유형을 가져 수신 프로세스는 어떤 유형의 메세지를 받을 것인지 선택할 수 있음
- 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다!!
Shared Memory
- 커널에 요청을 해 한 프로세스의 일부분(메모리)를 다른 프로세스와 공유하는 것
- 읽고 쓸 때 동기화 필요
- 대량의 정보를 다수의 프로세스에 배포가능
- 빠르고 효율적
- 공유 메모리 공간에 대한 접근제어가 필요
Socket
- 네트워크 소켓통신을 이용한 데이터 공유
- 서버/클라이언트 환경 구축에 용이
- 중대형 애플리케이션에서 주로 사용
스레드
프로세스 내에서 실행되는 여러 흐름의 단위, 프로세스의 특정한 수행 경로, CPU 스케쥴링의 기본 단위
- Code, Data, Heap -> Thread 끼리 공유. 따라서, 한 스레드가 프로세스의 자원을 변경하면 다른 이웃 스레드가 그 변경을 즉시 확인 가능!
- 왜 Stack 영역은 각 thread 별로 따로 할당할까?
-> 각 스레드는 각각의 실행 시퀀스/코드를 가질 수 있음. 따라서 함수가 호출되고 반환될 때 각각의 program counter를 push/pop해야 함! 즉, Thread 사이의 보호를 위해 구분함