# 프로세스

\


: 실행을 위해 시스템(커널)에 등록된 작업

* 시스템 성능향상을 위해 커널에 의해 관리 됨
* 프로그램이 메모리로 적재되면 프로세스가 됨
* 각종 자원들을 요청하고 할당 받을 수 있는 개체
* 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에서 고아프로세스 방지를 위한 방법

1. 부모 프로세스가 먼저 종료되면, 커널은 자식 프로세스의 새로운 부모 프로세스로 init(PID=1)설정
2. 자식 프로세스가 종료될 때까지 기다리며 그 후에 wait()를 호출하여 종료 상태를 얻음

* 고아 프로세스는 시스템의 자원을 낭비할 수 있고, 시스템이 프로세스가 종료될때까지 추적을 해야해 성능저하의 원인이 됨

\


**자식 프로세스가 상태를 알리지 않고 죽거나, 부모 프로세스가 먼저 죽는 경우 처리 과정**

* 시그널 처리
  * 일반적으로 시그널을 사용해 자식 프로세스의 종료를 감지하고 처리한다.
* wait()함수로 자식 프로세스 감시
  * wait()함수를 사용해 자식 프로세스가 종료 될때까지 대기하고 상태 확인
* 리소스 관리
  * 부모 프로세스 종료 시 OS는 시그널을 보내 자식 프로세스 종료
  * 자식 프로세스가 고아프로세스로 남아 시스템 리소스 소비 방지

\
\


## 데몬프로세스

데몬 프로세스(Daemon process)

: 백그라운드에서 실행되는 프로세스

* 주로 시스템 서비스나 백엔드 작업 수행
* 사용자의 로그인 세션과 관련 없이 시스템 전반에서 동작
* 일반적으로 웹사이트 서버 가동, 네트워크 서비스, 스케줄러 실행과 같은 장기 작업에 사용
* 시스템의 안정성과 지속적인 서비스 제공을 위한 역할 수행

\


#### 특징

* 백그라운드 실행
  * 백그라운드에서 실행되며 사용자 인터페이스를 가지지 않음
  * 사용자가 로그인 세션을 종료해도 계속 실행
* 자동 시작 및 종료
  * 시스템 부팅 시 자동으로 시작, 시스템 종료 시 안전하게 종료
  * 지속적인 서비스 제공과 시스템 안정성 유지
* 리소스 관리
  * 시스템 리소스에 접근해 서비스 제공
* 로그 기록
  * 시스템 이벤트, 오류, 상태 정보등을 로그 파일에 기록해 모니터링 및 디버깅에 활용

\
\
