1. 멀티 프로세스 vs 멀티 스레드
동일한 작업을 수행하는 단일 스레드 프로세스를 여러 개 실행하는 멀티 프로세스와 하나의 프로세스를 여러 스레드로 실행하는 멀티 프로세스는 어떤 차이가 있을까?
중요한 것은 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유함녀서 실행된다는 점이다.
(1) 멀티 프로세스
프로세스를 fork하면 코드/데이터/힙 영역 등의 모든 자원이 복제되어 저장된다. 즉, 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 2개가 통째로 메모리에 적재되는 것이다. 가령 fork를 4번 한다면 메모리에는 같은 프로세스가 통째로 4개가 적재된다.
하지만 fork 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법도 있는데 이를 쓰기 시 복사(copy on write) 기법이라 한다.
(2) 멀티 스레드
스레드들은 각기 다른 스레드ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 자원을 공유한다.
(3) 멀티 프로세스와 멀티 스레드의 차이
즉, 멀티 프로세스는 각 프로세스의 PID 값이 다르며 저장되어 있는 메모리 공간의 위치도 다르지만, 멀티 스레드는 하나의 프로세스 안에서 자원을 공유한다는 점이 차이점이다.
프로세스끼리는 자원을 공유하지 않는다 -> 남남처럼 독립적으로 실행된다
스레드는 프로세스의 자원읋 공유한다 -> 협력과 통신에 유리하다
2. 멀티 스레드가 무조건적으로 유리한가
하지만 멀티 스레드가 무조건적으로 장점인 것은 아니다. 때로는 멀티 스레드는 문제가 될 수 있다.
멀티 프로세스의 경우는 하나의 프로세스에 문제가 생겼다고 해도 자원을 공유하지 않기 때문에 다른 프로세스의 실행에는 지장이 없거나 적다.
하지만 멀티 스레드의 경우는 하나의 스레드에 문제가 생긴다면 자원을 공유하기 때문에 다른 스레드의 실행에 지장이 생긴다.
3. 프로세스 간의 자원 공유
멀티 프로세스의 경우 각 프로세스가 각자의 메모리를 가지고 있기 때문에 자원을 공유하지 않는다는 것이 기본적인 특징이지만 프로세스 간에도 자원을 주고받을 수 있는 방법이 있다.
프로세스 간 통신(IPC)를 통해서 자원을 주고 받을 수 있다. 이러한 IPC의 종류로는 여러 가지가 있다.
IPC
멀티프로세스는 IPC(Inter Process Communication)이 가능하며 IPC는 프로세스들끼리 데이터를 주고받고 고유 데이터를 관리하는 매커니즘을 뜻한다.
클라이언트와 서버를 예로 들 수 있는데, 클라이언트는 데이터를 요청하고 서버는 클라이언트 요청에 응답하는 것도 IPC의 예다.
IPC의 종류로는 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐가 있다. 이들은 모두 메모리가 완전히 공유되는 스레드보다는 속도가 떨어진다.
1) 공유 메모리
공유 메모리는 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 메모리를 생성해서 통신하는 것을 말한다.
기본적으로는 각 프로세스의 메모리를 다른 프로세스가 접근할 수 없지만 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유할 수 있다. IPC 방식 중 어떠한 매개체를 통해 데이터를 주고 받는 것이 아닌 메모리 자체를 공유하기 때문에 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르며 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요하다.
2) 파일
파일은 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터를 말한다. 이를 기반으로 프로세스 간 통신을 한다.
3) 소켓
동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미하며 TCP와 UDP가 있다.
4) 익명 파이프
익명 파이프는 프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방ㄹㅇ식의 읽기 전용, 쓰기 전용 파이프를 만들어 작동하는 방식을 말한다.
이는 부모, 자식 프로세스 간에만 사용할 수 있으며 다른 네트워크 상에서는 사용이 불가능하다.
5) 명명 파이프
명명 파이프는 파이프 서버와 하나 이상의 파이프 클라이언트 간 통신을 위한 명명된 단방향 또는 양방향 파이프를 말한다. 클라이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용할 수 있다. 컴퓨터의 프로세스끼리 또는 다른 네트워크 상의 컴퓨터와도 통신이 가능하다.
위의 그림처럼 보통 서버용 파이프와 클라이언트용 파이프로 구분해 작동하며 하나의 인스턴스를 열거나 여러 개의 인스턴스를 기반으로 통신한다.
6) 메시지 큐
메시지 큐는 메시지를 큐 데이터 구조로 관리하는 것을 의미한다. 이는 커널의 전역변수 형태 등 커널에서 전역적으로 관리되며 다른 IPC 방식에 비해 사용 방법이 매우 직관적이고 간단하며 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단히 메시지 큐에 접근할 수 있다는 장점이 있다.
공유 메모리를 통해 IPC를 구현할 때 쓰기 및 읽기 빈도가 높으면 동기화 때문에 기능을 구현하는 것이 매우 복잡해지는데, 이때 대안으로 메시지 큐를 사용하기도 한다.
'CS > 운영체제' 카테고리의 다른 글
[CS/운영체제] CPU 스케줄링 (0) | 2024.01.23 |
---|---|
[CS/운영체제] 교착 상태와 기아 상태 (0) | 2024.01.23 |
[CS/운영체제] 스레드 (0) | 2024.01.18 |
[CS/운영체제] 프로세스 (0) | 2024.01.18 |
[CS/운영체제] 동기 I/O와 비동기 I/O (0) | 2024.01.11 |