03. 프로세스의 이해

개발 99·2025년 4월 2일

공룡책

목록 보기
3/22

Process란 실행중인 프로그램을 의미한다.

  • OS의 작업의 실행 단위

  • CPU time, memory, files, I/O devices가 필요로 한다.

  • memory에 load된 프로그램 = 프로세스

  • load가 된 후, cpu에 처리를 해줘야 작동.

여러 구역으로 나눠진 memory층

  • Text section : 실행가능한 코드

  • Data section : 전역 변수

  • Heap section : 런타임동안 동적으로 할당이 가능한 메모리
    ( new, heap )

  • Stack section : 메소드가 실행될 때, 임시적인 데이터 저장소
    (매개변수, 반환되는 주소, 지역변수)

  • int x -> uninitialized data

  • int y = 15 -> initialized data

  • main -> stack

  • int i -> stack

  • values -> heap

  • for loop -> text

  • return 0 -> exit stack

process의 생명주기

  • New: process created

  • Running : Instructions가 실행

  • Waiting : 어떤 event가 발생하기를 기다림
    (I/O 완료 or signal 수신)

  • Ready : Waiting 상태의 process가 할당되기를 기다림
    (Ready 큐에서 대기중인 상태)

  • Terminated : process가 실행을 종료함.

PCB(Process Control Block)

PCB로 OS가 handling을 한다.

  • Process state( run, wait, ...)

  • Program counter( 명령어 포인터 )

  • CPU registers

  • CPU-scheduling information

  • Memory-management information

  • Accouting information

  • I/O status information

PCB를 통해서 OS가 프로세스를 관리한다.

Process는 그 자체 싱글 스레드이다.

PCB가 switch되면 그 마지막 주소를 기억하고, 재실행시 해당 task로 복귀한다.

Process내에서는 여러 스레드를 가질 수 있다.

( lightweight process )

그래서 멀티 프로세싱보다 멀티 스레딩으로 처리한다.

multiprogramming

CPU 사용률을 극대화를 하기 위해서 사용이 된다.

CPU core를 자주 switch함으로써 마치 동시에 실행이 되는 것처럼 보이게 한다.

이를 위해서는 Scheduling을 해야한다.( Scheduling Queue를 사용 )

Ready Queue에서 CPU가 순서대로 task를 처리한다.
( 만약 I/O가 있으면, waiting queue로 가고, ready queue를 거쳐서 실행이 되어야 한다. )

waiting queue는 여러개 있다.(magnetic, disk 등...)

Queueing Diagram

반드시 ready queue에서 CPU를 할당받는다.

Context Switch

context는 PCB와 동일하므로, PCB switch라고 해석하면 된다.

running process의 현재 context를 save를 했다가,
재가동시, context를 복구한다.

그래서 정리하면,
CPU core를 다른 프로세스로 switch하고,
현재 state를 저장하고, 다른 프로세스의 상태를 복구한다.

프로세스 2가지 실행 방법

  • parent와 child 둘다 concurrently하게 실행

  • parent는 waiting, child만 실행이 된다.

또한

  • PCB만 따로 생성하고, 리소스는 공유한다.

  • 새로운 프로그램을 로딩한다.

종료는 return을 하든가, exit()를 한다. 그러면 OS가 자원을 회수한다.

Zombie and Orphan

  • Zombie

자식 프로세스가 종료되었지만, 부모 프로세스가 wait() 또는 waitpid()로 자식의 종료 상태를 수거하지 않았을 때 발생합니다.

PID는 여전히 프로세스 테이블에 남아 있음 (exit code 등 상태 정보만).

부모가 자식 종료 후 상태를 수거하지 않으면, OS는 그 상태 정보를 유지해야 함 → 그래서 프로세스 테이블에 남아 있음.

🛠 해결:
부모가 wait()를 호출해야 함.

또는 SIGCHLD 시그널 핸들링을 통해 자동 수거 설정.

  • Orphan
    : 부모 프로세스가 먼저 종료되어 자식 프로세스가 부모를 잃은 상태.

이 경우 자식 프로세스는 init 프로세스 (pid 1)가 자동으로 입양해서 관리합니다.

리눅스에서는 systemd나 init이 orphan을 관리하며, 종료 시 상태도 수거해줍니다.

🧠 특징:
Orphan은 위험하지 않음. OS가 처리함.

Zombie는 잘못 관리된 자식이고, Orphan은 부모가 먼저 죽은 정상 자식.

profile
구구구구구!

0개의 댓글