프로세스(Process)

Tony·2023년 5월 11일
0

Process

목록 보기
1/2

프로세스는 실행 중인 프로그램을 뜻합니다. 프로그램은 단순히 스토리지에 저장된 명령어 파일이라고 하면, 프로세스는 프로그램 카운터를 사용하여 명령어 파일의 명령어를 실행합니다.

프로그램을 복수번 실행하면, 실행한만큼 동일한 프로그램을 실행하는 프로세스가 만들어집니다. 그러나 각각의 프로세스는 독립적입니다.

프로세스 상태

  • New : 프로세스가 생성 중인 상태입니다.
  • Ready : 프로세스가 곧바로 실행될 수 있고, 실행될 순서를 기다리고 있는 상태입니다.
  • Running : 프로세스가 실행 중인 상태입니다.
  • Waiting : 프로세스가 IO 작업이나 다른 작업이 완료되기를 기다리는 상태입니다.
  • Terminated : 프로세스가 종료된 상태입니다.

프로세스 메모리

  • Code (Text) : 실행되는 프로그램의 코드입니다.
  • Heap : 프로세스가 직접 할당할 수 있는 메모리 공간입니다.
  • Stack : Local 변수나 함수 파라미터가 임시적으로 저장되는 메모리 공간입니다.
  • Data : 초기화된 전역변수, 정적 변수와 같이 프로세스의 시작부터 종료까지 유지되는 데이터입니다.
  • BSS : 초기화되지 않은 전역변수, 정적 변수와 같이 프로세스의 시작부터 종료까지 유지되는 데이터입니다.

Compile time에 Code, Data, BSS의 크기는 고정됩니다. Compile 이후 목적파일에는 Code, Data는 파일 크기를 차지하지만, BSS의 경우 파일 크기를 차지하지 않습니다.(어느 변수가 BSS에 있는 지에 대한 메타데이터는 저장됩니다.) 메모리에 프로그램에 로드되면, BSS는 그때 초기값이 할당되어 메모리 공간을 차지하게 됩니다.

프로세스 메모리에 대해서는 다음 글에서 더 자세히 기술하겠습니다.

Process Control Block

프로세스의 정보를 이곳에 저장합니다.

  • Process ID (PID)
  • 레지스터 : 프로그램 카운터를 포함한 레지스터 값들이 저장됩니다.
  • CPU 스케줄링 정보 : 프로세스 우선순위, 스케줄링 큐에 대한 포인터 등과 같은 스케줄링에 관련된 파라미터가 저장됩니다.
  • 메모리 관리 정보 : 프로세스가 적재된 메모리의 시작 주소값을 가지는 base register와 마지막 주소값을 나타내는 limit register 값이 저장됩니다. 또한, 페이지 테이블이나 세그먼트 테이블이 저장됩니다.
  • 통계 정보 : CPU 사용량이나 실행 시간 등이 저장됩니다.
  • 사용한 파일과 입출력장치 목록: 사용했던 입출력장치와 열었던 파일에 대한 정보들이 저장됩니다.

프로세스 계층 구조

[Figure1]

프로세스는 부모 프로세스가 자신을 복제하여 자식 프로세스를 만들어내고 이를 활용합니다. 따라서 프로세스의 계층 구조는 트리와 같은 형태를 띕니다.

프로세스 생성/종료

부모 프로세스는 fork()를 실행하여 자기 자신의 복제인 자식 프로세스를 생성합니다. 자식 프로세스는 Process ID이나 사용 메모리 주소와 같이 유일하게 사용되어야 하는 값을 제외하고는 모든 값을 부모 프로세스로부터 물려받습니다. 컴퓨터가 부팅되면 가장 먼저 PID=1인 프로세스가 실행되고, 이 프로세스로부터 모든 프로세스가 생성됩니다.

fork()는 단순히 부모 프로세스의 복제를 만들어줍니다. 따라서 exec()을 사용하여 자식프로세스의 코드, 데이터, BSS영역을 새로운 프로그램으로 덧씌웁니다. 이때, 스택과 힙은 초기화됩니다.

부모 프로세스는 자식 프로세스의 종료 이후 자원의 해제를 위해 wait()를 호출해야합니다. wait() 어느 시점에서나 호출이 가능하고, 자식 프로세스가 종료될때까지 부모 프로세스의 실행은 멈춥니다.(waiting) 자식프로세스의 실행이 끝났어도, 부모 프로세스가 wait()을 호출할때까지 (PID, termination status, resource usage information) 을 유지합니다. 자원 해제가 되지 않으므로 좀비 프로세스라고 부릅니다. PCB는 kernel process table에 저장되는데, 좀비 프로세스가 많아진다면 kernel process table가 꽉찰 수도 있습니다. 이때, 더이상 프로세스를 생성하지 못합니다. 만약 부모 프로세스가 좀비 프로세스의 자원 해제를 하지 않고 끝난다면, 좀비 프로세스는 PID=1 프로세스(systemd 등)에 할당됩니다.

Reference

Figure1 : A study of initialization in Linux and OpenBSD - Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/Process-Hierarchy-within-Linux_fig4_220623906 [accessed 11 May, 2023]

0개의 댓글