개요
소프트웨어를 전공하는 사람이라면 한번은 꼭 들어봤을 프로세스와 스레드.
컴퓨터 실행 내부 요소를 살펴볼때, 운영체제를 공부한다면 맨 처음 배우게 될 기본이 되는 개념이다.
정의는 이렇다.
- 프로세스(Process) : 운영체제에게 자원을 할당받은 작업의 단위
- 스레드(Thread) : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
일단 작업의 단위? 실행 흐름의 단위?... 무슨 말인지 모르겠다.
그래도 일단 프로세스는 작업의 단위, 스레드는 실행 흐름의 단위라는 점을 기억하고 파헤쳐보자.
프로그램, 프로세스, 스레드
1) 프로그램(Program)
먼저 사람들이 흔히 아는 프로그램은, 실행할 수 있는 파일을 통칭한다.
윈도우의 exe파일이나 Mac의 dmg파일을 예로 들 수 있다.
여기서 핵심은 실행파일이 저장 장치에 저장은 되어있지만, 메모리에 아직 올라가 있지 않은 상태,
즉, 아직 실행되지 않은 정적 프로그램이라는 것이다.
메모리에 올라가있지 않다?
- 운영체제가 아직 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 것이다.
- 모든 프로그램이 실행되기 위해서는 운영체제로부터 메모리 공간을 할당을 받아야 실행될 수 있다!!

프로그램은 개발자가 특정 언어를 사용하여 완성한 것이다. 즉, 쉽게 말해서 그냥 코드 덩어리인 것이다.
2) 프로세스(Process)
그렇다면 프로세스란 무엇일까? 프로그램과 같은 코드 덩어리를 실행시켜, 정적 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태를 의미한다.
우리는 평소 컴퓨터를 사용하면서 작업관리자를 이용하여 강제 종료하는 상황이 있었을 것이다.무심코 사용했던 기능이지만, 여기서 종료하는 것이 바로 실행중인 프로그램인 프로세스인 것이다.
프로그램을 실행시키기 위해서는 운영체제의 역할이 필요하다.
운영체제는 실행하려는 프로그램을 메모리 공간에 올려놓는다. 그리고 시스템 자원(CPU)를 할당하여 메모리에 올려놓은 프로그램 코드를 실행시켜 우리가 서비스를 이용할 수 있는 것이다.

최종적으로 이 둘을 간략하게 정리하자면,
| 프로그램(Program) | 프로세스(Process) |
| 어떤 작업을 하기 위해 실행할 수 있는 파일 |
실행되어 작업중인 프로그램 |
| 파일이 있지만 아직 메모리에 올려지지 않은 상태 |
메모리에 적재되어 시스템 자원(CPU)를 할당받아 프로그램이 실행되고 있는 상태 |
| 코드 덩어리 | 코드 덩어리를 실행한 것 |
3) 스레드(Thread)
과거에는 프로그램을 실행하기 위해 프로세스 하나만을 사용했었다. 하지만 기술이 발전함에 따라, 프로그램은 더욱 무거워지고 복잡해졌다. 결국 프로세스 하나만으로 실행하기에는 한계가 생긴 것이다.
요즘은 게임을 다운로드 받으며, 웹 서핑도 하고, 친구랑 메신저도 주고받는다. 하지만 과거에는 하나의 작업이 끝날때까지 그저 기다려야했다. 프로세스라는 개념만 있을때는 이런 문제를 해결하기 위한 방법을 떠올려본다면, 그 무거운 프로그램을 수용하기 위해 여러 개의 프로세스가 분담하여 해당 프로그램을 실행시키려할 것이다. 하지만 이것은 불가능하다. 왜냐면 운영체제는 안정성을 위해서 프로세스는 자신이 할당받은 메모리 공간내에서만 접근을 허용하도록 제약을 두기 때문이다. 그리고 이렇게하면 그만큼 메모리와 시스템 자원(CPU)를 사용할테고, 이는 자원이 낭비되는 상황이 발생하게된다. 이런 프로세스의 한계를 해결하기 위해 한 프로세스 내의 더 세부적인 실행 단위의 필요성이 나타난 것이고, 이것이 바로 스레드(Thread)가 탄생하게 된 계기이다.
스레드란?
스레드란, 하나의 프로세스 내에서 동시에 진행되는 흐름의 단위를 말한다.
예를 들어 크롬 브라우저를 통해 웹에 접속하면 하나의 프로세스가 생성이 된다.
그런데 우리는 해당 크롬 브라우저를 통해 게임을 다운받고, 친구와 메일을 주고 받으며, 쇼핑을 하고 있다.

즉, 하나의 프로세스 내에서 여러 작업들 흐름이 동시에 진행되는 것이다. 이러한 여러 작업 흐름들을 스레드라고 하며
여러개가 있다면 이를 멀티 스레드 라고 부르는 것이다.
아래 그림과 같이 하나의 프로세스 안에 여러 개의 스레드들이 있다고 보면 된다.
스레드 수가 많을 수록, 프로그램 속도도 동시에 하는 작업이 많아져 성능이 올라간다.

일반적으로 하나의 프로그램은 하나 이상의 프로세스를 가지고 있고,
하나의 프로세스는 하나 이상의 스레드를 가지고 있다.
즉, 프로세스를 생성하면 기본적으로 하나의 main 스레드가 생성되게 된다.
여기서 개발자가 직접 프로그래밍으로 스레드를 여러 개로 늘려 멀티 스레딩을 구현해야한다.
지금까지 프로그램, 프로세스, 스레드의 개념에 대해 알아보았다.
하지만 이는 기본적인 개념일 뿐, 좀 더 자세하게 알 필요가 있다.
프로세스와 스레드의 내부 작동 방식, 운영체제가 시스템 자원을 어떤 방식으로 할당하고
프로그램은 자원을 어떤 방식으로 활용하는지, 내부 작동 방식을 이해하고 있어야할 것이다.
따라서 다음 포스팅에는 프로세스와 스레드 작동 방식에 대해 자세하게 알아보도록 하자!
References
'운영체제' 카테고리의 다른 글
| 자바의 T 메모리 구조에 대해 알아보자. (0) | 2024.10.24 |
|---|---|
| 프로그램들은 어떻게 동시에(?) 실행될까? (0) | 2024.03.04 |
| Process 와 Thread의 자원 공유 (0) | 2024.02.26 |
| Process의 구조는 어떻게 되어있을까 (0) | 2024.02.23 |