운영체제 공룡책: 3장 Process Management
3.1 Process Concept
프로세스 정의:
실행 중인 프로그램을 의미하며, 프로그램 카운터와 프로세서 레지스터의 상태로 현재 활동이 표현됨.
프로그램과의 차이점:
- 프로그램은 디스크에 저장된 명령어의 집합으로 수동적(entity)이다.
- 프로세스는 실행 중이며 자원을 가진 능동적(entity)이다.
3.1.1 The Process
프로세스 메모리 구조:
- 텍스트 섹션: 실행 코드 (크기 고정).
- 데이터 섹션: 전역 변수 (크기 고정).
- 스택: 함수 호출 시 매개변수, 반환 주소, 지역 변수를 저장하며 동적으로 변함.
- 힙: 동적 메모리 할당 시 확장 및 축소 가능.
프로세스와 작업(job)의 관계:
- 프로세스는 현대적 용어, 작업(job)은 초기 운영체제의 용어로 역사적 의미가 있음.
프로세스 생성:
- 실행 파일을 메모리에 로드하면 프로세스가 생성됨.
- 동일 프로그램도 실행마다 별개의 프로세스로 간주.
3.1.2 Process State
프로세스 상태
프로세스는 실행 중 상태가 변하며, 다음과 같은 상태를 가질 수 있다
- New: 프로세스가 생성 중인 상태.
- Running: 프로세서에서 명령어가 실행 중인 상태.
- Waiting: 특정 이벤트(I/O 완료, 신호 수신 등)를 기다리는 상태.
- Ready: 프로세서 할당을 기다리는 상태.
- Terminated: 실행을 완료한 상태.
※ 중요 사항
- 각 상태의 명칭은 운영체제마다 다를 수 있으나, 개념은 공통적임.
- 일부 운영체제는 프로세스 상태를 더 세분화하여 관리함.
- 하나의 프로세서(또는 코어)는 동시에 하나의 프로세스만 실행 가능.
- 다수의 프로세스가 Ready 또는 Waiting 상태로 대기할 수 있음.
3.1.3 프로세스 제어 블록(PCB, Process Control Block)
PCB란?
- 운영체제가 프로세스를 관리하기 위해 사용하는 데이터 구조.
- 각 프로세스에 대한 정보를 저장하며, 프로세스 실행 및 재개에 필요한 데이터를 포함.
PCB에 저장되는 정보
- 프로세스 상태(Process state): New, Ready, Running, Waiting, Terminated 등.
- 프로그램 카운터(Program counter): 다음에 실행할 명령어의 메모리 주소.
- CPU 레지스터(CPU registers): 프로세서 아키텍처에 따라 다양한 레지스터(누산기, 스택 포인터, 조건 코드 등)를 포함하며, 프로세스가 중단될 때 저장됨.
- CPU 스케줄링 정보(CPU-scheduling information): 프로세스 우선순위, 스케줄링 큐 포인터, 기타 스케줄링 매개변수.
- 메모리 관리 정보(Memory-management information): 베이스 및 제한 레지스터, 페이지 테이블 또는 세그먼트 테이블 정보.
- 회계 정보(Accounting information): CPU 사용 시간, 실시간 사용량, 시간 제한, 계정 번호, 작업 또는 프로세스 번호 등.
- I/O 상태 정보(I/O status information): 할당된 I/O 장치 목록, 열린 파일 목록 등.
3.1.4 Threads
스레드(Threads)란?
프로세스가 작업을 진행하는 단일 실행 흐름(thread of execution).
- 예: 워드 프로세서가 실행 중일 때, 하나의 명령어 흐름만 처리 가능.
- 단일 스레드는 동시에 여러 작업(입력과 맞춤법 검사 등)을 수행할 수 없음.
멀티스레드(multiple threads)란?
현대 운영체제는 프로세스가 여러 스레드를 가질 수 있도록 확장.
- 멀티스레드 프로세스: 하나의 프로세스가 여러 작업을 병렬로 수행.
- 예: 워드 프로세서에서 입력 처리를 담당하는 스레드와 맞춤법 검사를 수행하는 스레드가 동시에 실행.
- 특히 멀티코어 시스템에서 멀티스레드는 병렬 처리를 통해 성능을 극대화.
3.2 Process Scheduling
다중 프로그래밍과 시분할의 목표
- 다중 프로그래밍(Multiprogramming)
- CPU를 항상 바쁘게 유지하여 CPU 활용도를 극대화.
- 메모리에 여러 프로세스를 유지하며, 하나가 대기 중일 때 다른 프로세스를 실행.
- 시분할(Time Sharing)
- CPU를 프로세스 간에 빠르게 전환하여 사용자와 각 프로그램 간의 상호작용 가능.
프로세스 스케줄링
- 단일 코어 시스템: 한 번에 하나의 프로세스만 실행 가능.
- 다중 코어 시스템: 여러 프로세스를 병렬로 실행 가능.
- 실행 대기 중인 프로세스는 코어가 비워질 때까지 대기하며, 이후 재스케줄링됨.
- 다중 프로그래밍 정도: 메모리에 동시에 적재된 프로세스 수.
프로세스 유형
- I/O-집약적 프로세스:
- 계산보다 I/O 작업에 더 많은 시간을 소모.
- CPU-집약적 프로세스:
- 계산에 더 많은 시간을 소모하며 I/O 요청이 드뭄.
3.2.1 Scheduling Queues
큐의 종류와 역할
- 준비 큐(Ready Queue)
- 실행 준비가 완료된 프로세스들이 대기하는 큐.
- 연결 리스트 형태로 저장: 큐 헤더는 첫 번째 PCB를 가리키며, 각 PCB는 다음 PCB를 가리킴.
- 대기 큐(Wait Queue)
- 특정 이벤트 발생(예: I/O 완료)을 기다리는 프로세스들이 대기.
- 대기 상태에 있다가 이벤트가 발생하면 준비 상태로 전환되어 준비 큐로 이동.
프로세스의 흐름
- 새로운 프로세스는 준비 큐에 추가됨.
- CPU 코어가 할당되면 실행 상태로 전환.
- 실행 중 다음 이벤트 중 하나가 발생:
- I/O 요청: 대기 큐로 이동.
- 자식 프로세스 생성: 자식 프로세스 종료를 기다리며 대기 큐로 이동.
- 타임 슬라이스 만료 또는 인터럽트 발생: 다시 준비 큐로 이동.
- 프로세스는 이러한 상태 전환을 반복하다가 종료되면 모든 큐에서 제거되고 PCB 및 자원이 해제됨.
스케줄링의 시각화
- 큐잉 다이어그램: 프로세스의 흐름(큐 간 이동과 자원 할당)을 시각적으로 표현.
- 원은 자원을, 화살표는 프로세스 이동 경로를 나타냄.
3.2.2 CPU Scheduling
CPU 스케줄러 역할
- 준비 큐에서 실행 가능한 프로세스 중 하나를 선택하여 CPU 코어를 할당.
- 스케줄링 빈도:
- I/O-집약적 프로세스는 몇 밀리초 실행 후 I/O 요청으로 대기 상태로 전환.
- CPU-집약적 프로세스는 상대적으로 긴 시간 실행되지만, CPU 독점을 방지하기 위해 일정 시간 후 강제로 CPU에서 제거됨.
- CPU 스케줄러는 일반적으로 100밀리초 이상 주기로 실행되며, 더 빈번하게 동작할 수도 있음.
스와핑(Swapping)
- 개념:
- 메모리에서 프로세스를 제거해 디스크로 옮기고, 이후 필요할 때 다시 메모리로 복원하여 실행.
- 프로세스의 현재 상태를 저장하고 복원하는 방식으로, 실행 위치를 유지.
- 목적: 메모리가 과다 할당(Overcommitment)된 경우, 메모리를 확보하고 다중 프로그래밍 정도를 줄임.
- 활용 사례: 스와핑은 메모리가 부족한 상황에서만 사용됨.
3.2.3 Context Switch
현재 실행 중인 프로세스의 상태를 저장하고, 다른 프로세스의 상태를 복원하여 CPU 코어에서 실행을 전환하는 작업.
- 프로세스의 컨텍스트는 PCB에 저장되며 다음 정보를 포함:
- CPU 레지스터 값
- 프로세스 상태
- 메모리 관리 정보
동작 원리
- 상태 저장: 현재 프로세스의 상태를 PCB에 저장.
- 상태 복원: 새롭게 스케줄된 프로세스의 PCB에서 상태를 불러와 실행.
※오버헤드 발생: 컨텍스트 스위치 중에는 유용한 작업이 수행되지 않음.
3.3 프로세스 운영(Operations on Processes)
대부분의 시스템에서 프로세스는 동시에 실행될 수 있으며 동적으로 생성 및 삭제될 수 있습니다.
따라서 이러한 시스템은 프로세스 생성 및 종료를 위한 메커니즘을 제공해야 한다.
3.3.1 Process Creation
부모 프로세스(parent)가 새로운 자식 프로세스(child)를 생성하며, 이를 통해 프로세스 트리가 형성됨.
- 자식 프로세스는 고유한 PID(Process Identifier)로 식별.
자원 할당
- 자식 프로세스는 CPU 시간, 메모리, 파일, I/O 장치 등의 자원을 필요로 함.
- 자원 할당 방법:
- 부모가 자원을 나누어 제공.
- 운영체제가 자원을 직접 제공.
- 자원 제한은 시스템 과부하를 방지.
실행 및 주소 공간의 선택
- 실행 방식
- 부모와 자식이 병렬 실행.
- 부모가 자식 종료 대기.
- 주소 공간
- 자식이 부모의 주소 공간 복제.
- 자식에 새로운 프로그램 로드.
3.3.2 프로세스 종료(Process Termination)
1. 정상적인 종료
- exit() 시스템 호출로 프로세스 종료를 요청.
- 종료 시, 상태 값(exit status)을 부모 프로세스에 반환 가능.
- 프로세스의 모든 자원(CPU, 메모리, 열려 있는 파일, I/O 버퍼 등)은 운영체제에 의해 해제되고 회수됨.
2. 비정상 종료 및 강제 종료
- 부모 프로세스가 자식을 강제로 종료 가능
- 강제 종료 이유:
- 자식이 할당된 자원을 초과 사용.
- 자식 작업이 더 이상 필요하지 않음.
- 부모가 종료되어 자식도 더 이상 실행 불가.
3. 특정 종료 현상
- 캐스케이딩 종료(cascading termination)
- 부모가 종료되면 자식 프로세스도 자동으로 종료.
- 일부 시스템에서 운영체제가 이를 강제 시행.
- 좀비 프로세스(zombie process)
- 프로세스가 종료되었지만 부모가 wait()를 호출하지 않은 상태.
- 프로세스의 종료 상태(exit status)는 부모가 회수할 때까지 프로세스 테이블에 남음.
- 부모가 wait() 호출 시, 프로세스 테이블의 항목과 PID가 해제됨.
- 고아 프로세스(orphan process)
- 부모가 먼저 종료되어 남겨진 자식 프로세스.
4. 주요 시스템 호출
- wait(): 부모가 자식의 종료를 대기하며 자식의 종료 상태를 얻음.
3.4 Interprocess Communication
독립 프로세스는 다른 프로세스와 데이터를 공유하지 않으며, 협력 프로세스는 다른 프로세스와 데이터를 공유하거나 영향을 주고받을 수 있다. 협력 프로세스는 데이터를 주고받기 위해 인터프로세스 통신(IPC) 메커니즘이 필요하다.
협력 프로세스를 위한 환경 제공 이유:
- 정보 공유(Information sharing): 여러 애플리케이션이 동일한 정보를 사용할 때, 이를 공유할 수 있는 환경이 필요하다.
- 계산 속도 향상(Computation speedup): 특정 작업을 여러 하위 작업으로 나누어 병렬 실행시켜 속도를 향상시킬 수 있다. 다중 처리 코어에서만 가능.
- 모듈화(Modularity): 시스템을 모듈화하여 각각의 기능을 별도의 프로세스나 스레드로 나누어 구성할 수 있다.
두 가지 IPC (Inter-Process Communication) 모델
- 공유 메모리 (Shared Memory):
- 여러 프로세스가 공유하는 메모리 영역을 설정하고, 데이터를 읽고 쓸 수 있다.
- 장점: 빠르며 시스템 호출이 최소화됨.
- 단점: 동시 접근 시 충돌을 피해야 하므로 관리가 필요.
- 메시지 전달 (Message Passing):
- 프로세스 간 메시지를 주고받으며 통신.
- 장점: 작은 데이터 교환에 유용하고, 분산 시스템에서 구현이 용이.
- 단점: 시스템 호출이 필요하여 성능이 공유 메모리보다 낮을 수 있음
3.5 IPC in Shared-Memory Systems
공유 메모리
- 여러 프로세스가 메모리의 특정 영역을 공유하여 데이터를 읽고 쓸 수 있다. 이를 통해 데이터를 효율적으로 교환할 수 있으며, 프로세스 간 동기화가 필요하다.
Producer-Consumer Problem
- 생산자(Producer)와 소비자(Consumer) 프로세스가 동시에 실행되며 데이터를 생산하고 소비하는 문제이다. 공유 메모리에서 버퍼를 통해 데이터를 교환하며, 동기화가 필수적이다.
Bounded Buffer
- 고정된 크기의 버퍼를 사용하여, 버퍼가 가득 차면 생산자가 대기하고, 버퍼가 비면 소비자가 대기.
동기화 문제
- 여러 프로세스가 동시에 공유 메모리에 접근할 때 동기화 문제가 발생할 수 있다.
3.6 IPC in Message-Passing Systems
메시지 전달
- 프로세스 간 통신을 위해 운영 체제가 메시지 전달 방식을 제공한다. 주로 분산 시스템에서 사용되며, 프로세스 간 직접적인 메모리 공유 없이 메시지를 주고받는다.
기본 연산
- 메시지 전달은 send()와 receive() 연산을 통해 이루어짐.
Naming
- 메시지를 보내거나 받기 위해 프로세스는 다른 프로세스를 직접 지칭하거나 간접적으로 참조해야 한다. 간접 참조는 우편함(Mailbox)을 사용하며, 프로세스 간 메시지를 주고받기 위해서는 공유된 우편함이 필요.
동기화(Synchronization)
- 메시지 전달은 차단형(Blocking) 또는 비차단형(Nonblocking) 방식으로 구현할 수 있다. 차단형은 메시지가 전달될 때까지 보내는 프로세스가 대기하며, 비차단형은 메시지를 보내고 즉시 작업을 계속한다.
버퍼링(Buffering)
- 메시지를 저장하는 큐는 세 가지 유형:
- Zero capacity: 큐에 메시지를 하나도 저장할 수 없으며, 송신자는 메시지가 수신될 때까지 대기.
- Bounded capacity: 제한된 크기의 큐를 사용하며, 큐가 가득 차면 송신자는 대기.
- Unbounded capacity: 큐의 크기가 무한하여 송신자는 절대로 대기하지 않음.
3.7 Examples of IPC Systems
3.7.1 POSIX Shared Memory
공유 메모리에 메모리 매핑된 파일을 사용.
3.7.2 Mach Message Passing
macOS/iOS에서 사용되는 분산 시스템
3.7.3 Windows
동일한 머신의 프로세스 간 통신에 최적화
포트 유형
- 연결 포트(Connection Ports): 클라이언트가 연결을 요청할 수 있도록 허용
- 통신 포트( Communication Ports ): 클라이언트-서버 메시징을 위한 비공개 채널
3.7.4 Pipes
프로세스 간 데이터 교환을 허용하는 가장 간단한 IPC 메커니즘
일반 파이프(Ordinary Pipes)
- 특성:
- 단방향
- 부모-자식 프로세스 관계가 필요
명명된 파이프(Named Pipes)
- 특성:
- 양방향 통신을 허용
- 부모-자식 관계는 필요 x
- 프로세스가 종료된 후에도 지속
3.8 Communication in Client–Server Systems
클라이언트-서버 시스템의 통신을 위해 소켓과 RPC 살펴보자
3.8.1 Sockets
- 소켓은 네트워크 통신을 위한 끝점으로, IP 주소와 포트 번호로 식별된다.
- 클라이언트-서버 구조를 기반으로 하며, 서버는 특정 포트에서 클라이언트 요청을 수신 대기한다.
자바에서 제공하는 소켓 라이브러리
- TCP 소켓: Socket 클래스 (연결 지향적).
- UDP 소켓: DatagramSocket 클래스 (비연결 지향적).
3.8.2 Remote Procedure Calls
- RPC는 네트워크 상의 시스템 간 절차 호출을 추상화한 방식으로, 로컬 호출처럼 원격 절차를 실행할 수 있게 함.
- 메시지 기반 통신을 사용하며, 호출 세부사항은 클라이언트와 서버의 스텁(stub)이 처리한다.
작동 과정
- 클라이언트 스텁이 서버의 포트를 찾아 매개변수를 구조화하여 전송.
- 서버 스텁이 메시지를 수신해 해당 절차를 실행하고 결과를 클라이언트로 반환.
'운영체제 공룡책' 카테고리의 다른 글
[운영체제 공룡책] 6장 Synchronization Tools(동기화 도구) (1) | 2025.01.02 |
---|---|
[운영체제 공룡책] 5장 CPU Scheduling (2) | 2024.12.14 |
[운영체제 공룡책] 4장 Threads &Concurrency (1) | 2024.11.26 |
[운영체제 공룡책] 2장 Operating - System Structures (4) | 2024.11.13 |
[운영체제 공룡책] 1장 Overview (2) | 2024.11.07 |