프로세스와 스레드란?
프로그램
프로그램은 윈도우의 .exe
파일이나 Mac의 .dmg
파일과 같은 컴퓨터에서 실행할 수 있는 파일을 통칭한다.
,단 아직 실행되지 않은 상태의 코드 덩어리를 의미한다.
프로세스
프로세스는 실행 중인 프로그램을 말한다, 모든 프로그램은주소 공간, 파일, 메모리 등 자원이 필요한데 운영체제로부터 이 자원을 할당받은 프로그램을 의미한다.
스레드
스레드는 프로세스 내에서 동시에 진행되는 흐름의 단위이다. 과거에는 프로그램을 실행할 때 하나의 프로세스만 사용했다.
예를 들어, 파일을 다운로드하면 다운로드가 끝날 때까지 다른 작업을 수행할 수 없었다.
기술이 발전하며 프로그램이 점점 더 복잡해지면서 단일 프로세스로는 한계가 있었고, 여러 프로세스를 사용하면 메모리를 낭비하고 CPU 자원을 중복해서 사용했다.
이러한 프로세스의 한계를 해결하기 위해 스레드(Thread)가 도입되었다.
스레드의 예로 우리는 브라우저에서 파일 다운, 온라인 쇼핑, 게임 등 여러 가지 작업을 동시에 할 수 있다.
이 작업을 멀티 스레드(Multi-Thread)라고 한다.
프로세스&스레드의 메모리
프로세스에 할당되는 메모리 영역
프로그램이 실행되어 프로세스가 만들어지면 메모리가 할당되는데, 이 메모리는 4가지 영역으로 구분된다.
💡 스택, 힙 영역 위아래의 화살표는 프로세스가 실행되는 동안 이 두 영역은 크기가 늘어났다 줄어들기도 하는 동적 영역이라는 것을 의미한다.
코드 영역과 데이터 영역은 선언할 때 그 크기가 결정되는 정적 영역이다.
코드 영역
프로세스가 실행할 코드가 기계어 형태로 저장된 공간이다.
데이터 영역
데이터 영역은 전역 변수, static 변수 등이 저장된 공간으로 .data ,.rodata, .bss 영역으로 세분화된다.
- .data : 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장
- .BSS : 초기값없는 전역 변수, static 변수가 저장
- .rodata : const 같은 상수 키워드 선언 된 변수나 문자열 상수가 저장
힙 영역
프로그래머가 관리하는 메모리 영역으로, 생성자나 인스턴스 같은 동적 할당이 이루어지는 곳이다.
스택 영역
지역변수, 매개변수, 리턴값, 복귀 주소 등이 저장되는 공간이다. 즉 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 공간이다.
LIFO 방식에 따라 함수 호출 시 함께 할당되고 종료되면 제거한다.
프로그램이 여러 개 실행된다면 메모리에 각 프로세스의 메모리 공간이 생성되게 된다.
스레드의 자원 공유
스레드는 같은 프로세스 내 다른 스레드와 메모리 영역을 공유할 수 있다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한 것이다.
스레드는 스택 영역만 별도로 할당받고 코드, 데이터, 힙 영역을 다른 스레드와 공유한다.
스택은 함수 호출 시 함께 할당되고 종료되면 제거되는 영역이기 때문에 독립적인 스택을 가졌다는 것은 독립적인 함수 호출이 가능하다는 것을 의미한다.
즉, 스레드는 스택 영역을 통해 독립적인 실행 흐름을 가진다.
또한 프로세스의 코드, 데이터, 힙 메모리 영역을 공유하기 때문에 어떤 스레드에서 오류가 발생하면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
프로세스의 자원 공유
프로세스는 독립적인 메모리 공간을 가지고 있기 때문에 일반적으로 다른 프로세스와 자원을 직접 공유하지 않는다.
하지만 프로세스 간에 데이터를 교환해야 하는 경우 특정 메커니즘을 통해 자원을 공유할 수 있다.
이 방법들을 프로세스 간 통신 (IPC: Inter-Process Communication)이라고 한다.
IPC 메커니즘에는 2가지 방법이 있다.
1. 공유 메모리 (Shared Memory)
- 두 프로세스가 하나의 메모리 영역을 공유하는 방식으로 한 프로세스가 데이터를 메모리 영역에 쓰면 다른 프로세스가 이 데이터를 읽는 구조다.
- 장점: 빠르게 데이터를 교환할 수 있다.
- 단점: 동기화 문제가 발생할 수 있어 이를 해결하기 위한 메커니즘(뮤텍스, 세마포어 등)이 필요하다.
2. 메시지 전달 (Message Passing)
- 프로세스 간에 메시지를 교환하여 데이터를 주고받는 방식이다.
- 예시: 파이프(Pipe), 큐(Queue), 소켓(Socket), 메시지 큐(Message Queue) 등이 있다.
- 장점: 동기화 문제를 줄일 수 있다.
- 단점: 공유 메모리보다 속도가 느릴 수 있다.
멀티 프로세스&멀티 스레드
멀티 프로세스란?
멀티 프로세스는 운영체제에서 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(task)을 처리하도록 하는 것이다.
대표적인 예로 브라우저가 멀티 프로세스 구조를 띄고 있다.
대부분의 브라우저는 탭 브라우징을 지원한다. 만일 브라우저가 멀티 프로세스 구조를 가지지 않는다면, 어떤 탭의 웹 애플리케이션이 비정상 종료되었을 때 다른 모든 탭을 포함한 전체 프로세스가 종료될 것이다.
구글의 크롬 브라우저는 멀티 프로세스 구조를 가지고 있다. 브라우저의 각 탭은 (Renderer) 프로세스이며, 이들은 각자 독립적으로 실행된다. 하나의 웹 사이트가 비정상 종료되어도 다른 (Renderer) 프로세스는 영향을 받지 않는다.
CPU에서는 이런 과정을 컨텍스트 스위칭을 통해 여러 프로세스를 돌아가면서 작업을 처리한다.
컨텍스트 스위칭(Context-Switching)
컨텍스트 스위칭이란 CPU 코어를 다른 프로세스로 전환하기 위해 현재 프로세스의 상태를 저장하고, 다른 프로세스의 상태를 복원하는 작업을 말한다.
위의 동시성파트에서 다뤘듯이 CPU는 한 번에 하나의 프로세스만 실행할 수 있으므로 여러 개의 프로세스를 번갈아가며 실행해 CPU 활용률을 높이기 위해 컨텍스트 스위칭이 필요한 것이다.
Context란 CPU가 프로세스를 실행하기 위한 정보를 말하며 이 정보들은 PCB라는 곳에 저장되어 있다.
멀티 프로세스의 장점
독립적인 메모리 영역을 가지기 때문에 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향이 가지 않아 안전성이 높다.
멀티 프로세스의 단점
또한 독립된 메모리 영역을 가지고 있기 때문에 Context Switching 오버헤드(캐시 초기화 등)가 발생한다.
컨텍스트 스위칭 오버헤드
오버헤드(overhead)란 추가적인 부하를 말한다.
컨텍스트 스위칭 과정은 사용자로금 빠른 반응성과 동시성을 제공하지만, 그 과정에서 프로세스의 상태나 레지스터 값 등이 저장되고 불러오는 작업이 수행되기 때문에 시스템에 추가적인 부하가 발생한다.
프로세스 A가 Execute -> Idel이 될 때 프로세스 B가 바로 Execute되지 않고 중간에 간극이 발생하는데 이 부분이 바로 컨텍스트 스위칭 오버헤드인 것이다.
PCB(Process Control Block)
컨텍스트 스위칭 할 때 현재 프로세스의 상태를 저장하고 새롭게 실행할 프로세스의 상태를 알아야 어디서부터 다시 작업을 시작할지 결정할 수 있을 것이다.
이 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보가 담긴 공간이 PCB다.
프로세스 생성과 동시에 그 프로세스의 고유한 PCB도 함께 생성된다.
PCB에 저장되는 정보는 다음과 같다. 다 외울 필요는 없지만 PID, 프로세스 상태, 프로그램 카운터, CPU 레지스터 정도는 기억해 두자.
- 프로세스 식별자 (Process ID, PID) : 프로세스의 고유한 ID
- 프로세스 상태 (Process state) : new, ready, running, waiting, terminated
- 프로그램 카운터 (Program counter) : 프로세스가 다음에 실행할 명령어의 주소를 가리킴
- CPU 레지스터 : Accumulator, Index Register, 범용 레지스터 등
- CPU 스케줄링 정보 : 프로세스 우선순위, 최종 실행 시각, CPU 점유 시간 등
- 메모리 관리 정보 : Page table, Segment table 등
- 계정 정보 : CPU 사용 시간, 제한 시간, 계정 번호 등
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치, 개방된 파일 목록 등
프로세스의 상태
프로세스가 생성되어 실행하기까지 프로세스는 여러 가지의 상태를 갖게 되고, 상태의 변화에 따라 프로세스가 동작된다.
- New : 프로세스가 생성됨, 아직 준비되지 않은 상태
- Ready : 프로세스가 실행을 위해 기다리는 상태
- Running : 프로세서가 CPU를 할당받아 실행되는 상태
- Waiting : (I/O 작업 완료나 신호 수신과 같은) 이벤트가 발생하여 대기하는 상태
- Terminated : 프로세스가 실행을 완료하고 종료된 상태
운영체제는 프로세스의 상태를 기반으로 스케줄링을 통해 프로세스를 관리하고 제어한다
멀티 프로세스의 통신 방법
독립된 메모리 영역에서 프로세스끼리 어떻게 통신할까?
데이터를 교환하기 위해서 IPC (Inter-Process Communication) 메커니즘이 필요하다.
IPC에는 공유 메모리 (shared memory)와 메시지 전달 (message passing)의 두 가지 모델이 있다.
- 공유 메모리 : 프로세스가 공유하는 메모리 영역이 설정되며, 각 프로세스는 공유 영역에서 데이터를 읽고 쓰는 방식으로 정보를 교환할 수 있다.
- 메시지 전달 : 프로세스 간 메시지를 교환하며 통신한다.
멀티 스레드란?
멀티 스레드란 한 프로세스 안에 여러 개의 스레드가 있는 것을 말한다. 하나의 프로그램에서 두 가지 이상의 동작을 동시에 처리하는 행위가 가능해진다.
멀티 프로세스가 웹 브라우저에서 여러 탭이나 창이라고 했다면, 멀티 스레드는 단일 탭 또는 창 내에서 어떤 스레드는 이미지를 보여주고 어떤 스레드는 네트워크를 통해 데이터를 검색하는 거라고 말할 수 있다.
멀티 스레드의 장점
- 자원의 효율성
스레드는 프로세스 내 자원을 공유하기 때문에 그렇기에 효율적으로 자원을 관리할 수 있어 성능이 향상된다. - 빠른 Context Switching
프로세스는 독립적인 메모리 공간을 사용하지만, 스레드는 공유하는 자원을 제외하고 본인의 정보(stack, register)만 교체하면 되므로 전환이 빠르게 이루어진다. - 응답성이 좋다.
멀티 스레드를 사용하면 파일을 다운로드하면서 사용자 인터페이스가 여전히 반응할 수 있다. 하나의 스레드가 오래 걸리는 작업을 수행하는 동안 다른 스레드는 사용자 입력을 처리할 수 있어 프로그램이 "멈춘" 것처럼 보이지 않게 된다.
외에도 정리하자면 멀티스레드는 병렬 처리를 통해 성능을 높이고, 응답성을 개선하며, 자원을 효율적으로 공유할 수 있는 장점이 있다.
또한, 작업을 분할하고 비동기 처리를 쉽게 구현할 수 있으며 빠른 컨텍스트 스위칭 덕분에 전체적인 프로그램 효율이 향상된다.
멀티 스레드의 단점
- 동기화 문제
여러 개의 스레드가 자원을 공유하기 때문에 동기화 문제가 발생할 수 있다.
경쟁 상태를 예방하기 위해 동기화 메커니즘(뮤텍스, 세마포어)등을 사용해야 한다. - 안전성 문제
또한 자원을 공유하기 때문에 하나의 스레드에서 문제가 발생하면 다른 스레드에 영향이 가 프로그램이 종료될 수 있다. - 설계가 복잡하다.
1, 2번의 이유로 설계가 복잡해 개발 비용과 시간이 증가할 수 있다.
참고
완전히 정복하는 프로세스 vs 스레드 개념
Operating System (운영체제)
멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리
'👶🏻 CS > Operating System' 카테고리의 다른 글
교착상태와 해결법 (0) | 2024.11.15 |
---|---|
캐시 (0) | 2024.11.12 |
Concurrent(동시성) vs Parallel(병렬성) (0) | 2024.11.09 |
가상메모리와 페이지 교체 알고리즘 (0) | 2024.11.08 |
임계 구역(Critical Section)과 뮤텍스, 세마포어, 모니터 (0) | 2024.11.01 |
Sync&Async, Blocking&Non-Blocking (0) | 2024.10.31 |