Foundry
운영체제
기초
핵심

프로세스 (Process)

실행 중인 프로그램, 독립적 메모리 공간

프로세스 (Process)

프로세스란?

실행 중인 프로그램의 인스턴스. OS가 관리하는 작업 단위.

메모리 구조

높은 주소에서 낮은 주소 순으로 이렇게 놓입니다.

영역담는 것자라는 방향
스택 (Stack)지역변수, 매개변수아래로
빈 공간두 영역이 만나면 넘침이다
힙 (Heap)동적 할당 (malloc, new)위로
데이터 (Data)전역변수, static고정
코드 (Code)실행 명령어고정

프로세스 상태

[생성] → [준비] ⇄ [실행] → [종료]
              ↕
           [대기/블록]
상태설명
준비 (Ready)CPU 대기 중
실행 (Running)CPU에서 실행 중
대기 (Blocked)I/O 완료 대기

실무 포인트

  • fork(): 부모 프로세스 복사하여 자식 프로세스 생성
  • exec(): 현재 프로세스를 새 프로그램으로 교체
  • 좀비 프로세스: 종료됐지만 부모가 회수 안 한 상태
  • 고아 프로세스: 부모가 먼저 종료된 자식 (init이 입양)
면접에서 이렇게 나옵니다

Q.프로세스의 메모리 구조를 설명해주세요

높은 주소에서 낮은 주소 순으로 이렇게 놓입니다.

영역담는 것특징
스택지역변수, 매개변수, 돌아갈 주소함수 호출마다 쌓이고 끝나면 걷힌다. 아래로 자란다
동적 할당실행 중에 요청한 만큼. 위로 자란다
데이터전역변수, static프로그램 시작 시 크기가 정해진다
코드실행 명령어읽기 전용. 같은 프로그램끼리 공유할 수 있다

스택과 힙이 서로를 향해 자라고, 만나면 넘침입니다.

스택은 크기가 제한돼 있고(보통 몇 MB) 컴파일 시점에 관리되며, 힙은 훨씬 크지만 직접 해제하거나 가비지 컬렉터가 정리합니다.

흔한 실수: 스택 오버플로를 메모리 부족으로 설명하는 것. 전체 메모리가 아니라 스택 영역을 넘긴 것이고, 원인은 대개 종료 조건 없는 재귀입니다.

Q.좀비 프로세스란? 어떻게 해결하나요?

자식이 끝났는데 부모가 종료 상태를 거두지 않아 프로세스 표에 남아 있는 상태입니다.

자식이 exit 한다
커널은 종료 코드를 남겨둔다. 부모가 물어볼 수 있어야 하므로
부모가 wait 로 거두면 항목이 사라진다
거두지 않으면 좀비로 남는다

좀비는 메모리를 쓰지 않지만 프로세스 표의 항목과 PID 를 점유합니다. 쌓이면 새 프로세스를 만들 수 없습니다.

해결방법
부모가 거둔다wait 나 waitpid 를 호출한다
신호 처리자식 종료 신호를 받아 그때 거둔다
무시 선언자식 종료 신호를 무시로 설정하면 커널이 자동으로 거둔다
부모를 종료부모가 죽으면 init 이 입양해 대신 거둔다

흔한 실수: 좀비와 고아를 혼동하는 것. 고아는 부모가 먼저 죽은 살아 있는 프로세스이고 init 이 입양합니다. 좀비는 이미 죽었는데 정리되지 않은 항목입니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

운영체제 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.