1. 멀티 프로세스와 IPC 이해
프로세스간 커뮤니케이션(InterProcess Communication)
- 기본적으로 프로세스는 다른 프로세스의 공간을 접근할 수 없다
IPC(InterProcess Communication)
- 프로세스 간 커뮤니케이션 하는 방법 -> 프로세스간 통신 방법 제공
- 실제 프로세스 중 리눅스의 경우, 커널 공간은 공유하며 어떤 프로세스든 0~4GB의 메모리 주소를 가짐
다양한 IPC 기법 - 2번부터는 모두 커널 공간을 사용하는 것
1. pipe 사용 - pipe와 message queue는 모두 kernel 공간의 메모리 사용
2. Message Queue - 큐니까 기본은 FIFO 정책으로 데이터 전송(kernel 공간의 메모리 사용)
3. Shared Memory(공유 메모리) - kernel space에 메모리 공간을 만들고, 해당 공간을 변수처럼 씀
4. Signal(시그널) - 유닉스에서 30년 이상 사용된 전통적인 기법
- 커널 또는 프로세스에서 다른 프로세스에 발생한 이벤트를 알려줌
- 시그널 종류와 각 시그널에 따른 기본 동작이 미리 정해져 있음
- SIGKILL: 프로세스를 죽여라(슈퍼관리자가 사용하는 시그널로, 프로세스는 어떤 경우든 죽도록 되어 있음)
- SIGALARM: 알람을 발생한다
- SIGSTP: 프로세스를 멈춰라(Ctrl + z)
- SIGCONT: 멈춰진 프로세스를 실행해라
- SIGINT: 프로세스에 인터럽트를 보내서 프로세스를 죽여라(Ctrl + c)
- SIGSEGV: 프로세스가 다른 메모리영역을 침범했다.
- 프로그램에서 특정 시그널의 기본 동작 대신 다른 동작을 하도록 구현 가능
- 각 프로세스에서 시그널 처리에 대해 다음과 같은 동작 설정 가능
- 시그널 무시
- 시그널 블록(블록을 푸는 순간, 해당 프로세스에서 시그널 처리)
- 프로그램 안에 등록된 시그널 핸들러로 재정의한 특정 동작 수행
- 등록된 시그널 핸들러가 없다면, 커널에서 기본 동작 수행
5. Socket(소켓) - 클라이언트와 서버 등, 두 개의 다른 컴퓨터 간 네트워크 기반 통신을 위한 기술
- 한 컴퓨터 안의 두 개의 프로세스 간 통신 기법으로 사용 가능
- 리눅스 커널 내부 네트워크 스택 예
2. 스레드 개념 이해
Thread(스레드)
- Light Weight Process라고도 함
- 각기 실행 가능한 stack이 존재
- 프로세스: 프로세스 간에는 각 프로세스의 데이터 접근이 불가
- 스레드: 한 프로세스에 여러 개 생성 가능하고 동시에 실행도 가능하며,
프로세스 안에 있기 때문에 프로세스의 데이터 모두 접근 가능
Multi Thread(멀티 스레드)
- 소프트웨어 병행 작업 처리를 위해 사용
- 최근에는 짧은 반응 시간이 우선이기 때문에 성능 개선에 신경을 많이 쓰므로 많이 사용
- 멀티 프로세스는 처음 구조를 잡을 때 만들어야 하지만,
쓰레드는 프로그램의 일부 동작에서만 사용하도록 코드 수정 가능
멀티 프로세싱과 Thread(멀티 태스킹과 멀티 프로세싱)
3. 스레드 장단점 정리
장점
1) 사용자에 대한 응답성 향상
2) 자원 공유 효율
- 프로세스간 자원 공유를 위해, IPC기법과 같은 번거로움이 필요 없음
- 프로세스 안에 있으므로 프로세스의 데이터에 모두 접근 가능
3) 작업이 분리되어 코드가 간결해짐
단점
- 스레드 중 한 스레드만 문제가 있어도, 전체 프로세스가 영향을 받음
- 스레드를 많이 생성하면, Context Switching이 많이 일어나 성능 저하 유발
-> 특히 리눅스 OS에서는 스레드를 프로세스와 함께 다루는데,
여기서 스레드를 많이 생성하면 모든 스레드를 스케쥴링해야 하기 때문에 Context Switching이 빈번하게 발생
- 동기화 이슈로 비정상적으로 동작할 수 있음: 적절한 동기화 코드 추가 필요
Thread vs Process
- 프로세스는 독립적, 스레드는 프로세스의 서브셋
- 프로세스는 각각 독립적인 자원을 가지며, 스레드는 프로세스의 자원 공유
- 프로세스는 자신만의 주소영역을 가지는데, 스레드는 그 주소영역 공유
- 프로세스 간에는 IPC 기법으로 통신해야 하는데, 스레드는 기법이 필요하지 않음