운영체제로부터 자원을 할당받은 작업의 단위
프로세스는 컴퓨터에서 어떤 일을 처리하기 위해 실행되는 프로그램 단위이다. 프로그램이 실행되면, 메모리에 올라가고 운영체제로부터 자원을 할당받아 동적으로 변한다. 이 상태의 프로그램을 프로세스라 부른다. 프로세스는 각기 독립된 메모리 영역(Code, Data, Stack, Heap)을 가지고 있다.
우리가 컴퓨터에서 게임을 할 때, 그 게임은 하나의 프로세스이고, 웹 브라우저도 하나의 프로세스이다.
프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
스레드는 프로세스 안에서 실제 작업을 수행하는 더 작은 단위이다. 한 프로세스 안에는 여러 개의 스레드가 존재할 수 있으며, 이들은 프로세스의 자원을 공유하면서 동시에 작업을 수행한다.
게임을 할 때, 게임 화면을 그리는 스레드, 게임 소리를 재생하는 스레드, 그리고 키보드와 마우스를 처리하는 스레드가 있을 수 있다. 웹 브라우저에서도 여러 개의 탭을 동시에 사용할 수 있는데, 각 탭이 스레드이다.
프로그램은 우리가 흔히 사용하는 윈도우의 .exe 파일이나 Mac의 .dmg 파일처럼 컴퓨터에서 실행할 수 있는 파일을 의미한다. 프로그램은 아직 실행되지 않은 상태이기 때문에 정적 프로그램(Static Program)이라 부른다. 예를 들어, 게임이나 웹 브라우저, 그림 그리기 앱 등은 모두 프로그램이다.
프로그램이 실행되면, 이는 프로세스로 변한다. 즉, 정적인 프로그램이 동적으로 변하여 컴퓨터에서 작업 중인 상태가 된다. 프로세스는 메모리 공간을 할당받아 프로그램 코드를 실행시키고, 우리가 해당 프로그램을 사용할 수 있게 한다. 작업 관리자에서 실행 중인 프로그램 목록을 볼 수 있는 것처럼, 각 프로세스는 컴퓨터에서 개별적인 작업 단위로 관리된다.
프로세스는 다음과 같은 네 가지 메모리 영역으로 구성된다.
📌 코드 영역 (Code / Text): 실행할 코드가 저장된 공간.
📌 데이터 영역 (Data): 초기화된 전역 변수와 static 변수가 저장된 공간.
📌 스택 영역 (Stack): 함수 호출 시 사용되는 지역 변수와 호출 정보를 저장한 공간.
📌 힙 영역 (Heap): 동적으로 할당되는 메모리가 저장된 공간.
스레드는 프로세스의 메모리 영역 중 Code, Data, Heap 영역을 공유하고, Stack 영역은 각각 독립적으로 사용한다. 따라서 스레드는 같은 프로세스 내에서 메모리를 효율적으로 사용할 수 있지만, 동기화 문제를 일으킬 가능성도 있다.
멀티태스킹과 멀티스레딩은 컴퓨터에서 여러 작업을 동시에 수행하는 능력을 의미한다. 프로세스는 멀티태스킹(Multitasking)을 통해 여러 프로세스를 동시에 실행하고, 스레드는 멀티스레딩(Multithreading)을 통해 하나의 프로세스 내에서 여러 스레드를 동시에 실행한다.
멀티태스킹은 하나의 운영체제에서 여러 프로세스가 동시에 실행되는 것처럼 보이게 하는 기술이다. 이 기술은 동시성(Concurrency)과 병렬성(Parallelism) 두 가지 주요 방법으로 구현된다.
동시성은 단일 코어에서 여러 작업을 번갈아 가며 실행하는 것이다. CPU는 각 작업을 빠르게 전환하여 실행하며, 이 과정은 매우 빠르게 일어나기 때문에 사용자는 여러 작업이 동시에 실행되는 것처럼 느낄 수 있다. 동시성은 다음과 같은 과정을 통해 이루어진다.
컨텍스트 스위칭
CPU가 한 작업에서 다른 작업으로 전환할 때, 현재 작업의 상태를 저장하고, 새로운 작업의 상태를 복원하는 과정이다. 이 과정은 빠르지만, 오버헤드가 발생할 수 있다.
스케줄러
운영체제의 스케줄러는 어떤 작업을 언제 실행할지 결정한다. 스케줄러는 작업의 우선순위, 작업량 등을 고려하여 효율적으로 작업을 배치한다.
병렬성은 멀티코어 시스템에서 여러 작업을 실제로 동시에 실행하는 것이다. 각 코어가 독립적으로 작업을 수행하므로, 여러 작업이 진정으로 동시에 실행될 수 있다. 병렬성은 다음과 같은 장점을 제공한다.
성능 향상
여러 작업이 동시에 실행되므로, 전체적인 처리 속도가 향상된다.
효율적인 자원 사용
멀티코어 시스템의 모든 코어를 효율적으로 활용할 수 있다.
멀티스레딩은 하나의 프로세스 내에서 여러 스레드가 동시에 실행되는 것이다. 스레드는 프로세스 내에서 자원을 공유하면서 독립적인 실행 흐름을 가지므로, 멀티스레딩을 통해 프로그램의 성능을 크게 향상시킬 수 있다. 멀티스레딩은 다음과 같은 방식으로 구현된다.
유저 스레드 (User Threads)
유저 스레드는 사용자 애플리케이션에서 직접 관리된다. 운영체제의 커널은 유저 스레드에 대해 알지 못하며, 스케줄링과 관리는 애플리케이션이 직접 처리한다.
커널 스레드 (Kernel Threads)
커널 스레드는 운영체제 커널에서 관리한다. 운영체제는 커널 스레드에 대해 알고 있으며, 스케줄링과 관리를 직접 수행한다.
빠른 응답 시간: 스레드 간의 통신이 빠르므로, 응답 시간이 짧다.
자원 절약: 스레드는 프로세스 내에서 메모리를 공유하므로, 자원을 효율적으로 사용할 수 있다.
단순한 통신: 스레드 간의 통신이 프로세스 간의 통신보다 간단하다.
동기화 문제: 여러 스레드가 동일한 자원에 접근할 때 동기화 문제가 발생할 수 있다.
디버깅 어려움: 멀티스레딩 프로그램은 디버깅이 어렵고 복잡하다.
멀티태스킹은 여러 프로세스를 동시에 실행하는 것이며, 멀티스레딩은 하나의 프로세스 내에서 여러 스레드를 동시에 실행하는 것이다.
멀티태스킹에서는 각 프로세스가 독립된 메모리 공간을 사용하지만, 멀티스레딩에서는 스레드가 동일한 메모리 공간을 공유한다.
멀티태스킹에서는 프로세스 간의 통신 비용이 크지만, 멀티스레딩에서는 스레드 간의 통신 비용이 적다.
멀티태스킹에서는 한 프로세스의 오류가 다른 프로세스에 영향을 미치지 않지만, 멀티스레딩에서는 한 스레드의 오류가 다른 스레드에 영향을 미칠 수 있다.
프로세스: 운영체제는 프로세스를 관리하고, CPU를 사용할 프로세스를 선택하는 작업을 한다. 프로세스의 우선순위, 작업량 등을 고려하여 효율적으로 배치하는 방식이다.
스레드: 스레드 스케줄링은 프로세스 내에서 다중 스레드를 관리하며, CPU를 사용할 스레드를 선택하는 작업을 의미한다. 스레드 간의 상호작용과 동기화 문제를 고려해야 한다는 점에서 프로세스 스케줄링과 차이가 있다.
💡 스케줄링 (Scheduling)
스케줄링은 운영체제가 CPU 자원을 여러 프로세스나 스레드에 효율적으로 분배하는 과정을 의미한다. 이는 컴퓨터 시스템의 성능을 최적화하고, 모든 작업이 공정하게 실행되도록 보장하는 중요한 기능이다.