프로세스
프로세스는 실행 중인 프로그램을 의미한다.
프로그램
프로그램이란, 컴퓨터에서 실행될 때 특정 작업을 수행하는 일련의 명령어들의 모음(집합)이다
따라서, 단순히 말하면 프로그램이란 명령어 모음 파일이다. 이는 텍스트로 이루어져 있을 수도 있고, 바이너리로 이루어져 있을 수도 있다. 지금은 프로그램이 소스코드 형태의 텍스트 파일이라고 생각해보자.
이렇게 텍스트 파일에 불과한 프로그램을 실행하기 위해서는 컴퓨터 자원을 할당받아야 한다.
예를 들자면 cpu, 메모리와 같은 자원 말이다.
따라서, “프로세스는 실행 중인 프로그램을 의미한다.”라는 문장에서, “실행 중인 프로그램”을 더 자세히 풀어 말해보자면 “실행되는데에 필요한 컴퓨터 자원을 할당받은 프로그램“과 같다.
➕ 프로세스는 컴퓨터 자원을 할당 받는다. 그 중 메모리 자원은 크게 4가지 영역으로 나뉜다. 코드(실행 명령을 포함하는 코드들), 데이터(static 변수), 힙, 스택 영역이다.
실행
“프로그램이 실행된다”에서 실행이 의미하는 것은 CPU가 명령어를 해석하고 이를 처리하는 것이다.
명령어를 해석하기 위해서 우선 코드를 순차적으로 읽어야함은 자명하다. 이러한 과정은 마치 하나의 흐름과 같다.
➕ 디버깅을 해본 적이 있다면, 순차적으로, 즉 흐름대로 코드를 읽어본 경험을 해보았을 것이다.
흐름 → 실 → thread
흐름을 이미지로 떠올려보자. 여러 가지가 생각나겠지만, 여기서는 이를 ‘실’에 비유한다.
실은 영어로 thread
이다.
스레드
스레드는 프로세스 내부의 실행 흐름이다.
프로세스가 생성되면, 해당 프로세스는 하나의 스레드를 갖는다. 말 그대로 하나의 실행 흐름을 가진다는 뜻이다.
최소한의 실행 흐름 단위
스레드
의 정의를 찾아보면, ‘최소’ 실행, ‘최소’ 작업 등 ‘최소’라는 말이 자주 보인다.
왜 ‘최소’라는 말이 등장하였을까?
이를 이해하기 위해서, 지금부터 유튜브를 보고 싶은 사람이 되어보자.
👤 유튜브 프로그램을 실행시킨다.
💻 프로세스를 생성한다.
👤 “도경수(D.O.)X지코(ZICO) - SPOT! (Feat. JENNIE) ” 영상을 재생한다.
💻 cpu는 해당 요청을 처리하기 위해 프로세스를 실행한다.
👤 노래를 들으며 “경수야 제발 너가 하고 싶은 음악만 할 게 아니라 꼭 해야하는 음악이 있다고” 라는 댓글을 달고자 한다.
이와 같은 상황을 어떻게 처리해야할까?
이미 프로세스에 존재하는 하나의 흐름을 기존 작업이 사용 중이라는 것을 생각해야 한다. 그러므로 댓글 달기 작업을 처리하기 위해서는 흐름을 새로 생성하여야 한다.
이를 위하여, 프로세스를 새로 만들면 된다. 새로 생성된 프로세스를 통하여 댓글을 작성하는 작업을 수행하면 된다.
➕ 하나의 프로그램에 대응되는 프로세스가 여러 개라면 이를 멀티 프로세스라고 부른다.
그런데, 곰곰히 생각해보니 이것이 메모리 낭비같이 느껴진다. 영상 재상과 댓글 작성은 같은 프로그램에서 발생하는 요청이기 때문이다. 분명히 중복되는 데이터가 존재할 것이다.
이 점을 보완하기 위해, 중복으로 사용될 것 같은 데이터는 공용 공간에 두고 개별 실행에 필요한 데이터만 다른 메모리 공간에 보관해보자.
이렇게 하나의 프로세스에서 코드, 데이터, 힙 영역을 공유하고, 스택 영역만을 따로 가지는 개념을 새로 만들었다. 이게 스레드이다.
이제 프로세스를 두 개 만들 필요 없이, 하나의 프로세스에서 스레드를 하나 더 만들고, 해당 스레드가 댓글 달기 작업을 수행하도록 하면 된다. 이러한 상황을 멀티 스레드라고 부른다. (스레드가 두 개니까요!)
따라서 스레드 = ‘최소 실행 흐름 단위’라고 불리는 이유는, 스레드가 프로세스를 구성하는 실행 흐름의 단위이기 때문이다.
➕ 스레드는 메모리 낭비를 줄이고, 캐시 적중률을 높여 빠른 실행시간을 가진다는 장점을 가진다.