프로세스와 스레드 차이

파이썬으로 다운로드 프로그램을 개발중입니다.

AI랑 씨름하고있는데, 동시에 여러 파일을 다운로드 받는 멀티 스레딩 다운로드를 한번 만드는것이 어떻냐 라고 제안했습니다. 문득 드는 생각이, 스레드가 뭐지? CPU의 6코어 12스레드 에서 그 스레드인가? 그럼 나는 동시에 13개의 파일을 동시에 받을 수 없는건가? 라는 생각이 들었어요.

신입 면접에도 많이 나오는 질문인데, 관련 개념을 잡고가는게 좋을것같아보여서 정리해보려 합니다.
만약 틀린부분이 있다면 지적해주세요


운영체제

프로세스와 스레드를 알아보기 전에, 간단하게 운영체제부터 훑는게 이해해 도움이 됩니다.
운영체제는 하드웨어(CPU, RAM, DISK)등을 효율적으로 활용하기 위한 소프트웨어이며, 윈도우나 리눅스, 맥이 여기에 해당합니다.

예를들어, 저희같은 사용자들은 크롬을 실행하게 되면 운영체제가 알아서 램을 작업대에 올리고 CPU는 몇초 사용하기 이런식으로 말이죠. 사실 이 작업은 운영체제 내에서도 커널이 담당하는 일이지만, 이해하기 쉽게 운영체제가 한다 라고 보셔도 무방합니다.

프로그램

프로그램은 위에서 말한것과 같이 저희가 사용하는 크롬같은것들입니다. 저희가 크롬을 더블클릭하게 되면, chrome.exe 파일을 실행하는것이고 곧, 프로그램을 실행하는거죠.

프로그램은 그냥 단순한 잠자고있는 파일일 뿐입니다. 저희가 실행하기 전까지는 말이죠. 이 잠자고 있는 파일은 컴퓨터 디스크 어딘가에 저장된 설계도와 같습니다. 실행만 안한다면 하드디스크 공간만 차지하며 CPU, RAM 자원을 잡아먹지 않습니다.

프로세스

잠자고 있던 프로그램을 저희가 더블클릭해서 실행하게 된다면, 여기서부터는 하드웨어 자원을 잡아먹기 시작합니다. 운영체제(커널)은 프로그램을 실행하기 위해 이 실행 작업을 디스크에서 메모리로 올립니다. 이 메모리에 올라간 프로그램을 프로세스라고 하죠. 실행하기위해 메모리에 올라가는 나만의 작은 공장같은겁니다.

스레드

프로세스를 메모리로 올렸으면 이제 일꾼이 필요합니다. 프로세스가 올라간다 해도 스레드가 없으면 메모리 공간만 차지하고 있는거죠. 그래서, 프로세스가 올라가면 기본적으로 하나의 스레드가 할당이 됩니다. 이 최초할당되는 스레드를 메인 스레드라고 부릅니다. 스레드가 몇개가 올라가든 일단 스레드가 일을 해서 저희에게 화면을 띄워주고 검색을 할 수 있는거죠.

여기서 AI가 말해줬던 멀티스레드 라는 개념이 나오는데요, 쉽게말해 멀티스레드는 “스레드 잔뜩 할당하기” 입니다. 기존에 제가 개발한 형편없는 다운로더 프로그램은 하나의 스레드(메인스레드)로만 일을합니다. 그래서 실제로 프로그램이 실행되고 URL을 입력하면 하나의 파일을 전부 다운받기 전까지는 이 프로그램으로 다른 일을 처리할수가 없어요.

하지만 개발자는 프로그램을 개발할 때, 스레드를 몇개 생성할지 결정할 수 있습니다. 제가 개발한 다운로더는 하나만 생성한거죠. 여기서 스레드를 여러개 할당해서, 여러 파일을 동시에 다운받을 수 있게 하는것이 멀티스레딩 작업입니다.

프로세스와 스레드의 차이

위에 정리 글을 보시면 머리로는 이해 되지만 말로 내뱉으려하니 설명할 자신이 없다.

AI는 다음과 같이 말해줬다.

프로세스는 운영체제로부터 자원을 할당받는 실행 단위이고, 스레드는 그 프로세스 내에서 실제로 작업을 수행하는 흐름의 단위

내 식대로 정리해보자면

프로세스는 하드웨어 자원을 할당받는 주체이며, 스레드는 실제로 그 자원을 사용하는 실체이다.

가 아닐까? 맞는것같긴한데 ㅎ;;

그래서 12스레드랑 프로세스의 스레드랑 뭔차이?

6코어 12스레드란건, 6개의 계산기(실제로 현미경으로 비추면 보임)에 통신하는 통로를 2개씩 뚫어놓은것이다.
그럼이제 이 12개의 통로를 아까 그 프로세스의 스레드가 0.000001초씩 바꿔가면서 계산기로 들어가는것(점유)이다. 여기서의 ‘점유’라는 개념이 CPU자원을 ‘사용’하는것이다.

정리

정리해보면, 운영체제는 프로그램을 단순히 실행시키는 존재가 아니라 하드웨어 자원을 관리하며 프로그램이 실행될 수 있는 환경을 제공한다. 디스크에 저장된 프로그램은 실행되는 순간 프로세스로 변환되어
운영체제의 관리 대상이 되고, 그 프로세스 안에서 실제로 CPU를 할당받아 코드를 실행하는 주체가 바로 스레드다.
결국 운영체제, 프로세스, 스레드는 포함 관계도 맞지만, 역할과 책임이 분리된 실행 구조로 이해하는 것이 더 정확해보인다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다