문제는 엄청 간단해 보이는데 모르면 못 푸는 그런 기본기 문제..
OS 프 로 세 스 으악
문제
아래 코드가 실행되면 시작 프로세스를 포함하여 총 몇 개의 프로세스가 생성되는가?
단, 프로세스 생성이 실패하는 경우는 없다고 가정한다.
int main() {
if(fork() > 0)
fork();
}
풀이
일단 fork() 함수에 대해 알고 있어야 한다.
어떤 프로그램을 실행 중인 프로세스에서 fork()함수를 호출하면, 새로운 프로세스를 하나 생성하면서 자신은 부모 프로세스가, 새로 생성된 프로세스는 자식 프로세스가 된다.
또한, 자식 프로세스는 부모 프로세스가 자기를 생성한 fork() 다음부터의 모든 작업을 수행하게 되며, 부모 프로세스는 자식 프로세스가 끝날 때 까지 wait한다.
이와 더불어, fork()의 리턴값이 부모 프로세스와 자식 프로세스가 다르다. fork()를 호출한 부모 프로세스에서는 자식 프로세스의 PID(0보다 큼, 프로세스 생성 실패할 경우 음수값)가, 부모 프로세스의 fork() 호출로 의해 생성된 자식 프로세스에서는 해당 fork()의 리턴 값으로 0을 가지게 된다.
위의 코드의 프로세스 생성 및 실행 과정을 그림으로 도식화 해 보았다.
설명을 해 보자면, 일단 저 코드를 실행하고 있는 프로세스에서 fork()함수를 만날 것이다.
이로 인해 원래 자식1 프로세스가 생성되며, 그 코드를 실행하던 프로세스는 부모 프로세스가 되어 자식1의 PID를 fork()의 리턴 값으로 받고 자식1이 끝나기를 wait 할 것이다.
자식1 프로세스가 먼저 실행되게 되는데, 위에서 말했듯이 자식 프로세스는 부모 프로세스가 fork()를 부른 다음 명령어부터 실행한다고 했다.
if(fork() > 0)에서 먼저 fork()가 실행되었으므로, 그 다음 처리할 명령어는 if문이다.
자식 프로세스에서는 fork()의 리턴 값이 0이므로, if(0 > 0) 명령어를 수행할 것이며 이는 false이므로 if문 내부의 코드를 실행시키지 못하며, 더 이상의 명령어가 없으므로 자식1 프로세스는 종료된다 (exit()).
자식1 프로세스가 exit() 되면서 부모의 wait()이 풀리게 되고, fork()를 호출한 다음부터 명령어를 계속 수행해 나가게 된다.
부모 프로세스에서는 fork()의 명령어로 생성에 성공했던 자식1 프로세스의 PID를 받았을 것이므로 이는 0보다 크다.
따라서 if문이 true가 되어 if문 내부의 명령어를 실행하게 된다.
if문 내부의 명령어로는 또 다른 fork()를 만나게 되어, 이를 실행하며 다시 부모 프로세스는 새로운 자식2 프로세스를 생성하고 자식2 프로세스의 PID를 fork()의 리턴 값으로 얻은 뒤 wait() 상태에 들어간다.
자식2 프로세스는 fork() 명령어 다음부터 실행되며, 더 이상의 명령어가 없으므로 별다른 일을 하지 않고 종료된다.
자식2 프로세스가 exit() 되면서 부모 프로세스의 wait()이 끝나게 되고, 부모 프로세스 또한 더 이상의 명령어가 없으므로 종료된다.
이 과정에서 부모 프로세스, 자식1 프로세스, 자식2 프로세스가 생성되므로 총 3개의 프로세스가 생성된다.
이 풀이는 나의 나름 논리적이라고 생각하는 뇌피셜과 우리 스터디 팀원들의 검수..?를 받아 작성된 것이다.
혹시나 틀린 부분이 있다면 댓글로 남겨주세요! 잘못된 것을 옳다고 생각ㅎㅏ다간 큰일날세...
'잡다한 지식 > CS 베이스' 카테고리의 다른 글
[한국은행 전산학 기출][2019] 객체지향 언어의 특징 (0) | 2021.05.09 |
---|---|
[한국은행 전산학 기출][2019] 다중 상속의 문제점 (0) | 2021.04.23 |
[한국은행 전산학 기출][2010] 허프만 트리를 이용한 문자열 압축 (4) | 2021.04.23 |
[프로그래밍언어론] 오버로딩(overloading)과 오버라이딩(overriding)의 차이점 (0) | 2021.03.26 |
[프로그래밍언어론] 객체지향 프로그래밍 언어의 특징 (0) | 2021.03.26 |