OS

[쉽게 배우는 운영체제] 3-1. 프로세스와 스레드: 프로세스

noahkim_ 2024. 12. 11. 21:55

조성호 님의 "쉽게 배우는 운영체제" 책을 정리한 포스팅 입니다

 

1. 개요

프로그램 vs 프로세스

구분 프로그램 프로세스
정의 어떤 데이터를 사용하여 어떤 작업을 할지 절차를 적어놓은 것 작업이 진행되고 있는 프로그램
상태 정적인 상태 (저장장치에 저장됨) 
동적인 상태 (메모리에 올라와 실행 중)
저장 위치 디스크(SSD, HDD) 등에 저장됨 RAM(메모리)에 적재되어 실행됨
실행 여부 실행되지 않음 실행 중인 상태
예시 myapp.exe (실행 파일)
myapp.exe가 실행되어 프로세스 ID를 가지고 동작하는 상태

 

프로세스로의 전환

  1. 프로그램을 메모리에 로드
  2. 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를 통해 데이터 블록 접근)
  3. Context Switching

    구분 설명
    🔹 과정  
    1. 현재 프로세스의 PCB 저장
    실행 중인 프로세스의 정보를 PCB에 저장
    (CPU Register, PC, Memory 정보, Process State 등)
    2. 새로운 프로세스의 PCB 로드
    실행할 프로세스의 PCB를 메모리에서 로드하고, 저장된 레지스터 및 PC 정보를 복원
    3. CPU 제어권 전달
    새로운 프로세스가 실행되도록 CPU를 해당 프로세스로 전환
    🔹 발생하는 상황  
    멀티태스킹
    여러 프로세스를 번갈아 실행하기 위해 CPU를 교체
    인터럽트
    I/O 요청, 시스템 호출, 외부 이벤트(예: 키보드 입력)로 인해 실행 중인 프로세스가 일시 정지됨
    프로세스 우선순위 변경
    스케줄러가 높은 우선순위의 프로세스를 실행하기 위해 현재 프로세스를 중단하고 전환
    🔹 종류
     
    프로세스 간 전환
    두 개의 서로 다른 사용자 프로세스 간에 이루어짐
    스레드 간 전환
    동일한 프로세스 내에서 스레드 전환
    커널 모드와 사용자 모드 간 전환 시스템 호출 처리 시 발생
  4. 프로세스 종료

 

프로세스 상태

 

상태 설명
🔹 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가 부여됩니다.

 

 

 

출처