프로세스와 스레드
이 글에서는 자바의 스레드(Thread)를 이해하기에 앞서 운영체제를 공부하게 되면 접하게 되는 프로세스와 스레드를 알아간다.
간단히 설명을 달아보면 프로세스는 운영체제로부터 필요한 자원을 할당받은 작업의 단위로 보면 되고, 스레드는 이러한 프로세스의 자원을 활용해 실제 작업을 수행하는 단위라고 알고 가면 된다.
프로세스
프로세스에 이해하기에 앞서 프로세스와 프로그램의 차이를 명확히 짚어볼 필요가 있다.
프로그램은 컴퓨터에서 실행 가능한 파일을 의미한다.
하지만 이 파일이 아직 실행되지 않은 상태라면, 이를 정적 프로그램(Static Program) 또는 줄여서 프로그램(Program)이라고 부른다.
이를 다르게 해석하면 자바같은 프로그래밍 언어로 작성된 코드의 집합이라고 볼 수 있다.
그리고 프로세스란 프로그램이 실행된 상태를 말한다.
즉, 정적인 프로그램이 동적으로 변하여 실행 중인 상태를 나타내는 개념이다.
프로그램은 코드의 집합이고, 프로세스는 그 코드를 실행한 결과라고 이해하면 된다.
모든 프로그램이 실행되려면 운영체제가 메모리 공간을 할당해 주어야 한다. 프로그램을 실행하는 순간, 파일은 컴퓨터의 메모리에 올라가고, 운영체제로부터 시스템 자원(CPU 등)을 할당받아 프로그램 코드가 실행된다. 이를 통해 사용자는 서비스를 이용할 수 있다. 즉, 프로그램 → 프로세스의 과정을 거치게 된다.
스레드
과거에는 프로그램을 실행할 때 하나의 프로세스만을 사용하여 작업을 처리했지만, 기술이 발전하고 프로그램이 복잡해지면서 단일 프로세스로는 멀티태스킹과 자원 효율성을 충족하기 어려운 한계가 있었다. 동일한 프로그램을 여러 프로세스로 실행하면 각 프로세스가 독립적인 메모리를 점유해 자원이 낭비되었고, 성능 저하를 초래했다. 또한, 프로세스 생성과 전환에는 높은 오버헤드가 발생해 실시간 처리가 어려웠다. 이러한 문제를 해결하기 위해 스레드라는 개념이 등장하게 됐다.
스레드 개념
스레드는 하나의 프로세스 내에서 동시에 실행되는 작업 흐름의 단위를 의미한다. 설명을 돕자면, 브라우저를 실행하면 하나의 프로세스가 생성된다. 이때, 유튜브를 재생하면서 웹 서핑을 하는 등의 작업을 동시에 할 수 있다. 이처럼 하나의 프로세스 내부에서 여러 작업이 동시에 진행될 수 있는 이유는 바로 스레드 덕분이다. 설명을 덧붙이자면 이러한 스레드를 다중으로 실행하는 경우를 멀티스레드라고 한다.
스레드와 프로세스의 관계
일반적으로 하나의 프로그램은 하나 이상의 프로세스를 가지고, 하나의 프로세스는 반드시 하나 이상의 스레드를 포함한다. 즉, 프로세스를 생성하면 기본적으로 하나의 **메인 스레드(main thread)**가 생성된다.