Process
- 실행 중인 프로그램은 프로세스라고 한다.
- 실행 중이다 → 보조기억장치의 프로그램이 메모리에 적재되어 실행된다

맥 활성 상태 보기 - 프로세스 보기
- foreground process
- background process
- 사용자가 직접 제어하지 않고, 백그라운드에서 실행
- 유닉스에서는 데몬(daemon)이라 불림
- 데몬
- 시스템이 시동할 때 대부분의 데몬 시작
- 대부분 부모 프로세스를 갖지 않음
syslogd
프로세스처럼 데몬을 뜻하는 d
를 이름 끝에 달고 있음
프로세스의 메모리 영역
사용자 영역에 적재되는 하나의 프로세스는 각각 text, data, heap, stack 영역으로 나뉜다.

Text section
- text segment
- 실행할 수 있는(기계어로 이루어진) 명령어가 저장
- CPU가 실행할 명령어 저장
- 프로그래머가 변경할 일이 없으므로 read-only
Data section
text, data section 실행되는 동안에 유지되고 변하지 않는다.
크기가 변하지 않으므로 정적 할당 영역이라고도 부른다.
Heap section
- 런타임에 동적으로 할당되는 메모리
- 프로그래머가 직접 메모리를 할당하고 해제
- 메모리 공간을 반환하지 않으면, 메모리 내에 계속 남아 낭비 초래
- 메모리 누수
- like memory leak in swift
- 메모리의 낮은 주소에서 높은 주소로 할당
Stack section
- 데이터를 일시적으로 저장하는 공간
- ex. 함수의 매개변수(함수의 실행이 끝나면 사라지는), 지역 변수
- 높은 주소에서 낮은 주소로 할당
heap, stack section은 크기가 변하므로 동적 할당 영역이라고도 부른다.
스택은 메모리의 높은 주소에서 낮은 주소로 할당,
힙은 메모리의 낮은 주소에서 높은 주소로 할당되어 주소가 겹칠 일이 없게 한다.
프로세스 상태
프로세스 상태는 PCB에 기록된다.

new
- 프로세스 생성 중
- 메모리에 적재되어 PCB를 할당받음
ready
- CPU를 할당받아 실행할 수 있지만, 아직 대기하는 상태
- ready → running 상태로 전환되는 과정을 dispatch라고 부름
running
- CPU를 할당받아 실행 중인 상태
- 프로세스가 할당된 시간을 모두 사용하면(timeout) 다시 ready 상태로
- 실행 중에 입출력장치를 사용하여, 입출력 작업의 완료를 기다려야 한다면 waiting 상태로
waiting
- CPU에 비해 비교적 느린 입출력 속도 → 입출력 작업 요청 시, 완료 인터럽트를 받을 때까지 대기해야 함
- 이벤트(I/O 완료 작업 등)을 기다리는 프로세스
- 입출력 작업이 완료되면 다시 ready로
terminated(exit)
- 프로세스가 종료된 상태
- 운영체제는 PCB와 프로세스가 사용한 메모리를 정리
PCB(Process Control Block)
- 모든 프로세스는 CPU 자원 할당을 받아야 실행될 수 있지만, CPU 자원은 한정되어 있다.
- 많은 프로세스들은 돌아가며 한정된 시간만큼의 CPU를 사용
- 프로세스의 실행 순서와 자원 배분을 관리하기 위해 PCB 사용
- 프로세스는 운영체제에서 PCB로 구분되어진다.

- 프로세스와 관련된 정보 저장
- 커널 영역에 생성
- 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기
PCB 구성 정보
PID(Process ID)

- 프로세스의 고유한 번호
- 같은 프로그램이어도 실행 시점에 따라 다른 PID를 가짐
레지스터 값
- 프로세스는 번갈아가면서 실행되므로, 이전까지의 레지스터값들을 모두 복원
- 프로세스의 PC, 레지스터값 기록
프로세스 상태
- 현재 프로세스의 상태(new, ready, running, waiting, terminated…)
CPU 스케줄링 정보
- 언제 어떤 순서로 CPU를 할당받을지에 대한 정보
메모리 관리 정보
사용한 파일과 입출력 장치 목록
- 실행 과정에서 사용한 입출력 장치나 파일에 대한 정보
- 프로세스에 할당된 입출력장치에 대한 정보
프로세스 계층 구조
Process Creation
프로세스가 실행 도중 시스템 호출을 통해 다른 프로세스 생성 가능
다른 프로세스를 생성한 프로세스를 부모 프로세스(parent process
)라고 함
생성된 프로세스를 자식 프로세스(child process
)라고 함
- 부모, 자식 프로세스는 다른 프로세스이다. → PID가 다름
- 자식 프로세스도 프로세스를 생성할 수 있다
- 프로세스가 프로세스를 낳는 계층적인 구조로 운영체제는 프로세스를 관리
모든 프로세스의 가장 위에 있는 최초 프로세스는 init(in unix), systemd(in linux), launchd(macOS)

macOS의 최초프로세스 - launchd
프로세스 생성 과정
- 부모 프로세스가 자신의 복사본을 자식 프로세스로 생성 →
fork()
- 부모 프로세스의 메모리 내용, 파일 목록 등 상속됨
- 자식 프로세스는 자신의 메모리 공간을 새로운 프로그램 내용으로 전환 →
exec()
이것이 반복되어 트리 구조를 만든다.
Process Termination
- 마지막 statement를 실행하고 운영체제에 프로세스를 삭제하도록 요청 →
exit()
- 부모 프로세스에 자신의 상태를 반환해야 프로세스의 자원들은 할당 해제된다.
- 부모 프로세스가 자식 프로세스가 종료될 때까지 기다리기 →
wait()
- 부모 프로세스가 자식 프로세스의 실행을 종료하기 →
abort()
- 자식 프로세스가 과도한 리소스를 사용할 경우
- 자식 프로세스에 할당된 작업이 더이상 필요하지 않을 경우
- (orphan process를 허용하지 않는 운영체제에서) 부모 프로세스가 종료되는 경우
Orphan Process
- orphan: 고아
- 부모 프로세스가 먼저 종료되었을 때 남아 있는 자식 프로세스
- init 프로세스가 부모 프로세스의 역할을 맡는다.
Zombie Process
- 자식 프로세스의 실행은 종료되었지만, 부모 프로세스가
wait()
콜을 하지 않아 아직 삭제되지 않은 프로세스이다.
- 부모 프로세스가 좀비 프로세스가 된 자식 프로세스의 종료 상태를 회수하면 제거된다.
Reference
혼자 공부하는 컴퓨터 운영체제