조성호 님의 "쉽게 배우는 운영체제" 책을 정리한 포스팅 입니다
1. 개요
프로그램 vs 프로세스
구분 | 프로그램 | 프로세스 |
정의 | 어떤 데이터를 사용하여 어떤 작업을 할지 절차를 적어놓은 것 | 작업이 진행되고 있는 프로그램 |
상태 | 정적인 상태 (저장장치에 저장됨) |
동적인 상태 (메모리에 올라와 실행 중)
|
저장 위치 | 디스크(SSD, HDD) 등에 저장됨 | RAM(메모리)에 적재되어 실행됨 |
실행 여부 | 실행되지 않음 | 실행 중인 상태 |
예시 | myapp.exe (실행 파일) |
myapp.exe가 실행되어 프로세스 ID를 가지고 동작하는 상태
|
프로세스로의 전환
- 프로그램을 메모리에 로드
- PCB 생성
구분 설명 정의 프로세스를 관리하기 위한 핵심 데이터 구조주요 정보 - PID (Process ID): 프로세스의 고유 식별자- Process state: 현재 상태 (실행, 대기, 종료 등)- Process Number: 프로세스 번호 - Program Counter: 다음 실행할 명령어의 주소- Register: CPU 레지스터 정보 - Memory limits: 프로세스가 사용할 메모리 영역 정보파일 관련 정보 - FDT (File Descriptor Table): 프로세스 오픈 파일 테이블- System Open-File Table: 시스템 오픈 파일 테이블- Active vnode table: 파일 시스템 캐싱 테이블 (inode 정보)파일 작업 과정 1. FDT에서 해당 파일인 fd에 해당하는 System Open-File Table 엔트리를 찾음
2. inode 참조
- Active Vnode Table에서 캐싱 여부 확인
- 캐싱이 안되어있다면, System Open-File Table(disk)에서 inode 참조
3. 데이터 블록 읽기 (inode를 통해 데이터 블록 접근) - Context Switching
구분 설명 🔹 과정 1. 현재 프로세스의 PCB 저장 실행 중인 프로세스의 정보를 PCB에 저장
(CPU Register, PC, Memory 정보, Process State 등)2. 새로운 프로세스의 PCB 로드 실행할 프로세스의 PCB를 메모리에서 로드하고, 저장된 레지스터 및 PC 정보를 복원3. CPU 제어권 전달 새로운 프로세스가 실행되도록 CPU를 해당 프로세스로 전환🔹 발생하는 상황 멀티태스킹 여러 프로세스를 번갈아 실행하기 위해 CPU를 교체인터럽트 I/O 요청, 시스템 호출, 외부 이벤트(예: 키보드 입력)로 인해 실행 중인 프로세스가 일시 정지됨프로세스 우선순위 변경 스케줄러가 높은 우선순위의 프로세스를 실행하기 위해 현재 프로세스를 중단하고 전환🔹 종류 프로세스 간 전환 두 개의 서로 다른 사용자 프로세스 간에 이루어짐스레드 간 전환 동일한 프로세스 내에서 스레드 전환커널 모드와 사용자 모드 간 전환 시스템 호출 처리 시 발생 - 프로세스 종료
프로세스 상태
상태 | 설명 |
🔹 Created | |
프로그램이 메모리에 로드됨 | 실행을 위해 메모리에 적재됨 |
OS로부터 PCB 할당 | 프로세스 제어를 위한 PCB 생성 |
준비 상태(Ready)로 전환 |
프로세스가 실행될 준비를 마치고 CPU 할당을 기다림
|
🔹 Waiting (Ready) | |
자기 실행 순서를 기다리는 상태 | CPU가 할당되기를 대기 |
PCB는 Ready Queue에서 대기 | CPU Scheduler가 관리 |
🔹 Running | |
실행 (CPU 할당) |
CPU Scheduler에 의해 실행됨
dispatch(PID) 호출 → 새로운 프로세스가 Running 상태로 이동 |
상태변화: 할당된 time slice 만료 |
timeout(PID) 호출 → Waiting(Ready) 상태로 이동
|
상태변화: I/O 요청 발생 |
block(PID) 호출 → Blocked 상태로 이동
|
상태변화: 작업 완료 |
exit(PID) 호출 → Terminated(종료) 상태로 이동
|
🔹 Blocked | |
I/O 요청을 수행 중 |
요청한 I/O 작업이 완료될 때까지 대기
|
입출력 장치별 대기 큐에서 기다림 | |
I/O 완료 후 Ready 상태로 이동 |
wakeup(PID) 호출 → Waiting(Ready) 상태로 전환
|
🔹 Terminated | |
프로세스 종료 | exit() 호출됨 |
정상 종료 | exit(0) |
비정상 종료 | exit(1) |
커널이 PCB 폐기 및 메모리 정리 |
코드, 데이터 삭제 후 프로세스 완전히 제거
|
🔹 Suspended | 프로세스가 메모리에서 쫓겨난 상태 |
발생 조건 | - 메모리가 부족할 경우 - 프로그램 오류로 실행이 미뤄질 경우 - 바이러스 프로세스로 판단될 경우 |
스왑 영역 (Swap Area) |
Suspended 상태의 프로세스가 저장되는 영역
디스크의 스왑 영역(Swap Space)에 저장됨 |
상태: 보류 대기 상태 (Swapped Out and Blocked) |
- Blocked 상태에서 스왑됨 (I/O 요청 등의 이유)
- I/O 작업이 완료되면 다시 실행 대기 |
상태: 보류 준비 상태 (Swapped Out and Waiting) |
- Ready 상태에서 스왑됨
- 다시 메모리로 로드되면 Ready 상태로 복귀하여 실행 대기 |
관련 명령어 |
Kill -STOP
|
🔹 Stopped/Suspended |
프로세스가 일시적으로 실행을 중단
Waiting or Blocked 전환됨 (명령어로 제어) - Waiting 상태는 명령어로 제어됨 - Blocked 상태는 i/o 요청 중 중지됨 |
특징 |
- 사용하던 데이터와 PCB 정보가 그대로 유지됨
- 멈춘 지점에서 재시작 가능 |
관련 명령어 | 일시 중지: Ctrl + Z 재시작 (포그라운드): fg 재시작 (백그라운드): bg 강제 종료: Ctrl + C |
2. 프로세스 구조
- 운영체제는 프로세스를 실행할 때 프로그램과 데이터를 관리하기 위해 메모리를 여러 영역으로 나눔
구조
메모리 영역 | 설명 |
Text Area (Code Area) |
프로그램의 코드가 저장된 곳.
읽기 전용으로 변경 불가 |
Data Area |
변수 및 데이터가 저장되는 영역.
프로그램이 종료될 때까지 유지됨. - Initialized data: 초기값이 있는 변수들 - Uninitialized data: 초기값이 없는 변수들 (BSS 영역) |
Stack Area |
함수 호출 시 생성되는 데이터를 저장하는 임시 메모리 공간.
- 스택 프레임: 지역 변수, 매개 변수, 반환 주소, 반환 값 등 관리 - 함수 호출이 끝나면 해당 메모리는 자동으로 해제 |
Heap Area |
런타임에 동적으로 할당되는 데이터 영역.
- 포인터를 통해 접근 가능 - 프로그램이 종료될 때까지 메모리 해제되지 않음 (수동 관리 필요) |
그림
+-------------------------+
| Heap Area | <--- 동적으로 할당된 데이터 (런타임 시 할당)
+-------------------------+
| Stack Area | <--- 함수 호출 시 생성된 데이터 (스택 프레임)
+-------------------------+
| Data Area | <--- 변수 및 데이터 (초기화된 데이터 및 초기화되지 않은 데이터)
+-------------------------+
| Text Area | <--- 프로그램 코드 (읽기 전용)
+-------------------------+
4. 프로세스 연산
연산 | fork() | exec() |
목적 | 새로운 프로세스를 생성하고 기존 프로세스를 복사 |
프로세스의 내용을 변경 (기존 구조체 재활용)
|
동작 | 현재 프로세스를 복사하여 자식 프로세스를 생성. 부모-자식 관계 설정 |
기존 프로세스의 code와 data 영역을 덮어쓰고 stack 영역을 비움
|
자원 상속 | 자식 프로세스가 부모 프로세스의 자원을 상속 |
자식 프로세스가 기존의 자원은 그대로 두고 새로운 내용으로 덮어씀
|
PID/PPID | 새로운 프로세스에 대해 PID 부여 부모 프로세스의 PID는 PPID로 저장 |
PID, PPID, CPID는 그대로 보존됨 |
장점 | - 프로세스 생성 속도가 빠름 (메모리에서 복사) - 자원 상속 가능 - 시스템 관리를 효율적으로 할 수 있음 |
- 프로세스의 구조체 재활용 가능
- 새로운 프로그램을 실행하는 데 유용 |
단점 | - 부모와 자식 프로세스가 동일한 자원, 상태를 공유하게 됨 |
- 기존 프로세스의 code와 data가 덮어씌워짐 (변경 불가피)
|
5. 프로세스 계층 구조
커널 프로세스와 init 프로세스
개념 | 설명 |
커널 프로세스 |
커널이 부팅되면서 여러 프로세스를 생성.
그 중 init 프로세스는 전체 프로세스의 부모가 됨. |
init 프로세스 |
전체 프로세스 트리의 루트, 모든 프로세스의 부모가 되어 자식 프로세스를 생성 (fork(), exec() 호출).
|
장점
장점 | 설명 |
동시 처리 |
fork()로 프로세스를 여러 개 만들어 사용자에게 분배.
|
자원 회수 용이 |
고아 프로세스는 커널이 자식 프로세스를 회수하여 자원 반환을 처리함.
|
고아 프로세스
- 부모 프로세스가 종료된 후에도 남아 있는 프로세스
- 자식 프로세스가 비정상적으로 종료되거나 부모가 먼저 종료될 경우 발생
문제점
- 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료될 경우, 연락이 안될 수 있음
- 자식 프로세스의 자원이 정상적으로 반환되지 못함
6. 프로세스 실행 과정
프로세스 그룹
- 여러 프로세스들이 하나의 그룹으로 묶여서 터미널에서 함께 관리되는 단위
특징
특징 | 설명 |
커널의 터미널 제어 |
커널은 터미널의 제어권을 관리하기 위해 프로세스 그룹을 사용합니다.
|
- 터미널의 제어권 |
터미널은 한 번에 하나의 프로세스만 실행하도록 제어권을 가집니다.
|
- 하위 프로세스 실행 |
실행 중인 프로세스가 다른 하위 프로세스를 실행할 수 있으며, 하위 프로세스들도 동일한 터미널에서 실행됨
|
프로세스 그룹 제어 |
터미널은 프로세스 그룹의 제어권을 가집니다.
즉, 어떤 프로세스가 터미널의 입력을 받거나 출력을 담당할지를 결정합니다. |
- PGID (Process Group ID) |
프로세스 그룹에는 고유한 식별자인 PGID가 부여됩니다.
|
출처
'OS' 카테고리의 다른 글
[쉽게 배우는 운영체제] 4-2. CPU 스케줄링: 인터럽트 처리 (0) | 2024.12.12 |
---|---|
[쉽게 배우는 운영체제] 4-1. CPU 스케줄링: 스케줄링 (0) | 2024.12.12 |
[쉽게 배우는 운영체제] 3-2. 프로세스와 스레드: 스레드 (0) | 2024.12.12 |
[쉽게 배우는 운영체제] 2. 컴퓨터의 구조와 성능 향상 (0) | 2024.01.11 |
[쉽게 배우는 운영체제] 1. 운영체제 개요 (1) | 2023.12.26 |