본문 바로가기
웹 엔지니어 면접 질문/CS

프로세스와 스레드에 대해

by cuziam 2023. 4. 12.

Q: 프로세스와 스레드에 대해서 말해주세요.

 

<질문의 의도>

기본적인 CS질문인 것 같다. 이 질문은 스레드를 사용할 때 어려운 점과 스레드를 사용하는 기법에 대한 추가질문을 하기 좋아보인다.

전략:

  1. 프로그램과 프로세스가 무엇인지에 대해 설명할 것.
  2. 스레드의 컨셉과 필요성에 대해 설명할 것.
  3. 멀티프로세스, 멀티스레드를 사용하는 실제 예시를 들어줄 것.
  4. 추가적으로 대답을 할 시간이 있다면 스레드를 사용할 때 어려운 점이 무엇이고, 이를 해결하기 위해서 어떤 기법을 사용하는지 설명할 것.

 

A:

*프로그램 VS 프로세스 : 프로세스는 프로그램의 인스턴스이다.

일단 프로그램이 뭔지 짧게 설명해야할 것 같다. 좁은 의미에서 프로그램은 컴퓨터 명령어의 집합이다. 프로그램은 대개 컴퓨터의 보조 메모리에 정적으로 저장되어 있다. 프로그램이 호출되면, 그 코드의 복사체가 주 메모리로 적재된다. 즉 프로그램의 인스턴스가 만들어지고, 실행되기 시작한다. 이 인스턴스는 메모리에 자체적인 Code, Data, Stack을 가지게 되며, 이러한 인스턴스를 프로세스라고 부른다.

 

*프로세스 VS 스레드 : 스레드는 프로세스의 Context Switching 비용을 개선한다. 하지만 자원선점 및 동기화 문제에 잘 대처해야 한다.

CPU는 주어진 규칙에 따라(이 규칙은 운영체제의 설계에 따라 다르다.) 프로세스들을 스케쥴링하고, 스케쥴된 프로세스들을 순회해가며 부분적으로 실행하는 과정을 밟는다. 이 과정에서 Context Switching이 발생한다. Context Switching이란 프로세스가 실행되다가 다른 프로세스로 넘어갈 때, 기존 프로세스의 상태나 레지스터값들을 저장하는 일을 말한다. 스레드는 Context Switching시 발생하는 메모리 낭비나 프로세스간의 통신의 문제를 개선하기 위해 고안되었다.

 

스레드는 어떤 프로세스 내에서 만들어진, 프로세스보다 한 단계 더 작은 실행흐름이다. 동일한 프로세스에서 생성된 스레드는 Code, Data 영역은 공유하지만, 독자적인 Stack을 가진다. 공유되는 메모리 영역 덕에 Context switching시 메모리를 절약하고, 빠르게 데이터들에 접근할 수 있다는 장점이 있다. 하지만 스레드 간의 자원 선점, 동기화 문제를 해결해줘야 한다는 단점이 있다.

 

 

*멀티 프로세스(멀티 태스킹) VS 멀티 스레드

이러한 특징들로 인해서 (특히 시스템 프로그래밍을 한다면)실제 프로그래밍 과정에서 생각해볼 것들이 있다. 같은 작업을 여러 번 해야하는 과정을 구현할 때, 멀티 프로세스로 구현할 것인가, 멀티 스레드로 구현할 것인가에 대한 고민이 생길 수 있다. 각각의 장단점은 과거 인터넷 익스플로러와 크롬의 멀티탭 구현방식을 생각하면 이해하기가 편하다. 인터넷 익스플로러는 멀티스테드로, 크롬은 멀티 프로세스로 이를 구별했다.

 

ex)

인터넷 익스플로러: 멀티 스레드

인터넷 익스플로러의 멀티탭은 멀티스레드로 구현되어 있었다. 탭 하나 하나가 스레드였다. 그렇기 때문에 탭들이 크롬에 비해 램을 많이 차지하진 않는다는 장점이 있었다. 하지만 자원을 공유하고 있었기 때문에 가끔 탭 하나에 문제가 생기면 다른 탭 전체에 영향을 미치는 치명적인 단점을 알고 있었다. 웹 브라우저 전체가 종료되는 일도 흔했다.

 

크롬: 멀티 프로세스

반면 크롬의 탭은 하나 하나가 프로세스였다. 메모리 영역이 독립적으로 할당되므로, 한 프로세스가 에러가 발생해서 종료되어도, 다른 프로세스에 주는 영향이 상대적으로 적었다. 하지만 메모리를 많이 잡아먹었다.

 

 

<예상 추가질문>

Q: 스레드 간 자원 선점, 동기화 문제 같은 게 있다고 했는데 이에 대해서 구체적으로 설명해주시겠어요?