Software Engineering

Difference between Process and Thread (+ Program)

남희정 2024. 4. 4. 17:16

 

프로세스와 스레드의 차이가 뭐죠?
차이점도 설명해주세요!

 

기술 면접 단골 질문으로 알려진 프로세스와 스레드의 차이점, 몰랐다! 매번 실무 얘기 하다가 기술 질문을 던져주시는 사수분께 감사한다. (꾸벅) 제대로 공부했음을 증명? 하기 위해 그리고 기록하기 위해 포스팅을 한다.

 

나처럼 프로세스와 스레드의 차이점에 대해 잘 모르는 분들께 도움이 되기 위한 글이다. 나는 운영체제 OS와 같은 CS 지식에 어려움을 느끼고 있고 이해를 하기 위해서 여러 번 반복해서 곱씹어보아야 한다. 익히기에 좋은 배경을 갖고 있지 않았지만 부족함을 채우려 지속적으로 노력 중이다. 이 글을 보고나서 모든 분들이 헷갈리던 개념에 대해 제대로 이해할 수 있었으면 좋겠다.

 

운영체제는 현재 하드웨어의 상태는 어떠한지, 여러분의 코드가 어떻게 실행되었는지, 하드웨어 상에 어떤 문제가 있었는지 등을 여러분에게 상세히 알려줄 수 있고, 이를 통해 여러분은 문제해결의 실마리를 찾을 수 있습니다.

즉, 운영체제를 깊이 이해하면 여러분은 운영체제가 여러분에게 건네는 말을 제대로 이해할 수 있고, 운영체제에 제대로 명령할 수 있게 됩니다. 그리고 결과적으로 하드웨어와 프로그램을 더 깊이 이해할 수 있습니다.

- 혼자 공부하는 컴퓨터 구조 + 운영 체제, 강민철

 

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

 프로세스와 스레드를 설명하기 위해선 프로그램부터 짚고 넘어가야 한다 👀

프로그램?  실행 파일(.exe)

- 디스크에 저장되어 있는 정적인 상태

- 소프트웨어의 한 상태로, 실행하지 않은 상태.

- 사용자가 실행시키기 전까지는 단순한 코드와 데이터 모음에 불과하다.

 

✔️ 특징

 

⚫️ 모든 프로그램은 실행되기 위해 반드시 자원이 필요하다. 여기서 자원이란 CPU, 메모리, 보조기억장치, 입출력장치 등과 같은 시스템 자원을 말한다.
=> 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램운영체제 Operating System이다. 

 

⚫️ 컴퓨터로 작업하는 도중에 전원이 꺼져서 작업한 내역을 잃어버린 경험을 들어본 적 있을 것이다.. 🥹
실행 중인 프로그램들은 메모리에 저장되는데, 메모리는 전원이 꺼지면 저장된 내용이 날아간다..!
그래서 프로그램은 컴퓨터의 기본 메모리에 저장되지 않는다. 하드 드라이브나 SSD 같은 비휘발성 저장장치(보조 기억장치)에 저장된다. 컴퓨터가 꺼져도 데이터가 사라지지 않도록 하기 위함이다. 실행을 위해선 기본 메모리로 로딩하여 커널에 의해 실행된다.

 

⚫️ 프로그램이 메모리로 로드되면 커널은 프로그램이 실행되는 동안 필요한 메모리 공간을 할당한다.
일반적으로 사용자 영역(user space) 내에 위치하며, OS가 위치한 커널 영역(kernel space)와 분리되어 있다.


>> 사용자 영역 - 일반 애플리케이션들이 실행되는 곳
>> 커널 영역 - 운영 체제의 핵심 구성 요소와 시스템 콜, 드라이버 등이 실행되는 곳  

 

메모리 내 영역

 

프로그램은 저장 장치에 보관되다가 실행 요청이 있을 때 메모리로 로드되어 사용자 영역에 적재되고 CPU에 의해 실행되는 것을 알 수 있다.

 

잠깐. 프로그램은 정적인 상태라며? 😮

 

그렇다. 프로그램이 메모리로 로드되어 실행되는 순간, 그 프로그램의 인스턴스는 프로세스가 된다.

 

프로세스?  실행 중인 프로그램

 

프로그램이 실행되면, OS는 그 프로그램의 인스턴스, 즉 프로세스를 메모리에 할당하고 실행한다. 프로세스는 실행 중인 상태로, 자신만의 메모리 공간과 시스템 리소스, 프로세스 ID(PID) 등을 갖고 있다.

활성 상태 관리에서 쉽게 확인할 수 있는 프로세스

 

- 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램

- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)

- 운영체제로 부터 시스템 자원을 할당받는 자원의 단위

 

보조기억장치에서 메모리로 로드하여 실행되는 순간 프로세스가 된다.

 

✔️ 특징

 

⚫️ 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)의 구조를 할당 받는다.

⚫️ 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 갖고 있다. 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.

⚫️ 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스간의 통신을 사용해야 한다. (파이프, 파일, 소켓 등을 이용한 통신)

 

프로세스의 메모리 영역

 

 

1️⃣ 코드 영역 Code Segment

텍스트 영역이라고도 불린다. 말 그대로 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장된다. 

데이터가 아닌 CPU가 실행할 명령어가 담겨있기 때문에 쓰기는 금지되어 있다. read-only 공간이다!

 

2️⃣ 데이터 영역 Data Segment

잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간. 전역 변수가 대표적이다.

 

코드 영역과 데이터 영역은 크기가 고정된 영역으로, 정적 할당 영역이라고도 부른다.

 

3️⃣ 힙 영역 Heap Segment

프로그램을 만드는 사용자, 프로그래머가 직접 할당할 수 있는 저장 공간이다. 힙 영역에 메모리 공간을 할당했다면 언젠간 해당 공간을 반환해야 한다. 

 

4️⃣ 스택 영역 Stack Segment

데이터를 일시적으로 저장하는 공간이다. 매개 변수, 지역 변수가 대표적이다. 

 

힙 영역과 스택 영역은 실시간으로 크기가 변할 수 있기 때문에 동적 할당 영역이라고 부른다. 

 

스레드는 이런 프로세스의 특정한 수행 경로이다. 무슨 말인지 제대로 알아보자!

 

스레드? 실행의 단위

  • 프로세스 내에서 실행되는 여러 흐름의 단위
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당받은 자원을 이용하는 실행의 단위

 

단일 스레드

전통적인 관점에서 프로세스는 한 번에 하나의 일만을 처리했고 그것이 당연했다. 한 번에 하나의 작업을 처리하는 프로세스, 즉 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스는 단일 스레드 프로세스라고 볼 수 있다. 

 

스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 된 것! 모든 프로세스가 멀티 스레드를 사용하는 것은 아니지만 최근의 복잡한 애플리케이션과 시스템에서는 대부분 멀티스레드를 사용하는 경향이 있다.

 

multi thread

 

즉, 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 된 것이다.

 

✔️ 특징

 

⚫️ 스레드는 프로세스 내에서 각각 Stack 스택만 따로 할당 받고 Code, Data, Heap 영역은 공유한다.

▶︎ 자세히 말하면 스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 갖고 있어 스레드마다 각기 다른 코드를 실행할 수 있다.

프로세스의 자원을 공유하는 스레드

 

⚫️ 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다. => 프로세스의 자원을 공유한다는 것이 스레드의 핵심! 

⚫️ 스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행된다.

 

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

여러 프로세스를 동시에 실행하는 것을 멀티 프로세스 Multiprocess, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드 Multithread 라고 한다.

 

동일한 작업을 수행하는 단일 스레드 프로세스 여러 개를 실행하는 것과 하나의 프로세스를 여러 스레드로 실행하는 것은 뭐가 다를까? 🤔

 

프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다.

 

멀티 프로세스는 독립된 메모리 공간을 가지고있고 서로 다른 주소 공간에서 실행된다. 이로 인해 하나의 프로세스에서 발생한 문제가 다른 프로세스에 영향을 미치지 않아 안정성이 높다. 하지만 프로세스 간의 통신(IPC)*을 위해 오버헤드가 발생할 수 있고, 리소스 사용량이 많아진다. 

 

*프로세스 간 통신(IPC; Inter-Process-Communication)

프로세스 간 자원을 공유하고 데이터를 주고 받는 것. 예를 들어 같은 컴퓨터 내의 서로 다른 프로세스나 스레드끼리 데이터를 주고받는 것도 포함이다. hello.txt파일에 새로운 값을 쓰는 프로세스와 hello.txt파일을 읽는 프로세스, 둘은 파일을 통한 프로세스 간 통신으로 볼 수 있다. 또 프로세스들은 서로 공유하는 메모리 영역을 두어 데이터를 주고받을 수 있다. 프로세스들이 공유할 수 있는 메모리 영역을 공유 메모리(shared memory)라고 한다. 이 외에도 소켓, 파이프 등을 통해 통신할 수 있다. 스레드에 비해 공유가 까다로울 뿐 불가능하지 않다.

 

멀티 스레드는 같은 프로세스 내에 있기 때문에 메모리와 자원을 공유한다. 이 매커니즘 덕분에 스레드 간의 통신이 용이하고, 리소스 사용량이 상대적으로 적다. 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드(sibling thread)도 변경 결과를 즉시 볼 수 있다. 하지만 한 스레드에서 발생한 문제가 전체 프로세스에 영향을 줄 수 있다는 단점이 있다. 

(예: 웹 브라우저가 다양한 탭과 작업을 각각의 스레드로 관리하는 경우)

 

 

🤔💭

이번 포스팅을 통해 회사 도메인에서 사용되는 용어를 정확하게 익힐 수 있어 좋았다. 프로세스와 스레드, 프로그램 그리고 그들의 통신, IPC에서의 shared memory도 회사에서 종종 나오는 단어였는데 이렇게 알게되어 뿌듯하다. 앞으로도 게을리 하지 않고 열심히 익혀보겠다. 

 


 

혼자 공부하는 컴퓨터 구조 + 운영체제, 강민철 📚

완전히 정복하는 프로세스 vs 스레드 개념

[OS] 프로세스와 스레드의 차이

프로세스와 스레드의 차이

Difference Between Process and Program (Process Vs Program)

Difference between Process and Thread

[OS] Process #1 - Program, Process, Thread의 개념 및 차이점

ChatGPT🤖