본문 바로가기
cs/면접을 위한 CS 전공지식 노트

3-3. 프로세스와 스레드(2): 멀티프로세싱

by 이쟝 2022. 10. 14.
더보기

3-5. 멀티프로세싱(Multi-processing)

멀티프로세싱 == 다수의 '프로세서'가 서로 협력적으로 일을 처리하는 것, 즉 멀티프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있다.(여러 개의 프로세서가 작업을 병렬 처리)

프로세서  CPU나 Microprocessor라는 하드웨어
프로세스 실제 메모리에 적재되어 프로세서에 의해 실행되고 있는 프로그램 (작업:Task)

 

멀티프로세싱

보통 하나의 프로세서(CPU)가 하나의 작업을 맡지만 멀티 프로세싱은 다수의 프로세서가 다수의 작업을 함께 처리한다.

여러 개의 단일 프로세싱보다 비용 절약 가능 신뢰성의 증가
여러 개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용한다면 하나의 공간에 데이터를 저장한 후 이를 공유하여 사용하도록 한다. 하나의 프로세서가 고장이 나더라도 해당 프로세서가 진행 중인 작업은 다른 프로세서에서 수행하고 있어서 작업이 정지되지 않는다.

1. 웹 브라우저

웹 브라우저의 구조: 멀티프로세스 구조

브라우저 프로세스 주소 표시줄, 북마크 막대, 뒤로가기 버튼, 앞으로 가기 버튼 등을 담당
네트워크 요청이나 파일 접근 같은 권한을 담당
렌더러 프로세스 웹 사이트가 '보이는' 부분의 모든 것을 제어
플러그인 프로세스 웹 사이트에서 사용하는 플러그인을 제어
GPU 프로세스 GPU(Graphics Processing Unit)를 이용해서 화면을 그리는 부분을 제어

 

브라우저 UI의 다른 부분들을 담당하는 각자 다른 프로세스들

2. IPC(Inter Process Communication)

프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘, 멀티프로세스는 IPC가 가능

IPC == 프로세스 간 통신

  • ex) 클라이언트는 데이터를 요청하고 서버는 클라이언트 요청에 응답하는 것
  • IPC의 종류들은 모두 메모리가 완전히 공유되는 스레드보다는 속도가 떨어진다.

 

위그림처럼 프로세스완전히 독립된 실행객체이다.
서로 독립되어 있다는 것은 다른 프로세스의 영향을 받지 않는다는 장점이 있지만 독립되어 있는 만큼 별도의 설비가 없이는 서로간에 통신이 어렵다는 문제가 있다. 
이를 위해서 커널 영역에서 IPC라는 내부 프로세스 간 통신을 제공하게 되고, 프로세스는 커널이 제공하는 IPC설비를 이용해서 프로세스간 통신을 할 수 있게 된다.

커널: 메모리에 상주하는 부분, 운영체제의 핵심적인 부분

IPC가 필요한 이유(프로세스 간 통신이 필요한 이유)

정보 공유
(Information Sharing)
여러 사용자가 동일한 정보에 엑세스를 할 필요가 있을 수 있다.
가속화
(Computation Speed-up) 
특정 작업(task)을 여러 개의 서브 작업(sub-task)로 나누어 프로세스의 병렬성을 키움으로써 처리 속도를 높일 수 있다.
이 때 메인 작업과 서브 작업은 서로 통신의 필요성이 생긴다.
모듈화
(Modularity)
특정한 시스템 기능을 별도의 프로세스(스레드)로 구분해 모듈화된 시스템을 구성할 수 있다.
이 때 모듈간의 통신이 필요하다.
편의성(Convenience) 다수의 사용자가 동시에 여러가지 작업을 수행할 수 있다.

IPC의 종류

공유 메모리 파일 소켓 익명 파이프 명명 파이프 메시지 큐

공유 메모리(shared memory)

프로세스끼리 특정 공통의 메모리 영역을 공유하며 상호간 통신하는 방 법

  • 데이터 자체를 공유하도록 지원하며, 한 프로세스에서 변경한 메모리의 내용을 공유메모리를 통해 다른 프로세스에서 접근할 수 있다. 
  • 공유 메모리는 커널에서 관리된다. 
  • IPC 방식 중 어떠한 매개체를 통해 데이터를 주고받는 것이 아닌 메모리 자체를 공유하기 때문에 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르다.
  • 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요하다.
  • 하드웨어 관점에서 공유 메모리는 CPU가 접근할 수 있는 큰 랜덤 접근 메모리인 RAM을 가리키기도 한다.

파일

디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터, 이를 기반으로 프로세스 간 통신을 한다.

소켓

동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터

  • 프로세스들 사이의 통신을 가능하게 한다.
  • TCP와 UCP가 있다.

익명 파이프(unamed pipe)

프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식

  • 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 한다.
  • 만약 읽기와 쓰기, 즉 송/수신을 모두 하기 원한다면 두개의 파이프를 만들어야만 가능해진다.(구현이 꽤나 복잡해질 수 있다.) 
  • 익명 파이프는 통신을 할 프로세스가 명확하게 알 수 있는 경우 사용한다. (ex 부모, 자식 프로세스 간에만 사용할 수 있고 다른 네트워크상에서는 사용이 불가능)

PIPE

명명된 파이프(named pipe)

이름을 가진 PIPE를 통해서 프로세스들 간에 단방향 통신을 지원한다. 서로 다른 프로세스들이 PIPE의 이름만 알면 통신이 가능하다. 

  • 명명된 파이프는 전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용한다.(ex 컴퓨터의 프로세스끼리 또는 다른 네트워크상의 컴퓨터와도 통신을 할 수 있음) => 부모 프로세스와 무관하게 전혀 다른 프로세스들 사이에서 통신 가능(프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문)
  • PIPE의 단점인 읽기/쓰기가 동시에 가능하지 않고, read-only, write-only만 가능하다. 전이중 통신을 위해서는 결국 두개의 FIFO 파일이 필요하게 된다. 

Named pipe
명명된 파이프

위의 그림처럼 보통 서버용 파이프와 클라이언트용 파이프로 구분해서 작동해 하나의 인스턴스를 열거나 여러 개의 인스턴스를 기반으로 통신한다. 

메시지 큐(message queue)

메시지를 큐(queue) 데이터 구조 형태로 관리하는 것, 메모리를 사용한 PIPE

  • 커널에서 관리되며 다른 IPC 방식에 비해서 사용 방법이 매우 직관적이고 간단하며 다른 코드의 수정 없이 몇 줄의 코드를 추가해 간단하게 메시지 큐에 접근할 수 있다.
  • 메시지 type에 의해서 여러종류의 메시지를 효과적으로 다룰 수있다. 
  • 공유 메모리를 통해 IPC를 구현할 때 동기화 때문에 기능을 구현하는 것이 매우 복잡해지는데, 대안으로 메시지 큐를 사용하기도 한다.
큐(queue) 구조: 선입선출(FIFO, 먼저 들어간게 먼저 나온다.)
  1. 하나의 메시지 큐 서버가 커널에 요청해서 메시지큐를 작성
  2. 매시지 큐의 접근자(식별자)를 아는 모든 프로세서는 동일한 메시지큐에 접근함으로써, 데이터를 공유할 수 있게 된다.

3-6. 스레드와 멀티스레딩

1. 스레드

프로세스가 할당받은 자원을 이용하는 실행의 단위(프로세스 안에서 실행되는 흐름의 단위)

  • 프로세스는 여러 스레드를 가질 수 있다.(프로세스 안에서 주소나 데이터를 스레드 간에 공유하면서 실행)
  • 코드, 데이터, 스택, 힙을 각각 생성하는 프로세스와 달리 스레드는 코드, 데이터, 힙은 스레드끼리 서로 공유하고 그 외의 영역은 각각 생성된다. 
  • 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 고유한 스레드 ID, 프로그램 카운터, 레지스터, 집합, 스택을 가지고 있다.
  • 스레드가 존재함으로써 데이터와 같은 자원을 메모리에 할당하는 동작이 줄어들어서 프로세스의 자원을 효율적으로 관리하고 운영 가능
  • ex) 크롬 브라우저(=프로세스)에서 티로그 작성하기(=스레드1) & 유튜브로 음악듣기=스레드2)

 

스레드

2. 멀티스레딩(Multi threading) 

프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법

  • 스레드간의 자원을 공유해서 효율성이 높고, 자원의 생성과 관리의 중복성을 최소화 한다.
  • ex) 웹 요청을 처리할 때 새 프로세스를 생성하는 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비하며, 한 스레드가 중단(blocked)되어도 다른 스레드는 실행(running) 상태일 수 있기 때문에 중단되지 않은 빠른 처리가 가능하다.
  • 멀티 스테드는 컨텍스트 스위칭(Context Switching)으르 통해서 이뤄진다. (하나의 스레드에서 다음 스레드로 이동을 하면서 컨텍스트 스위칭이 일어나고, 부분적으로 조금씩 각각의 스레드에 대한 작업을 끝내게 된다. => 즉 Context Switching이 엄청 빠르게 일어나면서, 유저에게는 프로그램들이 동시에 수행되는 것처럼 보인다.)
  • 에러 발생시 새로운 스레드를 생성해서 극복하지만, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용이 발생한다.(싱글 스레드는 프로그램 일부분이 중단되거나, 에러가 발생하면 프로그램이 멈춤)
장점 단점
동시성: 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다.
응답성: 프로그램의 일부분(스레드 중 하나)이 중단되거나 긴 작업을 수행해도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가 공유하는 자원에 동시에 접근할 때, 프로세스와 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 동기화가 필요하다.
경제성 : 프로세스 내 자원들과 메모리를 공유해서 메모리 공간과 시스템 자원 소모가 줄어든다. (프로세스의 Context Switching과 달리 스레드 간의 Context Switching은 캐시 메모리를 비울 필요가 없어서 더 빠르다.) 멀티 스레딩을 위해서는 운영체제의 지원이 필요하다. 
멀티프로세서의 활용: 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있어서 병렬성이 증가한다.
멀티 스레드 모델은 프로그래밍 난이도가 높다. 또 스레드 수만큼 자원을 많이 사용한다. 

멀티스레드의 예: 웹 브라우저의 렌더러 프로세스

  • 렌더러 프로세스의 주요 역할: HTML과 CSS, JavaScript를 사용자와 상호작용을 할 수 있는 웹 페이지로 변환하는 것
  • 렌더러 프로세스의 메인 스레드가 브라우저로 전송된 대부분의 코드를 처리
  • 웹 워커나 서비스워커를 사용하는 경우에 워커 스레드가 JavaScript 코드의 일부를 처리
  • 웹 페이지를 효율적이고 부드럽게 렌더링 하기 위해 별도의 컴포지터 스레드래스터 스레드가 실행

멀티 스레딩(Multi-threading)과 멀티 프로세싱(Multi-processing)의 차이

멀티 스레딩 멀티 프로세싱
하나의 프로그램 안에서 병렬 처리의 이점을 보는 것 여러 개의 프로그램들을 병렬로 처리할 수 있는 것
멀티 프로세스보다 적은 메모리 공간 차지, Context-Switching 시 비용이 덜들어 응답 시간이 그만큼 빠르다.  하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 정상적으로 수행되는 안정성 확보
하나의 스레드에 문제가 생기면 전체 프로세스에 영향을 끼칠 수 있고, 프로세스의 스택을 제외한 다른 자원을 공유하기 때문에 동기화 문제도 있다. 많은 메모리 공간과 CPU 시간을 차지하고 Context Switching시 여러 무거운 작업들을 동반하며 비용이 많이 소요되어 응답 속도가 느려진다.

3-7. 공유 자원과 임계 영역

1. 공유 자원(shared resource)

시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수(여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등)

  • 공동으로 사용되기에 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있다.
경쟁 상태(race condition): 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
- 데이터의 일관성을 유지하기 위해서 수행되는 프로세스들이 순차적으로 공유자원에 접근해야 한다.

ex) 공유 자원 예시

프로세스 A와 프로세스 B가 동시에 접근해 타이밍이 서로 꼬여 정상 결괏값은 25인데 20이 출력된다.

공유 자원 예시

 

2. 임계 영역(critical section)

둘 이상의 프로세스 또는 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 '코드' 영역(위의 공유 자원 예시에서 balacn(예금)부분)

  • 한 번에 오직 하나의 프로세스만이 임계구역에 진입해야 한다.

임계 구역 해결 조건들 

임계 영역을 해결하기 위한 방법: (1) 뮤텍스, (2) 세마포어, (3) 모니터 이 모든 방법은 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족한다.

  • 이 방법에 토대가 되는 메커니즘: 잠금(lock)
  • ex) 임계 구역을 화장실이라고 가정하면 화장실에 A라는 사람이 들어간 다음 문을 잠근다. 그리고 다음 사람이 이를 기다리다 A가 나오면 화장실을 쓸 수 있다.

 

상호 배제(Mutual Exclusion) 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음
데이터의 일관성을 유지하기 위해 필요
한정 대기(Bounded Waiting)

특정 프로세스가 무한 대기하지 않아야 함
한 프로세스가 긴 시간 동안 실행되지 않는 문제를 해결하기 위해 필요 
진행의 융통성 한 프로세스가 다른 프로세스의 진행을 방해해서는 안됨

뮤텍스(mutex)

공유 자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금(상호 배제를 위한 방법)

  • 스레드가 공유 자원을 lock()을 통해 잠금설정하고 사용한 후에 unlock()을 통해 잠금해제하는 객체이다. 
  • 잠금이 설정되면 다른 프로세스나 스레드는 해당 공유 자원에 접근할 수 없다.
  • 뮤텍스는 하나의 상태(잠금 또는 잠금 해제)만 가진다.

뮤텍스

세마포어(semaphore)

일반화된 뮤텍스로 간단한 정수 값과 두 가지 함수 wait(P 함수라고도 함) 및 signal(V 함수라고도 함)로 공유 자원에 대한 접근을 처리한다. 즉, 프로세스가 작업을 마치면 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보낸다.

  • 세마포어의 정수값은 공유자원에 접근할 수 있는 프로세스 혹은 쓰레드의 최대 허용치이다. 만약 정수값이 3이라면, 최대 3개의 프로세스가 공유 자원에 접근할 수 있다.
  • 프로세스가 공유 자원에 접근하면 세마포어에서 wait( )작업을 수행하고 프로세스가 공유 자원을 해제하면 세마포어에서 signal( )작업을 수행한다.

 

wait( ) 자신의 차례가 올 때까지 기다리는 함수 signal( ) 다음 프로세스로 순서를 넘겨주는 함수
  1. 프로세스가 공유 자원에 접근할 때 wait( )함수를 실행한다.
  2. wait( )함수는 세마포어 정수의 값을 1 감소시킨다. 
  3. 감소된 세마포어 정수가 음수라면, 해당 프로세스는 세마포어 대기열에서 기다려야 한다.
  4. 프로세스가 공유 자원을 모두 사용하고 임계 구역에서 벗어날 때 signal( )함수를 실행한다.
  5. signal( )함수를 실행하면 세마포어 정수를 1 증가시킨다.
  6. 세마포어 대기열에서 기다리고 있는 맨 앞의 프로세스 하나를 깨워 공유 자원을 허용케한다. 

세마포어

뮤텍스와의 차이점

뮤텍스 세마포어
한 개의 프로세스 또는 스레드만의 임계영역접근을 처리한다. 여러 개의 임계영역접근을 처리할 수 있다.
조건변수가 없고 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없다.

세마포어 정수의 크기에 따라 바이너리 세마포어와 계수(카운팅) 세마포어로 나뉜다.

바이너리 세마포어(Binary Semaphore)  카운팅 세마포어(Counting Semaphore)
세마포어 정수를 0과 1의 로만 가질 수 있는 세마포어 (1보다 큰)여러 개의 세마포어 정수를 가질 수 있는 세마포어
구현의 유사성으로 인해 뮤텍스는 바이너리 세마포어라고 할 수 있지만

뮤텍스 리소스에 대한 접근을 동기화하는 데 사용되는 잠금 메커니즘이 들어간 객체고, 세마포어신호를 기반으로 상호 배제가 일어나는 신호 메커니즘이 들어간 객체
여러 자원에 대한 접근을 제어하는 데 사용된다. 
ex) 휴대폰으로 노래를 듣다가 전화가 오면 노래가 중지되고 통화 처리 작업에 관한 인터페이스가 등장하는 것 => 신호 메커니즘

모니터(Monitor)

둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공

  • 모니터는 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리한다.
  • 세마포어보다 구현하기 쉽고, 모니터에서 상호 배제는 자동인 반면에, 세마포어에서는 상호 배제를 명시적으로 구현해야 하는 차이점이 있다.
  • 따라서 모니터를 사용하면 상호 배제를 세마포어에 비해 구현하기 쉽고 실수가 줄어든다.(세마포어에 비해 고수준)

 

모니터


3-8. 교착 상태(deadlock)

두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태

  • ex) 프로세스 A가 프로세스 B의 어떤 자원을 요청할 때 프로세스 B도 프로세스 A가 점유하고 있는 자원을 요청하는 것
  • 교착상태가 발생하면 모든 프로세스가 중지하는 현상이 생기기 때문에 큰 문제가 생긴다.

1. 교착 상태의 원인

아래 4가지 조건이 모두 만족하면 교착상태가 발생한다.

상호 배제(Mutual Exclusion) 한 프로세스가 자원을 독점하고 있으며 다른 프로세스는 접근이 불가능
점유 대기(Hold and Wait) 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
비선점(No preemption) 임의의 프로세스가 자원을 할당 받은 상태에서 다른 프로세스는 이 자원을 강제적으로 가져올 수 없음
환형대기(Circular Wait) 프로세스의 자원 할당에서 첫 번째 프로세스와 마지막 프로세스의 자원할당이 겹치게 되어 원형에 있는 모든 프로세스가 자원 할당을 받고자 기다리는 형태가 만들어지는 것
프로세스A가 프로세스B의 자원을 요구하고 프로세스 B는 프로세스 A의 자원을 요구하는 것

2. 교착 상태의 해결 방법

  1. 자원을 할당할 때 애초에 위의 4가지 조건이 성립되지 않도록 설계한다.
  2. 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스 당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘'을 쓴다.
  3. 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지운다.
  4. 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서 교착 상태가 발생하면 사용자가 작업을 종료한다. 현대 운영체제는 이 방법을 선택했다. ex) 프로세스를 실행시키다 '응답 없음'이라고 뜰 때 == 교착상태가 발생한 경우
은행원 알고리즘 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘

 


 

운영체제 #1 스레드와 프로세스

 

크롬 브라우저의 작동 방법

 

IPC란?

 

IPC 종류와 특징

 

[프로세스간 통신] IPC 종류

멀티프로세싱과 멀티스레딩 그리고 IPC

 

싱글스레드 vs 멀티스레드

렌더러 프로세스의 내부 동작

공유자원과 임계구역

[OS] 공유자원과 임계구역

경쟁상태, 임계영역의 개념과 동기화를 위한 여러 상호배제 기법

교착상태