프로세스
: 실행을 위해 시스템(커널)에 등록된 작업
- 시스템 성능향상을 위해 커널에 의해 관리 됨
- 프로그램이 메모리로 적재되면 프로세스가 됨
- 각종 자원들을 요청하고 할당 받을 수 있는 개체
- PCB(프로세스 관리 블록)을 할당 받은 개체
- 능동적인 개체 (실행 중 각종 자원을 요구, 할당, 반납함)
프로그램과 스레드
프로그램(Program)
: 실행할 작업이 컴퓨터 시스템에 실행 요청 전의 상태
- 실행가능한 코드의 집합
- 디스크 보관, 정적인 상태
스레드(Thread)
: 프로세서 활용의 기본 단위, 프로세스 내 동작되는 여러 실행의 흐름
- 제어 요소만 가지며 자원(코드, 데이터, 힙)은 프로세스 내 다른 스레드와 공유
- 프로세스 내에서 프로세스의 자원을 이용해 실제 작업을 수행
- 각 스레드는 독자적인 스택 메모리를 가짐
스레드의 장점
- 사용자 응답성
- 일부 스레드의 처리가 지연되어도 다른 스레드는 작업 계속 처리 가능
- 자원 공유
- 자원을 공유해 효율성 증가 (커널의 개입을 피할 수 있음)
- 경제성
- 프로세스의 생성, context switch에 비해 효율적
- 멀티 프로세서 활용
- 병렬처리를 통해 성능 향상
프로그램 vs 프로세스 - 파일이 저장 장치에 있지만 메모리에는 올라가 있지 않은 상태 -> 프로그램 - 프로그램을 실행 후 메모리에 올라가 있는 상태 -> 프로세스
프로세스 vs 스레드
- 프로그램이 복잡해져서 프로세스 하나만으로 실행하기 어렵다.
- 운영체제는 안정성을 위해서 프로세스마다 할당된 메모리 내의 정보에만 접근할 수 있도록 제약
- 따라서 프로세스를 여러 개 만들 수 없음, 더 작은 실행 단위 개념 필요 -> 스레드
- 프로세스와 다르게 스레드는 서로 메모리를 공유하며 작동
프로그램 VS 프로세스 VS 스레드
프로그램 | 프로세스 | 스레드 | |
---|---|---|---|
정의 | 실행 가능한 코드의 집합 | 실행 중인 프로그램 인스턴스 | 프로세스 내 실행 단위 |
실행 단위 | - | 단일 프로세스 | 프로세스 내 스레드 |
독립성 | - | 각각 독립적 | 스택(제어)만 독립 |
자원 공유 | - | 다른 프로세스와 공유X | 다른 스레드와 공유 |
스케줄링 | - | 운영체제에 의해 스케줄링 | 프로세스 내 스레드 스케줄링 |
PCB(Process Control Block)
: 프로세스 관리 블록으로, OS가 프로세스 관리에 필요한 정보를 저장한 구조체
- 프로세서 생성 시 커널에 PCB 생성
- 프로세스의 상태관리와 Contex Switching을 위해 필요
- PCB 저장 정보
프로세스 상태
: 생성, 준비, 수행, 대기, 중지프로세스 번호(PID)
프로그램 카운터
레지스터
메모리 제한
열린 파일 정보
TCB(Thread Control Block)
: 스레드의 상태와 관련된 정보를 저장하는 데이터 구조로, 스레드는 PCB를 가지지 않고 TCB를 가짐
- 스레드의 고유 식자, 레지스터 값, 스택 포인터, 스케줄링 정보 포함
- 스레드는 동일한 프로세스 내에서 실행되므로 프로세스의 PCB와 관련된 리소스를 공유
- 여러 스레드가 하나의 PCB를 공유하며, 각 스레드는 자체 TCB를 가지고 자신의 상태 관리
프로세스와 스레드 생성
프로세스 생성
- fork()
: 기존의 프로세스를 복제하여 새로운 프로세스 생성
- 새로운 프로세스는 부모 프로세스의 복제본
- 부모의 PCB도 함께 복사
- Binary program을 읽어서 자신을 호출한 process의 메모리 영역에 덮어씀
- 부모와 자식 프로세스는 동시에 수행되나 독립적으로 실행
- 새로운 프로세스를 위한 메모리 할당
- 새로운 프로세스는 부모 프로세스의 복제본
- exec()
: 새로운 프로세스로 프로세스의 실행 내용 교체
- 새로운 프로세스을 현재 프로세스의 주소 공간에 로드하고 실행하는데 사용
- 기존의 프로세스를 새로운 프로세스로 전환
- fork()처럼 새로운 메모리 할당X
- 부모 프로세스 내용 복사X
스레드 생성
- pthread_create()
: POSIX 스레드 라이브러리를 사용해 스레드 생성
- 새로운 스레드 생성 & 스레드 실행 시작
- 부모 프로세스의 주소공간 공유
- 프로세스 내 병렬적 실행
- clone()
: 리눅스 커널의 clone() 시스템 호출을 사용해 스레드 생성
- fork()와 비슷하나 추가적인 플래그를 통해 스레드 생성 가능
- 부모와 자식간의 리소스 공유
좀비 프로세스와 고아 프로세스
일반적인 프로세스의 종료
: 프로세스 종료 시 ‘어떻게 종료되었는지’를 exite status에 저장
-
정상종료
- 프로세스가 작업을 완료하고 더 이상 실행할 작업이 없는 경우
- 프로세스는 종료 코드(Exit Code)를 반환하며 운영 체제에 종료 신호 보냄
-
명시적인 종료 요청
- 시그널을 통해 운영 체제 또는 외부 요인으로부터 종료를 요청 받음
- 시그널 처리 후 종료작업 수행
-
다른 프로세스에 의한 종료
- 부모 프로세스가 자식 프로세스의 종료를 기다릴 때, 자식 프로세스가 종료되면 종료
- 프로세스 간 통신(IPC) 기법인 프로세스간 파이프, 소켓 등을 사용해 구현
-
시스템 종료
- 운영 체제가 종료되거나 재부팅되는 경우, 실행 중인 모든 프로세스는 종료
- 운영 체제에서 제공하는 종료 시그널 또는 시스템 호출을 통해 이뤄짐
- 일반적으로 0은 정상종료를 나타냄
- 자식 프로세스의 종료 상태를 부모 프로세스에게 전달
wait()
- 부모 프로세스가 자식 프로세스의 종료상태를 얻기 위해 사용
- 부모 프로세스는 wait()함수를 사용해 자식 프로세스가 종료될 때까지 기다림
좀비 프로세스 (Zombie Process)
: 실행을 완료했으나 죽지 않고 계속 프로세스 테이블에 남아 있는 프로세스
- 자식 프로세스가 종료가 되었지만 부모 프로세스가 아직 wait() 호출을 하지 않은 프로세스
- 종료된 프로세스의 상태를 수집하지 않는 부모 프로세스가 있을 때 발생
- 시스템 리소스를 차지하지만 실행 코드는 없음
- 일반적으로 시스템에 문제를 일으키지는 않음
- 부모 프로세스보다 먼저 종료된 경우, zombie state가 됨
- 자원 등은 모두 반납된 상태이나, 커널에 최소한의 정보(exit status, PID)가 남은 상태 ⇒ 부모 프로세스가 시스템 콜을 호출해 exit status를 얻어갈 때가지 좀비 프로세스로 남아있음
고아 프로세스 (Orphan Process)
: 부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우
-
부모 프로세스가 wait()을 호출하는 대신에 그냥 종료를 해버리는 것
-
OS에서 고아프로세스 방지를 위한 방법
- 부모 프로세스가 먼저 종료되면, 커널은 자식 프로세스의 새로운 부모 프로세스로 init(PID=1)설정
- 자식 프로세스가 종료될 때까지 기다리며 그 후에 wait()를 호출하여 종료 상태를 얻음
- 고아 프로세스는 시스템의 자원을 낭비할 수 있고, 시스템이 프로세스가 종료될때까지 추적을 해야해 성능저하의 원인이 됨
자식 프로세스가 상태를 알리지 않고 죽거나, 부모 프로세스가 먼저 죽는 경우 처리 과정
- 시그널 처리
- 일반적으로 시그널을 사용해 자식 프로세스의 종료를 감지하고 처리한다.
- wait()함수로 자식 프로세스 감시
- wait()함수를 사용해 자식 프로세스가 종료 될때까지 대기하고 상태 확인
- 리소스 관리
- 부모 프로세스 종료 시 OS는 시그널을 보내 자식 프로세스 종료
- 자식 프로세스가 고아프로세스로 남아 시스템 리소스 소비 방지
데몬프로세스
데몬 프로세스(Daemon process)
: 백그라운드에서 실행되는 프로세스
- 주로 시스템 서비스나 백엔드 작업 수행
- 사용자의 로그인 세션과 관련 없이 시스템 전반에서 동작
- 일반적으로 웹사이트 서버 가동, 네트워크 서비스, 스케줄러 실행과 같은 장기 작업에 사용
- 시스템의 안정성과 지속적인 서비스 제공을 위한 역할 수행
특징
- 백그라운드 실행
- 백그라운드에서 실행되며 사용자 인터페이스를 가지지 않음
- 사용자가 로그인 세션을 종료해도 계속 실행
- 자동 시작 및 종료
- 시스템 부팅 시 자동으로 시작, 시스템 종료 시 안전하게 종료
- 지속적인 서비스 제공과 시스템 안정성 유지
- 리소스 관리
- 시스템 리소스에 접근해 서비스 제공
- 로그 기록
- 시스템 이벤트, 오류, 상태 정보등을 로그 파일에 기록해 모니터링 및 디버깅에 활용