본문 바로가기

CS/운영체제

Multi Process & Multi Thread ??!

멀티 프로세스? 멀티 스레드?


예전에 써놨던 둘의 차이점

멀티 프로세스 멀티스레드의 차이점

Multi Process(멀티 프로세스)

하나의 프로그램을 여러 프로그램으로 구성하여 각 프로세스가 하나의 작업을 처리한다 이것을 병렬처리라고 한다.

장점

  • 프로세스중 하나에 문제가 발생해도 다른 프로세스에 영향이 없다.(안전성)

단점

  • Context Switching에서의 비용이 크다. 각 프로세스가 자원을 독립적으로 갖고 있어서 각각 비용을 처리해야 하기 때문이다.
  • IPC를 사용한 통신. 프로세스는 독립적인 메모리 공간으로 변수 공유가 되지 않아 IPC를 사용해 통신을 해야한다.

IPC(Inter Process Communication)

프로세스는 독립적(다른 프로세스에게 영향을 받지 않음)으로 실행되며, 독립적 구조를 가진 프로세스 간의 통신을 해야하는 상황이 존재합니다. 이때 사용하는 것이 IPC(Inter Process Communication)입니다.

IPC의 종류

1. 익명 PIPE

  • 파이프는 두 개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있다.
  • 한쪽 방향으로만 통신이 가능한 반이중 통신이라고도 부른다.
  • 매우 간단하게 사용할 수 있는 장점이 있고, 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적이다.
  • 단점으로는 전이중 통신을 위해 2개를 만들어야 할 때는 구현이 복잡해지게 된다.

2. Named PIPE(FIFO)

  • 익명 파이프는 통신할 프로세스를 명확히 알 수 있는 경우에 사용한다. (부모-자식 프로세스 간 통신처럼)
  • Named 파이프는 전혀 모르는 상태의 프로세스들 사이 통신에 사용한다.
  • 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신이 가능하다. (통신을 위해 이름있는 파일을 사용)
  • Named 파이프 역시 읽기/쓰기 동시에 불가능하다.
  • 전이중 통신을 위해서는 익명 파이프처럼 2개를 만들어야 가능

3. Message Queue

  • 입출력 방식은 Named 파이프와 동일함
  • 다른점은 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
  • 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
4. 공유 메모리

파이프, 메시지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비다.

  • 프로세스의 메모리 영역은 독립적으로 가지며 다른 프로세스가 접근하지 못하도록 반드시 보호되야한다.
  • 다른 프로세스가 데이터를 사용하도록 해야하는 상황도 필요하다.
  • 파이프를 이용해 통신을 통해 데이터 전달도 가능하지만, 스레드처럼 메모리를 공유하도록 해준다면 더욱 편함
  • 공유 메모리는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용해준다.
  • 프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 된다.
  • 중개자 없이 곧바로 메모리에 접근할 수 있어서 IPC 중에 가장 빠르게 작동함

5. 메모리 맵

  • 공유 메모리처럼 메모리를 공유합니다.
  • 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다. (즉 공유 매개체가 파일+메모리)
  • 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.

6. 소켓

  • 네트워크 소켓 통신을 통해 데이터를 공유한다.
  • 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
  • 서버(bind, listen, accept), 클라이언트(connect)

이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다. (공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)

reference IPC

규글님


Multi Thread(멀티 스레드)

하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행합니다.

장점

  • 스레드 간의 공유가 쉽다. 이유는 코드 데이터 힙을 공유하기 때문에
  • Context Switching 비용이 적게 든다.

단점

  • 한 스레드에 문제가 발생하면 전체 스레드에 문제가 발생하기 된다.
  • 자원을 공유함에 따라 동기화 문제가 발생하게 된다.(Dead Lock)

예상 질문

멀티 프로세싱과 멀티 스레딩의 차이는 무엇인가요?

멀티 프로세싱은 일반적으로 하나의 프로그램에 대해서 부모 프로세스로 나온 자식 프로세스로 프로그램을 실행하는것
멀티 스레딩은 하나의 프로세스에 대해 여러 스레드가 자원을 공유하면서 실행하는 것입니다.

멀티 스레드의 문제점은요?

오류 발생으로 인해 한 스레드가 죽게되면, 오류가 없던 스레드도 전부 종료될 수 있는 점동기화 문제를 갖고 있습니다.

동기화는 무엇인가요?

한정적인 시스템 자원에 여러 스레드가 동시에 접근해서 사용시 문제가 발생하는 것을 의미합니다.
여러 스레드에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법을 사용해야 합니다.