초코딩(chocoding)

[혼공컴운] 10-2 / 프로세스 상태와 계층 구조 본문

[혼공컴운] 혼자 공부하는 컴퓨터 구조와 운영체제

[혼공컴운] 10-2 / 프로세스 상태와 계층 구조

sweetychocoding 2023. 8. 4. 09:25
728x90

프로세스 상태

=> 컴퓨터를 사용할 때 여러 프로세스드이 빠르게 번갈아 가면서 실행된다. 이때 하나의 프로세스는 여러 상태를 거치며 실행되는데 대표적인 상태는 아래와 같다.

 

생성 상태 (new) - 메모리에 적재되어 PCB를 할당받은 상태

준비 상태 (ready) - 바로 실행 가능하지만, 자신의 차례가 아니기 때문에 기다리고 있는 상태

실행 상태 (running) - CPU를 할당받아 실행 중인 상태

대기 상태 (blocked) - 입출력 장치의 작업을 기다리는 상태

종료 상태 (terminated) - 프로세스가 종료된 상태

 

 

프로세스 상태 다이어그램 (process state diagram) / 출처 : https://www.crocus.co.kr/1369

 

 

프로세스 계층 구조

=> 새 프로세스가 생성한 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다.

많은 운영체제는 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리한다.

 

프로세스 계층 구조 / 출처 : https://velog.io/@sieunpark

부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기 때문에 다른 PID를 가진다.

이때 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 한다.

 

최초의 프로세스 PID는 항상 1번이며, 모든 프로세스 최상단에 있는 부모 프로세스이다.

pstree 명령어를 사용하면 프로세스 계층 구조를 볼 수 있다.

 

<최초의 프로세스>

유닉스 운영체제 : init

리눅스 운영체제 : systemd

macOS : launchd

 

 

프로세스 생성 기법

=> 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해내고, 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

 

fork

=> 자기 자신 프로세스의 복사본을 만드느 시스템 호출

=> 자식 프로세스에게 메모리 내의 내용, 열린 파일의 목록 등을 상속한다. 하지만 복사된 자식 프로세스라 해도 PID의 값이나 저장된 메모리의 위치는 다르다.

 

위에 "복사된 자식 프로세스라 해도 PID의 값이나 저장된 메모리의 위치는 다르다." 라는 말이 와닿지 않아 내 친구 GPT에게 물어봤다.

 

#include <stdio.h>
#include <unistd.h>

int main() {
    int x = 10;
    pid_t pid = fork();

    if (pid == 0) {
        // 자식 프로세스일 때
        printf("자식 프로세스 - x의 주소: %p, x의 값: %d\n", &x, x);
        x = 20; // 자식 프로세스에서 x의 값을 변경
        printf("자식 프로세스 - x의 주소: %p, 변경된 x의 값: %d\n", &x, x);
    } else if (pid > 0) {
        // 부모 프로세스일 때
        printf("부모 프로세스 - x의 주소: %p, x의 값: %d\n", &x, x);
        x = 30; // 부모 프로세스에서 x의 값을 변경
        printf("부모 프로세스 - x의 주소: %p, 변경된 x의 값: %d\n", &x, x);
    } else {
        // fork 실패 시
        printf("fork 실패\n");
        return 1;
    }

    return 0;
}

 

 

부모 프로세스와 자식 프로세스가 동일한 코드와 데이터를 가지지만, 실제 메모리 주소는 다르게 할당된다는 것을 알게 되었다. 하지만 위 코드에서 fork() 반환값을 잘 알지 못해서 왜 if문을 저렇게 나눈건지 궁금했다.

 

역시 내 친구는 친절하고 똑똑하다.

이해가 단숨에 완료~되었다.

 

exec

=> 자신의 메모리 공간을 새로운 프로그램을 덮어쓰는 시스템 호출

 

따라서..!

부모가 자식 프로세스를 실행하며 프로세스 계층 구조를 이루는 과정은 fork과 exec가 반복되는 과정이라고 할 수 있다.

 

하지만 부모 프로세스가 자식 프로세스를 fork한 뒤에 부모 프로세스, 자식 프로세스 누구도 exec를 호출하지 않는 경우도 존재한다. 이 경우는 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.

728x90