#TIL33, 프로세스와 스레드

April·2021년 6월 20일
0

🌹CS

목록 보기
5/17
post-thumbnail

개인 공부를 위해 작성했습니다

프로세스와 스레드

기술면접에서 단골 질문 사항으로 나온다고 하는 프로세스와 스레드에 대해 공부한 내용 정리해본다.

프로세스와 스레드란?

프로세스: 운영체제로부터 자원을 할당받은 작업의 단위.
스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.

어렵게만 들릴 수 있는데, 프로세스의 정의에서 작업이라는 단어와 스레드의 정의에서 실행 흐름이라는 단어를 기억하자.

프로그램 → 프로세스 → 스레드

프로그램 → 프로세스

프로세스와 스레드에 대해 이해하기 위해서는 우선 프로그램에 대해 알아둘 필요가 있다. 그럼 프로그램은 무엇일까? 프로그램이란

  1. 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체 또는
  2. 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태라고 말한다

풀어서 다시 정리해보면,

  • 메모리에 올라가 있지 않은: 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻이다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있다.
  • 정적인 상태: 정적(靜的)이라는 단어 그대로, 움직이지 않는 상태라는 뜻이다. 한 마디로 아직 실행되지 않고 가만히 있다는 뜻이다.

결국 프로그램이라는 단어는 아직 실행되지 않은, 일련의 명령문의 집합체 그 자체를 가리키는 말이다.

일련의 명령문의 집합체인 실행 파일(프로그램)을 실행 시키는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적(動的)인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다.
즉, 프로세스라는 단어는 작업 중인 프로그램을 의미한다


프로세스 → 스레드

과거에는 프로그램 실행 시작부터 실행 종료까지 하나의 프로세스 만으로 진행되었다고 한다. 하지만 시간이 흐를수록 프로그램은 복잡해졌고 하나의 프로세스로 실행 시키기에는 벅차게 되었다. 실제로 프로그램이 하나의 작업만 실행하는 경우는 없다. 그럼 어떻게 해야할까?

프로세스를 여러개 실행하면 되지 않을까? 라고 생각할 수 있지만 불가능했다. 왜냐하면 운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생하기 때문이다.

아무튼 프로세스와는 다른 더 작은 실행 단위 개념이 필요하게 되었고, 이 개념이 바로 스레드다.

즉, 프로세스의 한계를 해결하기 위해 만들어진 개념이 스레드다.
스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로다.



조금 더 자세히 풀어보면,
프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는데 이 때 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해 준다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.


반면 스레드는 메모리를 서로 공유할 수 있다. 조금 더 자세히 풀어보면, 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.

여기서 프로세스와 스레드의 차이점을 알 수 있다.

  • 프로세스는 각각의 독립된 메모리를 할당받기 때문에 오류가 발생해서 프로세스가 강제로 종료된다면, 공유하고 있는 파일을 손상시키는 경우가 아니라면 다른 프로세스에게 아무런 영향을 주지 않는다.

  • 스레드는 메모리를 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.


✨ tl;dr

  • 프로그램
    • 어떤 작업을 하기 위해 실행할 수 있는 파일 또는 프로그램
  • 프로세스
    • 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태
  • 스레드
    • 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위

프로그램은 코드 덩어리 파일, 그 프로그램을 실행한 게 프로세스.

스레드를 코드(프로세스) 내에서의 함수(스레드)에 빗대어 표현해보면 이해하기 훨씬 쉽다. 코드 내 어떤 함수 하나에서 오류가 발생하면 어떤 함수에서 발생했든 간에 작업을 중단하고 프로세스 실행을 끝내버리는 것을 생각하면 보다 이해하기 쉽다!

  • 간략하게 싱글 스레드와 멀티 스레드를 그림으로 이해해보자.

🎁 참고

메모리 영역

: 하나의 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다.

코드(Code) 영역:

  • 코드 영역은 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 영역이다. CPU는 코드영역에 저장된 명령어를 하나씩 처리한다.

데이터(Data) 영역:

  • 데이터 영역은 코드에서 선언한 전역 변수와 정적(static) 변수가 저장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되어 종료될 때 소멸된다.

스택(Stack) 영역:

  • 스택 영역은 함수 안에서 선언된 지역변수, 매개변수, 리턴값, 등이 저장되고 함수 호출시 기록하고 종료되면 제거한다. 스택이라는 자료구조 명칭에서도 알 수 있듯이 후위선출(LIFO) 메커니즘을 따른다.

힙(Heap) 영역:

  • 힙 영역은 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간(Free Space)이다. 이 공간은 동적 메모리 할당 공간이므로 사용이 끝나면 운영체제가 쓸수 있도록 반납해야 한다. 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 데이터 또는 스택과 같은 정적 메모리 할당과는 대조적이다. 동적 메모리 할당은 어느 시점에 어느 정도의 공간을 할당할 수 있을지 정확히게 예측할 수 없으므로, 런타임에 확인가능하다.
profile
🚀 내가 보려고 쓰는 기술블로그

0개의 댓글