프로세스(Process)

프로세스란 컴퓨터에서 실행 중인 프로그램을 말한다. *프로그램이 실행되기 위해 메모리에 올라와 동적인 상태가 되면 프로세스라고 한다. 또한 프로세스는 컴퓨터의 작업 단위로, 태스크(Task)라고도 한다.

프로그램(Program)
어떤 데이터로 어떤 작업을 할지 절차를 적어놓은 것으로, 저장 장치에 정적인 상태로 저장되어 있다.

운영체제도 프로그램이기 때문에 프로세스 형태로 실행된다.

한 컴퓨터나 스마트폰 기기에는 여러 개의 프로세스들이 존재한다. 이 프로세스들은 CPU에 의해 제어되며, 현재 실행 중인 단계에 맞는 *상태를 가진다.
멀티 프로세서 또는 듀얼코어 이상인 CPU의 경우, 프로세스가 실제로 동시에 실행될 수 있다. 반면 싱글 코어 CPU의 경우에는 *스케줄링으로 동시에 실행되는 것처럼 보이게 할 수 있다.

🔗 프로세스의 상태
🔗 같이 보면 좋은 CPU
🔗 CPU 스케줄링

프로세스의 통신

단일 컴퓨터 내에서 프로그램 간 통신을 하거나 네트워크를 통해 통신을 할 때 실제로 데이터를 주고 받는 주체가 프로세스이다. 프로세스들이 데이터를 주고 받는 방법을 *IPC라고 한다.

🔗 프로세스 간 통신(IPC, Inter Process Communication)

서버의 경우, 클라이언트의 요청을 받으면 서버 프로세스가 직접 응답하는 것이 아니라 자식 프로세스를 생성하여 응답을 처리하고 전달한다.

프로세스의 메모리 공간

프로세스 별로 메모리 공간을 시스템으로부터 할당받기 때문에 독립적인 코드, 데이터, 스택, 힙 공간을 보유한다. 이를 통해 프로세스 간 간섭을 방지할 수 있다.

PID(Process ID)

운영체제에서 프로세스를 식별하기 위해 부여하는 번호이다. 16bit signed integer를 사용하여 최대값은 32768이다.
새로운 PID는 최근 할당 된 PID에 1을 더한 값으로 할당된다. 순서대로 할당되다가 최대값을 넘어가면 다시 1부터 시작된다.

PPID(Parent Process ID)CPID(Child Process ID)는 각각 부모 프로세스와 자식 프로세스의 PID를 뜻한다.

PCB(Process Control Block)

CPU가 프로세스를 실행하기 위해 필요한 정보들이 저장되는 공간으로, TCB(Task Control Block)라고도 한다.
운영체제가 프로그램을 메모리의 적당한 위치로 가져오고 프로세스가 생성되면, heap 영역에 해당 프로세스의 PCB가 함께 생성된다. 프로세스 종료 시 삭제된다.

PCB에 저장되는 정보

  1. 프로세스 식별자(PID)

  2. 프로세스 상태(Process State)

  3. 프로그램 계수기(PC, Program Counter)
    프로세스가 다음에 실행할 명령어의 주소를 저장한다.
    컨텍스트 스위칭 시, 프로세스가 실행 중이던 위치를 저장하여 이후 재개 가능하도록 한다.

  4. CPU 레지스터(CPU Registers)
    프로세스가 실행될 때 사용했던 CPU 레지스터 값들을 저장한다.
    컨텍스트 스위칭 시, 레지스터 값을 저장하고 다시 로드하여 실행 흐름을 이어나갈 수 있도록 한다.

  5. 메모리 관리 정보
    프로세스가 사용하는 메모리 영역 관련 정보이다.
    메모리 영역의 주소와 페이지 테이블, 세그먼트 테이블 등 메모리 매핑 정보를 포함한다.

  6. 프로세스 우선순위(Priority)
    프로세스 스케줄링을 위해 우선순위 값을 저장하며, 높은 우선순위를 가진 프로세스가 먼저 실행될 가능성이 높다.

  7. 입출력 상태 정보(I/O Status Information)
    프로세스가 사용하는 입출력 장치 목록 및 상태, 프로세스가 열고 있는 파일 디스크립터(File Descriptor)를 저장한다.

  8. 프로세스 스케줄링 정보
    Ready Queue, Waiting Queue 등에 대한 포인터와 프로세스가 속한 큐의 정보, CPU 점유 시간, 스케줄링 정책 등을 포함한다.

  9. 계정 및 보안 정보
    프로세스를 실행한 사용자 ID(UID) 및 그룹 ID(GID), 접근 권한 및 보안 속성 정보를 포함한다.

  10. 포인터
    부모 또는 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등을 저장한다.

  11. CPID와 PPID


프로세스의 부모-자식 관계

프로세스의 생성 및 관리, 프로세스의 종료 후 자원 회수를 용이하게 하기 위해 프로세스는 부모-자식 관계로 이루어져있다.

자식 프로세스가 exit() 또는 return()으로 종료되면, 부모가 wait() 시스템 콜을 통해 자식 프로세스의 종료 상태를 회수할 수 있다.

init 프로세스

커널이 처음 메모리에 올라와 부팅되면 커널 관련 프로세스를 여러 개 생성한다. 가장 처음으로 PID 1을 가지는 init(systemd) 프로세스를 생성하고, 이후 생성되는 프로세스는 직접 혹은 간접적으로 init 프로세스와 연결된다.

고아 프로세스(Orphan Process)와 좀비 프로세스(Zombie Process)

부모는 자원을 회수하기 위해 자식이 종료되기를 기다려야 한다. 부모가 자식보다 먼저 종료되거나 연락이 되지 않으면, 자식은 종료되지 않거나 종료 되었음에도 사용하던 자원이 남게 된다.

부모가 자식보다 먼저 죽었을 경우 고아 프로세스가 되며, init 프로세스의 자식이 되어 PPID가 1로 설정된다. init 프로세스는 주기적으로 wait() 시스템 콜을 호출하고, 고아 프로세스의 작업이 종료되면 종료 상태를 회수하기 때문에 자원 낭비가 발생하지 않는다. 그러나 시스템이 프로세스가 종료될 때까지 추적해야 하기 때문에 성능 저하의 원인이 된다.

자식이 종료되면 커널은 자식의 종료 상태를 저장하고 좀비 상태로 만든다. 이때 부모가 자식의 상태를 회수하지 않을 경우 계속 좀비 프로세스로 남는다. 리소스는 커널에 의해 이미 회수되어 메모리 누수가 발생하지는 않지만 PID를 차지한 채로 프로세스 테이블에 남아있는 상태로, 다른 프로세스의 실행을 방해하는 문제가 발생할 수 있다.


프로세스 복사 / 전환

fork()

실행 중인 프로세스로부터 새로운 프로세스를 복사하는 *시스템 콜 함수이다.

시스템 콜(System Call)
사용자 프로그램이 운영체제의 기능(파일 읽기, 프로세스 생성, 메모리 할당 등)을 사용할 때, 커널에 직접 요청하는 방식이다.
open(), read(), write() 같은 함수들이 시스템 콜에 해당한다.

기존의 프로세스는 부모, 생성된 프로세스는 자식이 된다.
Copy-on-Write(COW) 기법으로 자식 프로세스는 처음 생성 시에는 *페이지 테이블을 복사하고, 값이 바뀜과 동시에 새로운 데이터 영역이 할당 된다. 이러한 방식으로 불필요한 메모리 복사를 방지하여 성능을 최적화할 수 있고, 프로세스가 생성되는 속도를 향상할 수 있다.

페이지 테이블
가상 주소를 물리 주소로 변환하는 데이터 구조로, 운영체제가 가상 메모리 시스템을 관리할 때 필수적으로 사용된다.

프로세스 복사는 추가 작업 없이 자원을 상속할 수 있고, 시스템 관리를 효율적으로 할 수 있다는 장점이 있다.

exec()

기존의 프로세스를 새로운 프로세스로 전환하는 시스템 콜 함수이다.
프로세스는 그대로 둔 채로 실행하는 내용만 바꾸는 방식으로, 다음과 같이 바뀐다.

  • 코드 영역에 있는 내용을 새로운 코드로 교체
  • 데이터 영역을 새로운 변수로 채움
  • 스택 영역을 리셋
  • PID, PPID, CPID, 메모리 관련 사항을 제외한 PCB 내용을 리셋

프로세스의 구조를 재활용하고 새로운 코드 영역만 가져오기 위해 사용한다.

profile
유자맛 찹쌀유과

0개의 댓글