멀티 프로세싱
멀티 프로세싱: 하나의 시스템에서 여러 개의 프로세서(Processor: CPU) 사용하여 동시에 일을 수행하는 방식
-> 하드웨어 관점으로 여러 개의 프로세서로 작업을 처리하는 것을 의미
여러 개의 프로세서가 동시에 작업을 처리하므로, 전체적인 처리 속도가 빨라진다. (병렬성)
좌 - 여러 개의 CPU(프로세서)로 한가지 작업에 대해 병렬적으로 수행
우 - 여러 개의 CPU(프로세서)로 여러 가지 작업에 대해 병렬적으로 수행
멀티프로세싱과 주로 언급되는 것은 멀티 태스킹이다.
멀티 태스킹이란?
단일 CPU에서 여러 개의 작업을 동시에 처리하는 것 처럼 일을 수행하는 방식
멀티 프로세스와 멀티 프로세싱에 대한 개념의 차이는 어디에 집중하느냐에 대한 관점의 차이인것 같음.
단순히 멀티 프로세싱은 여러 개의 CPU가 동시에 작업하는 관점이고
멀티 프로세스는 하나의 응용 프로그램에서 여러 개의 프로세스로 분리해서 작업을 하는 관점인 것 같다 .. (?)
결국 1개의 CPU(1개가 아니여도)에 2개의 프로세스가 진행되면 멀티 프로세스
2개 이상의 CPU로 2개 이상의 프로세스가 진행되면 멀티 프로세싱 인 것 같다.
멀티 프로세스
멀티 프로세스: 하나의 응용 프로그램에서 여러 개의 프로세스로 분리하여 실행하는 것을 의미
여러 개의 프로세스가 동시에 실행되므로, 하나의 프로세스가 죽어도 프로그램이 죽지않아 프로그램 전체의 안정성이 높아짐
보통 하나의 응용 프로그램 실행에 대해 하나의 프로세스 메모리가 생성된다.
처음 생성 된 프로세스는 여러 작업을 수행하기 위해 운영체제에 다른 프로세스를 실행하라고 요청할 수 있다. 그러면 메모리의 다른 부분이 새 프로세스에 할당된다.
이때 처음 생성된 프로세스가 부모 프로세스,
그것에 의해 생성된 다른 프로세스들이 자식 프로세스가 된다.
장점
- 프로그램 안전성: 하나 이상의 일을 병렬로 처리할 수 있을 때 특정 프로세스의 메모리, 프로세스 중 일부에 문제가 발생되더라도 다른 프로세스를 이용해서 처리할 수 있어 신뢰성 및 안전성이 높음.
- 시스템 확장성: 각 프로세스가 독립적이므로 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향을 주지 않음. 시스템의 규모를 쉽게 확장할 수 있다.
예시 > 대규모 웹 서비스에서의 분산 서버(개념적): 여러 대의 서버(하나의 성능 좋은 컴퓨터에 여러 개의 서버 프로세스를 두는 것)를 두고 로드 밸런서와 같은 장비를 사용하여 클라이언트 요청 트래픽을 분산 시키는 것
단점
- 컨텍스트 스위칭(Context Switching) 오버헤드: 프로세스는 스레드보다 무거워 컨텍스트 스위칭 과정에서 성능 저하 문제
- 자원 공유 비효율성: 각 프로세스가 독립적인 메모리 공간을 가지므로 메모리 사용량이 증가하며 자원공유가 필요할때 프로세스 사이에서는 반드시 IPC를 사용해야함.
멀티 프로세스의 예시 : 크롬 웹 브라우저
다른 웹 브라우저의 아키텍처

- 좌: 스레드를 많이 사용하는 단일 프로세스로 사용하는 아키텍처
- 우: 스레드를 조금 사용하는 각 프로세스를 여러 개사용하는 아키텍처
브라우저 UI에서 각 프로세서가 담당하는 부분은 위 이미지와 같다.
브라우저 프로세스: 주소 표시줄, 북마크 막대, 뒤로 가기 버튼, 앞으로 가기 버튼 등을 담당하고 네트워크 요청이나 파일 접근 같은 권한을 담당
렌더러 프로세스: 웹사이트가 보이는 부분의 모든 것을 제어(보통 탭 단위로 멀티 프로세스 구조이기 때문에 여러개의 렌더러 프로세스가 존재한다고 생각)
플러그인 프로세스: 웹사이트에서 사용하는 플로그인 제어
GPU 프로세스: GPU를 이용해서 화면을 그리는 부분 제어
IPC (Inter Process Communication)
IPC: 서로 다른 프로세스끼리 통신하기 위해서 반드시 필요한 기법
IPC는 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐.
IPC는 커널 공간에서 이루어진다 -> 왜? 커널 공간에서 프로세스가 공유되기 때문
IPC의 종류
1. 공유 메모리
2. 파일
3. 소켓
4. 익명 파이프
5. 명명 파이프
6. 메시지 큐
공유메모리
여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 메모리를 생성해서 통신하는 것
파일
파일: 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
이런 데이터를 기반으로 하는 프로세스 간 통신
소켓
동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미하며 TCP, UDP가 존재함.
익명 파이프
프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받는 통신.
단방향 방식의 읽기 및 쓰기 전용 파이프를 만들어 작동함.
명명 파이프
파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신. 양방향 파이프 혹은 명명된 단방향을 의미함.
클라이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용할 수 있음.
컴퓨터의 프로세스끼리 또는 다른 네트워크 상의 컴퓨터와도 통신이 가능함.
메시지 큐
데이터 구조인 큐(queue)로 메시지를 관리하는 것을 의미함.
커널의 전역변수 형태 등 커널에서 전역적으로 관리되고 다른 IPC 방식에 비해서 사용 방법이 매우 직관적이고 간단하고 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단하게 메시지 큐에 접근할 수 있는 장점이 있음.
공유 메모리로 IPC를 구현하다가 보통 쓰기 및 읽기 빈도가 높을 때 동기화 문제가 발생하는데,
이때의 대안으로 사용하기도함.
스레드와 멀티스레딩
스레드: 프로세스의 실행 가능한 가장 작은 단위
하나의 프로세스는 여러 스레드를 가질 수 있다. -> 멀티 스레드 기반 프로세스
멀티스레딩: 프로세스 내 작업을 여러 개의 스레드, 멀티 스레드로 처리하는 기법
장점
- 프로세스와 달리 스레드는 자원(모니터, 프린터, 메모리, 파일 데이터 등의 자원이나 변수)을 서로 공유하기 때문에 병렬성이 향상 됨(효율성이 높음)
- 한 스레드가 중단(blocked)되어도 다른 스레드는 실행(running) 상태일 수 있기 때문에 중단 되지 않은 빠른 처리 가능
- 프로세스보다는 동시성에 장점이 존재
동시성과 병렬성 ?
동시성 | 병렬성 |
논리적인 개념 - 동시에 실행되는 것 같이 보이는 것 |
물리적인 개념 - 실제로 동시에 여러 작업이 처리되는 것 |
싱글 코어에서 멀티 스레드를 동작 시키는 방식 | 멀티 코어에서 멀티 스레드를 동작시키는 방식 |
한번에 많은 것을 처리 | 한번에 많은 일을 처리 |
- Sequantial: 싱글코어에서 순차적으로 실행되는 모습
- Concurrent: 싱글 코어(CPU)에서 멀티 스레드를 동작시키는 방식 (동시성)
- Parallel: 멀티 코어(CPU)에서 멀티 스레드를 동작시키는 방식(병렬성)
동시성: 실제 작업의 흐름은 한 가닥이지만 여러 작업을 번갈아가면서 조금씩 수행하기에
마치 동시에 진행되는 것 처럼 보인다.
작업 전환 시 Context Switching 발생(비용 발생)
병렬성: 실제로 동시에 작업이 진행 됨
단점
- 한 스레드에 문제가 생기면 다르스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스 자체에 영향을 줄 수 있음
멀티스레드의 예시 > 웹 브라우저의 렌더러 프로세스
웹 브라우저의 렌더러 프로세스 안에는 메인스레드, 워커 스레드, 컴포지터 스레드, 레스터 스레드가 존재함.
공유 자원과 임계 영역
공유 자원
공유 자원:
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등을 의미
경쟁 상태(race condition): 공유 자원을 두 개 이상의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태
경쟁상태 중 문제가 되는 상황 예시 > A 코인이 100개 존재하는 처음 상태에서 프로세스 1, 프로세스 2가 동시에 갯수 확인 -> A 코인 100개 추가하는 로직을 실행할 때 결과가 300이 아닌 200이 나오는 상황
임계 영역
임계 영역(critical section):
- 두 개 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
이전의 A 코인 예시에서 임계 영역은 A 코인의 값 조회 -> A 코인 100개 추가하는 구간이 임계영역이라고 할 수 있다.
이 임계 영역을 해결하기 위한 방법은 크게 3가지가 존재한다.
1. 뮤텍스
2. 세마포어
3. 모니터
이 세 가지 해결법의 공통점은
프로세스1(or 스레드1)가 임계 영역에 들어가게 되면
프로세스2(or 스레드2)가 들어오지 못하도록 lock을 거는것이다.
교착상태
교착 상태(deadlock): 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
교착상태의 원인
- 상호 배제: 한 프로세스가 자원을 독점하고 있고 다른 프로세스가 접근이 불가능한 상태
- 점유 대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점: 다른 프로세스의 자원을 강제적으로 가져올 수 없는 상태
- 환형 대기: 프로세스 A는 프로세스 B의 자원을 요구하고 프로세스 B는 프로세스 A의 자원을 요구하는 상황,
서로가 서로의 자원을 요구하는 상황을 말함.
교착상태의 해결방안
1. 자원을 할당할 때 애초에 교착상태의 원인이 성립되지 않도록 설계
2. 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘'을 씀
3. 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지움
4. 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 크므로, 교착 상태가 발생시 사용자가 작업을 종료하게 함. (현대 운영체제가 채택한 방법. 예시 > 프로세스를 실행시키다 '응답없음'이라고 뜨는 것)
은행원 알고리즘: 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 뗘는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘
참고 블로그
'CS > 운영체제' 카테고리의 다른 글
[운영체제 OS] CPU 스케줄링 알고리즘 (2) | 2024.02.15 |
---|---|
[운영체제 OS] 운영체제와 컴퓨터 (1) | 2024.02.08 |