프로세스는 실행 중인 프로그램을 뜻합니다. 프로그램은 단순히 스토리지에 저장된 명령어 파일이라고 하면, 프로세스는 프로그램 카운터를 사용하여 명령어 파일의 명령어를 실행합니다.
프로그램을 복수번 실행하면, 실행한만큼 동일한 프로그램을 실행하는 프로세스가 만들어집니다. 그러나 각각의 프로세스는 독립적입니다.
Compile time에 Code, Data, BSS의 크기는 고정됩니다. Compile 이후 목적파일에는 Code, Data는 파일 크기를 차지하지만, BSS의 경우 파일 크기를 차지하지 않습니다.(어느 변수가 BSS에 있는 지에 대한 메타데이터는 저장됩니다.) 메모리에 프로그램에 로드되면, BSS는 그때 초기값이 할당되어 메모리 공간을 차지하게 됩니다.
프로세스 메모리에 대해서는 다음 글에서 더 자세히 기술하겠습니다.
프로세스의 정보를 이곳에 저장합니다.
[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 등)에 할당됩니다.
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]