프로세스
: 실행을 위해 시스템(커널)에 등록된 작업
시스템 성능향상을 위해 커널에 의해 관리 됨
프로그램이 메모리로 적재되면 프로세스가 됨
각종 자원들을 요청하고 할당 받을 수 있는 개체
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)
: 백그라운드에서 실행되는 프로세스
주로 시스템 서비스나 백엔드 작업 수행
사용자의 로그인 세션과 관련 없이 시스템 전반에서 동작
일반적으로 웹사이트 서버 가동, 네트워크 서비스, 스케줄러 실행과 같은 장기 작업에 사용
시스템의 안정성과 지속적인 서비스 제공을 위한 역할 수행
특징
백그라운드 실행
백그라운드에서 실행되며 사용자 인터페이스를 가지지 않음
사용자가 로그인 세션을 종료해도 계속 실행
자동 시작 및 종료
시스템 부팅 시 자동으로 시작, 시스템 종료 시 안전하게 종료
지속적인 서비스 제공과 시스템 안정성 유지
리소스 관리
시스템 리소스에 접근해 서비스 제공
로그 기록
시스템 이벤트, 오류, 상태 정보등을 로그 파일에 기록해 모니터링 및 디버깅에 활용
Last updated