본문 바로가기

면접질문[CS]/알고리즘 & OS

프로세스(Process)와 스레드(Thread)의 차이점. [ 운영체제(OS) 면접 질문 1]

Why

 

운영체제 관련 면접 질문으로 첫 번째로 물어볼 수 있는 질문이다.

 

프로세스라는 개념은 상당히 중요한데 OS의 관점에서 하나의 "작업"단위가 되기 때문이다.

 

프로세스와 관련된 정보(혹은 정책)들만으로도 다른 면접 질문으로 빠르게 뻗어나갈 수 있다.

 

1. 프로세스의 상태

2. CPU 스케줄링 정책

3. 스레드

4. 멀티 프로세스와 멀티 스레드

5. 프로세스에 대한 세부적인 정보(PCB)

6. 컨텍스트 스위칭 등등

등등..

 

그렇기에 해당 질문을 통해 프로세스가 무엇인지, 스레드는 무엇인지 잘 설명할 수 있어야 한다.

 

해당 질문에 아쉬운 답변을 한다면 OS 파트에서 더 이상의 질문이 들어오지 않고

다음 섹션(프로그래밍, 네트워크, 보안, DB 등등으로 넘어가게 될 수 있다.)

 

나의 답변

 

프로세스와 스레드의 차이점은 설명했으나 메모리 영역(4가지)과 관련해서는 틀리게 설명했다.

 

Heap 영역은 공유하지 않는다고 답변했다. 해당 답변으로 Heap 영역을 공유하려면 어떻게 해야 하냐는

질문이 들어왔고 이어 잘 모르겠다고 답변하면서 OS 파트는 마무리되었다.

 

Heap과 Stack은 동적인 자원 영역이라는 것에 집착해버린 나머지 이상한 답변을 뱉어버린 것이다..ㅠ

 

다시 공부하면서 요점을 잡게 되었다.

 

프로그램(Program). 정적인 상태.

 

어떤 데이터를 사용해서 어떤 작업을 할지 절차들을 담은 실행할 수 있는 파일을 의미한다.

 

저장장치(하드디스크)에 저장되어 있어 그 자체로는 정적인 파일이다.

 

프로세스와 프로그램의 주요 차이점은 실제 작동하는 상태(동적인)이냐의 유무이다. 

 

프로세스(Process) : OS의 관점에서 하나의 "작업"단위. [ 실행 중인 프로그램 ]

 

프로그램을 메모리에 올린 동적인 상태이다. "프로그램이 실행되면 프로세스 인스턴스가 생성"된다고 표현한다.

 

OS가 프로그램을 메모리에 올리고 CPU를 위한 PCB(Process Control Block : 프로세스 제어 블록)을 할당한 상태이다.

 

프로세스란 프로그램 + PCB인 것이다. 

 

스케줄러의 입장에서 "task(작업)"라고 부르기도 한다.

 

스레드(Thread) : CPU 관점에서의 "실행" 단위.

 

프로세스가 작업의 전체라면 스레드는 작업을 처리하기 위해서 수행하는 "실행" 단위이다.

 

CPU에서 처리하는 실행 하나가 "스레드"인 것이다. 

 

프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야 할 일들을 CPU에 전달하는데 이때의 단위가 스레드인 것!

 

CPU는 프로세스로부터 전달받은 스레드를 수행한다.

 

OS입장에서 작업은 프로세스이고, CPU의 작업은 프로세스 내의 스레드이다.

 

프로세스는 최소한 1개의 스레드를 가지며 2개 이상의 스레드를 가진 경우를 멀티 스레드라고 한다. 

 

 

메모리 영역의 관점

참고 : https://www.w3.org/People/Frystyk/thesis/multithread.html

그림을 보면 Process에서 Heap, Code, Static Data 영역을 스레드와 공유하고 있음을 볼 수 있다.

 

스레드는 Stack 영역을 독립적으로 소유한다. [ 기능면에서 독립하기 위함 ]

 

프로세스가 가지는 4개의 메모리 영역을 살펴보도록 하자.

[ 2개는 정적(static data, Code)이며 2개(Stack, Heap)는 동적인 영역이다. ]

 

Code 영역.

- 실행할 프로그램의 코드가 저장된 영역이다. 프로그램의 본문 영역이다.

- CPU는 코드 영역에 저장된 명령어들을 하나씩 처리한다.

[ 프로그램 카운터와 프로그램 코드가 저장된다. ]

 

Data 영역

- 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다. [ 초기화되지 않은 변수는 BSS에 저장 ]

- 코드가 실행되면서 사용하는 변수나 파일 등의 자원을 모아 놓는다.

Stack 영역 [스레드 별로 소유 ] [ 컴파일 시점에 크기 결정 ]

프로세스에서 순간적으로 처리해야 하는 정보(함수와 관련)를 위한 임시 메모리 영역이다.

 

함수 안에 선언된 지역변수, 매개변수, 리턴 값, 돌아올 주소 등등이 저장된다.

 

함수 호출 시 해당 정보들을 기록(push)하고, 종료되면 제거(pop)한다.

이를 위해서 LIFO(Last Input First Out) 메커니즘을 제공하는 Stack 자료구조를 사용하는 것이다.

메모리의 높은 주소에서 낮은 주소로 할당되는 방식으로 처리된다. 

 

컴파일 타임에 크기가 결정되며 무한하게 할당할 수 없다. [ 스택의 깊이에 대한 제한 조건이 존재한다. ]

 

스레드 별로 Stack을 독립적으로 소유하여 독립적인 함수 호출이 가능해진다. 

[ 독립적인 함수 호출 => 독립적인 실행 흐름을 소유 ]

 

프로세스가 가지는 스레드의 개수만큼 실행 단위를 가지는 것이다. 

개별 스택을 통해 CPU로 하여금 "독립적인 단위"로 처리하게 해주는 것이다.

 

Heap 영역 [ 런타임 시점에 크기가 결정 ] 

프로그래머가 직접 공간을 할당, 해제하는 메모리 공간이다. [ 객체 데이터 영역 ]

 

Java의 경우 new 연산자로 생성된 객체가 Heap 영역을 사용하게 된다.(C언어는 malloc, free)

 

FIFO로 가장 먼저 들어온 데이터가 가장 먼저 인출되는 방식을 가진다.

 

메모리의 관점에서 보면 낮은 주소에서 높은 주소의 방향으로 할당된다.

 

왜 Thread가 필요할까? [ 자원 효율성 + 작업 유연성 ] => 멀티 스레드에서 살펴본다.

1. 응답성 향상

입출력으로 인해서 작업이 막혀도 다른 스레드들이 작업을 계속하여 응답할 수 있다.

 

2. 자원의 공유(heap, data, code)

프로세스가 가진 자원을 스레드들이 공유하게 되어 작업은 원활하게 진행할 수 있다. 

불필요한 자원의 중복을 막아주어 효율성을 높여준다.

 

3. 다중 CPU 지원 시 멀티 스레드로 처리 가능

2개 이상의 CPU를 가진 컴퓨터를 사용하면 CPU 사용량을 높일 수 있다. 

 


Thread가 개별 스택 영역(Program Counter)을 가진다는 것.

 

프로세스에서 공유할 수 있는 영역(데이터, 코드, Heap)은 공유하고 호출이 전환되어 처리해야 하는 기능 부분만 별도로 Thread의 스택으로 관리함으로써 메모리 영역을 효율적으로 활용할 수 있는 것이 핵심이라고 생각한다.

 

[ 공유 영역은 Kernel Context로 공유하게 된다. (공유 라이브러리, 코드, 힙, 데이터) ]

이외의 개별 영역(호출될 기능에 대한 정보)는 Stack으로 개별 스레드가 가지는 것이다.

 

스택(stack)에 저장되는 정보는 함수 호출과 관련된 내용이다. (Scope)

 

함수는 기능이다. 하나의 프로세스에서 여러 개의 스레드를 가진다는 것은 여러 개의 기능을 가진다는 것이다.

 

네트워크, 입출력, 작업 처리 등등 프로세스가 해야 할 일들이 많은데 해당 기능들을 스레드로 처리하게 되는 것이다.

 

이는 멀티 스레드의 강력한 배경이 되어준다.

 

해당 글에서는 프로세스와 스레드의 차이점만 살펴보았다. 다음의 글에서 멀티 프로세스와 멀티 스레드를

비교해볼 생각이다.

 

참고자료

블로그

  • WeareSoft 깃헙 기술 면접 질문 : 프로세스-스레드 편 : link [ 핵심 깔끔하게 정리해주셨다. ]
  • charlezz님의 미디엄 글 : link [ 전체를 요약해주셨다 ]
  • mommoo 님의 글 : link [ Thread가 Stack을 독립적으로 가지는 이유 ]

  • 쉽게 배우는 운영체제 3장. 프로세스와 스레드
반응형