1. 프로세스와 스레드
▪프로세스: 운영체제로부터 자원을 할당받은 작업의 단위.
▪스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.
프로그램 → 프로세스
먼저 프로세스와 스레드에 대해 본격적으로 설명하기 전에 프로그램에 대해서 설명하고 가야 한다.
- 프로그램이란, 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 '정적인 상태'의 파일을 말한다.
ex) 윈도우의 *.exe 파일이나 MacOS의 *.dmg 파일 등등 사용자가 눌러서 실행하기 전의 파일을 말한다 - 프로세스는 프로그램이 실행되서 돌아가고 있는 상태, 컴퓨터에서 연속적으로 실행되고 있는 '동적인 상태'의 컴퓨터 프로그램이다.
즉, 프로그램이 운영체제로부터 실행에 필요한 자원을 할당받아 프로세스가 되는 것이다.
프로세스 → 스레드
과거에는 프로그램을 실행할 때 실행 시작부터 실행 끝까지 프로세스 하나만을 사용해서 진행했다고 한다. 하지만 시간이 흐를수록 프로그램이 복잡해지고 프로세스 하나만을 사용해서 프로그램을 실행하기는 벅차게 되었다.
그래서 프로세스와는 다른 더 작은 실행 단위 개념이 필요하게 되었고, 이 개념이 바로 스레드다.
스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다.
프로세스와 스레드의 작동 방식에 대한 더 자세한 설명
프로세스와 다르게 스레드는 메모리를 서로 공유할 수 있다. 이에 대해 더 자세히 설명하자면, 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
여기서 프로세스와 스레드의 중요한 차이를 하나 더 알 수 있게 된다. 만약 한 프로세스를 실행하다가 오류가 발생해서 프로세스가 강제로 종료된다면, 다른 프로세스에게 어떤 영향이 있을까? 공유하고 있는 파일을 손상시키는 경우가 아니라면 아무런 영향을 주지 않는다.
그런데 스레드의 경우는 다르다. 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
매모리 영역
메모리 영역은 유저 영역과 커널 영역 두가지의 영역으로 나뉘어진다.
- 코드 영역
- 프로그램의 코드가 올라가는 영역입니다.
- 코드는 컴파일 된 기계어 코드를 뜻합니다.
- 데이터 영역
- 전역 변수와 정적 변수들이 할당 되는 영역입니다.
- 힙 영역
- 동적으로 메모리를 할당하여 사용하는 공간
- 스택 영역
- 지역 변수와 매개 변수가 저장되는 영역
- 메모리의 가장 바닥부터 채워지는 구조
2. 멀티 프로세스와 멀티스레드는 무엇일까?
멀티 프로세스
멀티 프로세싱이란 하나의 프로그램을 여러 개의 프로세스가 구성하여 각 프로세스가 작업(Task)를 처리하도록 하는 기법이다.
- 각 프로세스는 독립적인 메모리 공간을 가지고 있으며, 서로 간섭하지 않는다.
- 하지만 Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되면서 오버헤드가 발생하며, 프로세스 간 공유하는 메모리가 없어서 Context Switching이 발생하면 데이터를 처음부터 불러와야 한다.
문맥 전환(Context Switching)이란?
문맥 전환이란 하나의 프로세스(process) 가 CPU 를 사용하다가 다른 프로세스가 사용할수 있도록 이젠 프로세스의 상태(문맥 : context) 를 PCB(Process Control Block)에 저장하고 새로운 프로세스의 상태를 CPU 에 적재하는 것을 의미한다.
PCB(Process Control Block)이란?
프로세스 제어 블록(이하 PCB)은 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조이다. 쉽게 말하면 운영체제가 프로세스를 제어하기 위해 프로세스의 상태 정보를 저장해 놓는 구조체이다.
멀티 스레드
하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 방식이다.
- 시스템 자원 소모 감소 (자원의 효율성)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어서 자원을 효율적으로 관리할 수 있다
- 시스템 처리량 감소 (처리 비용)
- 스레드 간 데이터를 주고 받는 것이 간단해지면서 시스템 자원 소모가 줄어든다.
- 스레드 사이의 작업량이 작아 스레드 간 Context Switching이 활발하게 일어난다.
- 그러나 한 스레드에서 오류가 발생하면 같은 프로세스 내의 다른 스레드에도 영향을 미칠 수 있다.
멀티 스레드의 동시성과 병렬성
동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행하는 것을 말한다.
(동시에 실행하는 것처럼 보이지만 사실은 번갈아가며 실행하고 있는 것임)
병렬성은 멀티 작업을 위해 멀티 코어에서 한 개 이상의 쓰레드를 포함하는 각 코어들을 동시에 실행하는 것을 말한다.
3. 결론
운영체제가 프로세스에게 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 작업 단위로 삼는 반면, 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.
프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다. 때문에 멀티태스킹보다 멀티스레드가 자원을 아낄 수 있게 된다.
'면접준비' 카테고리의 다른 글
면접준비 : 백엔드 (1) | 2025.01.03 |
---|---|
프론트엔드 면접 준비 : 왜 state를 직접 바꾸지 않고 useState를 사용해야 하나요? (0) | 2024.06.12 |
프론트엔드 면접 질문 : 리액트에서 JSX 문법이 어떻게 사용될까? (0) | 2024.06.07 |
프론트엔드 면접 준비 : 리액트 생명 주기 메서드 (0) | 2024.06.05 |
프론트엔드 면접 준비 : 리액트 클래스형 컴포넌트와 함수형 컴포넌트의 차이 (0) | 2024.05.29 |