프로세스 vs 스레드
저번 정리에서 프로세스와 스레드의 차이를 간단하게 정리했습니다.
이번에는 각 개념이 왜 중요한지, 그리고 현대 운영체제에서 어떻게 활용되는 지에 대해 설명해보려 합니다.
1. 프로세스 (Process)
프로세스는 단순히 ‘실행 중인 프로그램’을 넘어, 운영체제가 관리하는 독립적인 작업의 단위입니다.
각 프로세스는 자신만의 고유한 메모리 공간(코드, 데이터, 스택, 힙)을 할당받아, 마치 자신만이 컴퓨터의 모든 자원을 독점하는 것처럼 작동합니다.
- 독립성의 중요성 : 이러한 독립성 덕분에 한 프로세스에 오류가 발생해도 다른 프로세스에 영향을 미치지 않아 시스템 전체의 안정성을 보장할 수 있습니다.
- 예로, 웹 브라우저에서 탭 하나가 비정상적으로 종료되어도 다른 탭이나 전체 브라우저가 다운되지 않는 이유가 바로 이 프로세스 격리(Process Isolation) 덕분입니다.
- 프로세스 제어 블록(PCB, Process Control Block) : 운영체제는 각 프로세스의 정보를 PCB에 저장하여 관리합니다.
PCB에는 프로세스의 상태(준비, 실행, 대기), 프로그램 카운터(PC), 레지스터 값 등 프로세스 관리에 필요한 모든 정보가 담겨 있습니다.
2. 스레드(Thread)
스레드는 한 프로세스 내에서 동시에 여러 작업을 수행하기 위한 경량화된 실행 단위(작업 갈래)입니다.
프로세스가 운영체제로부터 독립된 자원을 할당받아 실행되는 프로그램이라면, 스레드는 그 프로세스 안에서 실행되는 작업 흐름입니다.
하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이 스레드들은 코드/데이터/힙 메모리를 공유하지만, 각자 독립적인 스택을 가집니다.
예를 들어, 크롬 브라우저가 하나의 프로세스라면, 파일을 다운로드하는 작업과 웹 서핑을 위해 구글링을 하는 작업이 각각 다른 스레드로 동작하는 것입니다. 즉, 하나의 프로세스 안에서 여러 작업 흐름이 동시에 진행되는데, 이 흐름들을 스레드라고 합니다.
스레드의 장점
- 자원 공유를 통한 효율성 : 스레드는 부모 프로세스의 메모리 공간과 자원을 공유하기 때문에, 스레드 간의 통신이 매우 빠르고 효율적입니다. 별도의 통신 매커니즘 없이도 데이터에 직접 접근할 수 있습니다.
- Context Switching 비용 절감 : 프로세스 간 스위칭보다 저장하고 복원할 정보가 적어 오버헤드가 작고 더 빠르게 전환할 수 있습니다.
3. 현대 멀티테스킹의 핵심
현대 운영체제에서는 멀티 프로세스와 멀티 스레드를 결합하여 사용합니다.
- 멀티 프로세스 : 여러 응용 프로그램(예: 웹 브라우저, 워드 프로세스)을 독립적인 프로세스로 실행하여 안정성을 확보합니다.
- 멀티 스레드 : 하나의 응용 프로그램 내에서 여러 작업을 동시에 처리합니다. (예: 워드 프로세서에서 사용자 입력과 맞춤법 검사를 동시에 수행)
결론적으로, 프로세스는 프로그램 간의 안정적인 분리를, 스레드는 프로그램 내에서 효율적인 동시성을 담당하며 서로 보완적인 관계를 이룹니다.
컨텍스트 스위칭(Context Switching)
컨텍스트 스위칭은 CPU가 하나의 작업(프로세스 또는 스레드)에서 다른 작업으로 실행 흐름을 전환하는 과정을 말하며, 커널(Kernel)에 의해 수행됩니다. 여러 프로그램이 동시에 실행되는 것처럼 보이는 멀티태스킹의 핵심 원리입니다.
예를 들어, 음악을 들으면서 웹 서핑을 할 때, CPU는 아주 짧은 시간 간격으로 두 프로세스를 번갈아 가며 실행합니다. 이때 한 프로세스의 실행을 멈추고 다른 프로세스로 넘어가는 과정이 바로 컨텍스트 스위칭입니다.
1. 컨텍스트 스위칭이 필요한 이유
- 동시성 확보: 여러 프로세스와 스레드들이 동시에 실행되는 것처럼 보이기 위해
- 공정한 자원 분배: 여러 프로세스와 스레드들이 CPU 시간을 공정하게 나눠 갖기 위해
- 우선순위 관리: 높은 우선순위의 작업이 빠르게 처리될 수 있도록 하기 위해
2. 발생 시점
- 주어진 타임 슬라이스(Time Slice)를 다 사용했을 때
- I/O 작업을 위해 CPU를 반납하거나, 다른 리소스를 기다려야 할 때
- 인터럽트(Interupt)가 발생했을 때
3. 작동 방식
- 컨텍스트 저장(Save Context): 현재 작업의 상태(레지스터, PC 등)를 PCB에 저장합니다.
- 새 컨텍스트 불러오기(Load Context): 다음 작업의 저장된 컨텍스트를 불러와 CPU에 복원합니다.
- 실행 재개(Resume Execution): 새로운 작업이 이전에 멈췄던 지점부터 실행을 다시 시작합니다.
위의 과정은 매우 빠르게 진행되므로, 사용자 입장에서는 마치 두 프로그램이 동시에 실행되는 것처럼 느껴집니다.
4. 컨텍스트 스위칭의 오버헤드(Overhead)
컨텍스트 스위칭은 CPU 자원을 소모하는 작업입니다. 컨텍스트를 저장하고 불러오는 데 시간이 걸리기 때문입니다.
이처럼 어떤 작업의 실행을 위해 소요되는 추가적인 시간과 자원을 오버헤드라고 합니다.
만약 컨텍스트 스위칭이 너무 자주 발생하면, CPU는 실제 작업(연산)보다 컨텍스트를 저장하고 불러오는 데 더 많은 시간을 낭비하게 됩니다. 이는 시스템의 성능 저하로 이어질 수 있습니다. 따라서 운영체제는 컨텍스트 스위칭의 횟수를 적절하게 조절하여 효율성을 유지합니다.
5. 프로세스 컨텍스트 스위칭 vs 스레드 컨텍스트 스위칭
공통점
- 커널 모드에서 실행됩니다.
- CPU의 레지스터 상태를 교체합니다.
차이점
두 스위칭의 가장 큰 차이점은 저장 및 복원해야 하는 정보의 범위입니다.
| 프로세스 컨텍스트 스위칭 | 스레드 컨텍스트 스위칭 |
|---|
| 대상 | 서로 다른 프로세스 | 같은 프로세스 내의 스레드 |
| 자원 공유 | 독립적 | 공유(부모 프로세스의 메모리 공간 등 공유) |
| 전환 비용 | 매우 큼 | 매우 작음 |
| 이유 | 독립적인 모든 자원을 저장 및 복원 | 스레드 고유의 정보(스택 등)만 저장 및 복원 |
- 프로세스 컨텍스트 스위칭: 한 프로세스에서 다른 독립적인 프로세스로 전환하기 때문에, 고유한 주소 공간과 같은 모든 자원을 저장하고 복원해야 합니다. 이 과정은 복잡하고 많은 시간이 소요됩니다.
- 스레드 컨텍스트 스위칭: 같은 프로세스 내의 스레드 간에 전환되므로, 스레드 고유의 정보(스택, 레지스터 등)만 저장하고 복원하면 됩니다. 따라서 프로세스 컨텍스트 스위칭보다 훨씬 빠르고 효율적입니다.
CPU 스케줄링 알고리즘
CPU 스케줄링은 여러 프로세스에게 CPU를 어떻게 할당할지 결정하는 규칙입니다. 운영체제는 이 알고리즘을 사용해 한정된 CPU 자원을 효율적으로 분배합니다.
비선점형(Non-preemptive) 스케줄링
CPU를 할당받은 프로세스가 작업을 마칠 때까지 CPU를 계속 점유하는 방식입니다. 긴급한 작업이 들어와도 현재 프로세스가 스스로 CPU를 반납하기 전까지는 기다려야 합니다.
1. 선입 선처리 (FCFS: First-Come, First-Served)
- 방식: 먼저 CPU를 요청한 프로세스가 먼저 실행됩니다.
- 단점: 긴 작업이 먼저 도착하면 뒤에 있는 짧은 작업들이 오래 대기하는 '호위 효과(Convoy Effect)'가 발생할 수 있습니다.
2. 비선점형 최단 작업 우선 (SJF: Shortest Job First)
- 방식: 실행 시간이 가장 짧은 프로세스가 먼저 실행됩니다.
- 단점: 실행 시간을 정확히 예측하기 어렵고, 긴 작업은 기아(Starvation) 현상을 겪을 수 있습니다.
3. 비선점형 우선순위 스케줄링 (Priority Scheduling)
- 방식: 우선순위가 가장 높은 프로세스가 먼저 실행되지만, 일단 시작되면 중간에 중단되지 않습니다.
선점형(Preemptive) 스케줄링
더 높은 우선순위의 프로세스나 할당된 시간이 끝난 프로세스로부터 CPU를 강제로 빼앗아 다른 프로세스에게 할당하는 방식입니다.
1. 라운드 로빈 (RR: Round Robin)
- 방식: 각 프로세스에게 타임 슬라이스(Time Slice)라는 동일한 시간을 할당하고, 시간이 끝나면 강제로 CPU를 빼앗아 다음 프로세스에게 넘깁니다.
- 장점: 모든 프로세스가 CPU를 공평하게 사용하므로 대화형 시스템에 적합합니다.
2. 선점형 최단 작업 우선 (SRTF: Shortest Remaining Time First)
- 방식: 새로운 프로세스가 도착했을 때, 현재 실행 중인 프로세스보다 남은 실행 시간이 더 짧으면 CPU를 빼앗습니다. SJF의 선점형 버전입니다.
3. 선점형 우선순위 스케줄링 (Priority Scheduling)
- 방식: 우선순위가 더 높은 프로세스가 도착하면 현재 실행 중인 프로세스의 CPU를 빼앗습니다.
- 해결책: 노화(Aging) 기법을 통해 대기 시간이 긴 프로세스의 우선순위를 높여 기아 현상을 방지할 수 있습니다.
정리 및 비교
| 구분 | 비선점형 | 선점형 |
|---|
| CPU 제어권 | 프로세스가 자율적으로 반납 | 운영체제가 강제로 회수 |
| 컨텍스트 스위칭 | 빈번하지 않음 (오버헤드 적음) | 자주 발생함 (오버헤드 큼) |
| 적합한 환경 | 일괄 처리(Batch Processing) | 시분할 시스템, 실시간 시스템 (응답 속도가 중요한 환경) |
| 장점 | 오버헤드가 적어 안정적 | 응답 시간이 빠르고 공정함 |
| 단점 | 긴 작업이 뒤의 짧은 작업을 지연시킬 수 있음 | 잦은 스위칭으로 인한 성능 저하 |
표를 넣어가면서 잘 정리해주셔서 이해하기 좋았어요!