안녕하세요. 꿀발자입니다. 오늘은 운영체제에서 중요한 개념인 프로세스 vs 스레드 생명 주기에 대해 알아보겠습니다. 프로세스와 스레드는 운영체제의 핵심 요소로, 각각의 생명 주기를 이해하는 것이 시스템 성능과 안정성에 큰 영향을 미칩니다. 이 글에서는 프로세스와 스레드가 어떻게 스케줄링되고, 어떤 상태를 거쳐 종료되는지에 대해 살펴보겠습니다.
프로세스 스케줄링
프로세스 스케줄링은 운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업을 의미합니다. 이 과정에서 프로세스의 우선순위, 작업량, 시스템 요구사항 등을 고려하여 최적의 배치를 결정하게 됩니다. 이는 멀티태스킹 환경에서 매우 중요한 역할을 하며, 시스템 전체의 성능 향상에 기여합니다.
운영체제는 다양한 스케줄링 알고리즘을 사용합니다. 대표적인 알고리즘은 다음과 같습니다.
스케줄링 알고리즘 | 설명 |
FCFS (First-Come, First-Served) | 가장 먼저 도착한 프로세스가 먼저 CPU를 할당받습니다. |
SJF (Shortest-Job-First) | 실행 시간이 가장 짧은 프로세스가 우선적으로 CPU를 할당받습니다. |
RR (Round-Robin) | 각 프로세스에 일정한 시간 동안 CPU를 할당하며, 시간이 끝나면 다음 프로세스로 전환합니다. |
Multilevel Queue | 프로세스들을 여러 큐로 나누어 우선순위에 따라 스케줄링합니다. |
Priority | 프로세스의 우선순위에 따라 CPU를 할당합니다. |
프로세스 상태
프로세스 상태는 실행되는 동안 여러 상태를 거치며, 이를 통해 운영체제는 프로세스를 효율적으로 관리합니다. 주요 프로세스 상태는 다음과 같습니다.
프로세스 상태 | 설명 |
생성 (New) | 프로세스가 생성되고 아직 준비되지 않은 상태입니다. |
준비 (Ready) | 프로세스가 CPU를 할당받기 위해 기다리는 상태로, 언제든지 실행될 준비가 되어 있습니다. |
실행 (Running) | 프로세스가 CPU를 할당받아 실행 중인 상태입니다. |
대기 (Waiting) | 프로세스가 특정 이벤트를 기다리며 대기하는 상태입니다. 이 상태에서는 CPU를 사용하지 않으며, 이벤트가 발생하면 다시 준비 상태로 돌아갑니다. |
종료 (Terminated) | 프로세스가 모든 작업을 완료하고 종료된 상태입니다. 이때 메모리에서 프로세스가 제거됩니다. |
프로세스 상태 전이
프로세스 상태 전이는 프로세스가 실행되는 동안 운영체제에 의해 상태가 변경되는 과정을 의미합니다. 상태 전이는 프로세스의 진행 상황과 운영체제의 요구에 따라 이루어지며, 이는 효율적인 시스템 운영을 위해 필수적인 과정입니다. 예를 들어, 준비 상태에 있던 프로세스가 실행 상태로 전환되거나, 실행 중이던 프로세스가 대기 상태로 전환될 수 있습니다. 이러한 전이는 스케쥴러의 결정에 따라 이루어집니다.
- Admitted (new → ready) : 프로세스 생성을 승인
- Dispatch (ready→ running) : 준비 상태에 있는 여러 프로세스들 중 하나가 스케줄러에 의해 실행
- Interrupt (running → ready) : Timeout, 예기치 않은 이벤트가 발생하여 현재 실행 중인 프로세스를 준비 상태로 전환하고, 해당 작업 선 처리 상태
- I/O or event wait (running → wainting) : 실행 중인 프로세스가 입출력이나 이벤트를 처리해야 하는 경우, 입출력이나 이벤트가 끝날 때까지 대기 상태로 전환
- I/O or event completion (waiting → ready) : 입출력이나 이벤트가 모두 끝난 프로세스를 다시 준비 상태로 만들어 스케줄러에 의해 선택될 수 있는 상태로 전환
스레드 스케줄링
스레드 스케줄링은 프로세스 스케줄링과 유사하지만, 스레드는 프로세스 내에서 동작하는 단위이기 때문에 몇 가지 차이점이 있습니다. 스레드 간의 상호작용과 동기화 문제를 고려해야 하며, 이를 통해 다중 스레드 환경에서 효율적인 CPU 할당이 이루어집니다.
대표적인 스레드 스케줄링 알고리즘은 다음과 같습니다.
스케줄링 알고리즘 | 설명 |
RR (Round-Robin) | 각 스레드에 일정한 시간 동안 CPU를 할당하며, 시간이 끝나면 다음 스레드로 전환합니다. |
Priority-based scheduling | 스레드의 우선순위에 따라 CPU를 할당합니다. |
Multi-level Queue scheduling | 스레드를 여러 큐로 나누어 우선순위에 따라 스케줄링합니다. |
스레드 상태
스레드 상태도 프로세스 상태와 유사하게 여러 상태를 거칩니다. 주요 스레드 상태는 다음과 같습니다.
스레드 상태 | 상태명 | 설명 |
스레드 객체 생성 | NEW | 스레드가 생성되고 아직 호출되지 않은 상태 |
실행 대기 | RUNNABLE | 스레드가 실행되기 위해 기다리는 상태CPU를 할당받을 수 있는 상태 언제든지 실행될 준비가 되어있다. |
일시 정지 | WAITING | 다른 쓰레드가 특정 작업을 수행하기를 기다리는 상태 |
일시 정지 | TIMED_WAITING | 지정된 대기 시간 동안 대기하는 상태 |
일시 정지 | BLOCKED | 스레드가 특정 이벤트(입출력 요청 등)가 발생하여 대기하는 상태 CPU를 할당받지 못하며, 이벤트가 발생하여 다시 RUNNABLE 상태로 전환될 때까지 차단(Blocked) 된 상태 |
종료 | TERMINATED | 스레드가 실행을 완료하고 종료된 상태 더 이상 실행될 수 없으며, 메모리에서 제거된다. |
스레드 상태 전이
스레드 상태 전이에 대한 제어를 간단히 표현한 그림입니다.
- 생성(New) : 스레드가 처음 생성된 상태로, 아직 시작되지 않았습니다. 예를 들어 Thread t = new Thread();와 같이 생성만 한 상태입니다.
- 실행 가능(Runnable) : start() 메서드를 호출하면 스레드는 실행 가능 상태가 됩니다. 이 상태에서는 CPU가 할당되면 실행될 준비가 되어 있으며, 실행될 수도 있고 대기할 수도 있습니다.
- 실행 중(Running) : 실행 가능 상태에 있던 스레드가 CPU 시간을 할당받아 실제로 코드가 실행되는 상태입니다. 대부분의 작업이 이 상태에서 이루어집니다.
- 차단(Blocked) : 스레드가 특정 자원을 사용하려다 다른 스레드가 자원을 사용 중인 경우, 해당 자원이 해제될 때까지 기다리며 Blocked 상태가 됩니다. 자원이 사용 가능해지면 다시 실행 가능 상태로 돌아갑니다.
- 대기(Waiting) : 스레드가 특정 조건이나 이벤트가 발생하기를 기다리는 상태입니다. 예를 들어 wait() 메서드 호출로 대기할 때는, 다른 스레드의 notify()나 notifyAll() 호출이 필요합니다.
- 시간 제한 대기(Timed Waiting) : 일정 시간 동안 대기하도록 설정된 상태입니다. 예를 들어 sleep(long millis)나 wait(long timeout)처럼 제한된 시간 동안만 대기하고, 시간이 지나면 자동으로 실행 가능 상태로 돌아갑니다.
- 종료(Terminated) : 스레드의 작업이 모두 완료되면 종료 상태가 됩니다. 이 상태에서는 스레드가 더 이상 실행되지 않으며, 자원은 해제됩니다.
https://honey-dev.com/프로그램-vs-프로세스-차이점/
https://honey-dev.com/프로세스와-스레드-차이/
Final Thoughts
프로세스와 스레드는 운영체제의 중요한 구성 요소로, 각자의 생명 주기를 통해 효율적인 시스템 운영을 돕습니다. 프로세스는 독립적인 작업에 적합하고, 스레드는 빠른 문맥 전환과 자원 공유에 유리합니다. 이 두 개념을 이해하면 시스템 성능 최적화와 안정성 향상에 큰 도움이 될 것입니다. (프로세스 및 스레드 정보)