프로세스의 생성과정
컴퓨터가 부팅될 때, 초기 여러 과정을 거치고
커널이 메모리에 로드되고 실행되면,
커널은 하드웨어와 시스템 리소스를 초기화하고 드라이버를 로드한다.
커널 초기화 후, 커널은 시스템의 첫 번째 프로세스인 init을 시작한다.
이 프로세스는 프로세스 ID (PID) 1을 가지며, 모든 다른 사용자 프로세스의 조상이 된다.
일반적으로 프로세스가 생성될 때는 다음과 같은 방법으로 생성된다.
특정 프로세스를 실행하면 운영체제는 해당 프로그램의 코드영역, 데이터영역을 로드하고
빈 Stack과 빈 Heap 을 만들어 공간을 확보해 준다.
그다음 해당 프로세스를 관리하기 위한 PCB를 만들어서 값을 초기화해준다.
특정 프로그램을 실행할 때,
새로운 프로세스를 직접 생성하지 않고 1번 프로세스를 복사해서 생성한다.
프로세스를 새로 생성하는 것보다 복사를 하는 게 더 빠르게 생성할 수 있기 때문이다.
1번 프로세스를 복사해서 생성되는 프로세스는 1번 프로세스의 자식 프로세스라고 부르고
이 자식 프로세스 입장에서 1번 프로세스는 부모 프로세스가 된다.
자식 프로세스는 부모 프로세스의 코드, 데이터, 스택, 힙 영역과 PCB 내용 전부를 복사한다.
만약. 부모 프로세스의 데이터를 복사만 한다면,
1번 프로세스가 똑같이 실행되는 것과 같은 개념이 된다.
그래서 자신이 원하는 프로그램(코드)을 실행시키려면 exec() 함수를 사용해야 한다.
fork() 함수로 프로세스를 복사한 다음 exec() 함수를 실행시키면,
부모를 복사한 자식 프로세스의 코드영역 데이터, 힙, 스택 영역을 원하는 값으로 덮어쓸 수 있다.
그럼 이때부터는 자식 프로세스는 부모 프로세스와 완전히 다르게 동작하게 된다.
부모 프로세스와 자식 프로세스의 동작
부모 프로세스와 자식 프로세스는 CPU 스케줄링에 따라 실행되는데,
어떤 프로세스가 먼저 실행될지는 운영체제의 결정에 따른다.
부모 프로세스가 먼저 실행되었다고 가정해 보자.
일단 부모 프로세스는 wait() 함수를 호출한다.
해당 함수는 자식 프로세스에게서 exit() 신호가 올 때까지 기다리는 시스템 함수이다.
콘텍스트 스위칭을 거쳐 부모프로세스에게 CPU가 할당되어도
자식 프로세스의 exit() 신호가 오기 전까지는 다른 코드를 실행하지 않는다.
CPU 스케줄링에 의해서 자식 프로세스가 실행된 상황이라고 가정하자.
자식 프로세스는 부모프로세스를 fork() 한다.
그다음 exec() 함수를 사용하여 실행하고자 하는 프로그램을 실행한다.
그럼 해당 프로그램에서 코드와 데이터 영역을 가져와 자식 프로세스를 덮어쓰게 된다.
이제부터 부모 프로세스와는 완전히 다른 자식 프로세스로서 동작하게 된다.
해당 프로그램을 사용하다가 종료가 되면,
exit()를 호출하고 자식프로세스의 종료를 부모 프로세스에게 알린다.
이제 CPU 스케줄링으로 다시 부모 프로세스가 실행된 상황이라고 하자.
wait() 함수로 자식 프로세스의 종료를 기다리고 있었는데,
자식 프로세스로부터 exit() 신호가 왔으므로
부모 프로세스는 자식 프로세스를 완전히 종료시킨다.
exit() 함수는 자식 프로세스가 부모프로세스에게 정상종료를 알리는 함수이다.
부모프로세스는 자식 프로세스의 Exit Status를 읽고 자식 프로세스를 정리한다.
만약 부모 프로세스가 자식 프로세스보다 먼저 종료되거나,
자식 프로세스가 비정상적으로 종료되어서
exit() 신호를 주지 못해서 부모 프로세스가 Exit Status를 읽지 못해
메모리에 계속 살아있는 상태를 "좀비 프로세스"라고 부른다.
컴퓨터를 오래 켜두면 느려지는 현상이 발생하고는 하는데,
이는 여러 프로세스가 메모리에 올라온 것도 있지만,
좀비 프로세스가 많아져서 메모리를 차지하는 경우가 있다.
컴퓨터를 재부팅하면 메모리가 초기화되기 때문에 다시 빨라지게 된다.
'운영체제' 카테고리의 다른 글
[운영체제] CPU 스케줄링 - 다중 큐 (0) | 2024.05.23 |
---|---|
[운영체제] Thread (쓰레드) (0) | 2024.05.22 |
[운영체제] Context Switching (문맥교환) (0) | 2024.05.20 |
[운영체제] 프로세스 상태 (Process Status) (0) | 2024.05.16 |
[운영체제] PCB(Process Control Block) (0) | 2024.05.14 |