coyotek 2008. 5. 26. 15:08
 

우선 예재 프로그램을 대충 만들어 보겠습니다.

각 section은 어떤 특정한 일을 하는 부분이고, pid, pid2는 미리 선언했다고 가정합시다.


// section A


pid = fork();

if (pid != 0) {

    // section B

}

else {

    // section C

    pid2 = fork();

    if (pid2 != 0) {

        // section D

    }

    else {

        // section E

    }

    // section F

}


section G



자.. 이제 이 프로그램을 컴파일해서 실행파일을 만들구요...

실행 파일을 실행 시키면 우선 첫 프로세스가 뜨겠죠? 이놈을 P1이라고 부릅시다.

P1은 프로그램이 짜여진대로 section A를 실행하고 pid = fork()문을 만납니다.

그리고 fork()를 실행하지요... 그러면 새로운 프로세스가 만들어지는데 P2라고 부릅시다.


P2는 P1의 환경을 그대로 가져옵니다. 즉, 지금 프로그램이 어디까지 실행되었는가라는

정보까지 그대로 가져오지요.. 그래서 P1도 P2도 모두 fork())이후의 pid = (fork()의 return 값)

pid에 대입하는 부분부터 실행합니다.

자.. 문제는 P1은 fork로부터 P2의 프로세스 ID를 받습니다.

새로 프로세스가 만들어졌으니 당연히 프로세스 ID가 있겠죠?

P2는 자기가 새로 만들어진 놈이므로 그냥 0을 return 받습니다.

따라서 똑같은 부분부터 시작은 하되.... fork()의 return값은 다른 놈을 가지고 P1, P2가 실행됩니다.

이 때, 우리는 주로 P1을 부모, P2를 자식이라고 설명합니다.


바로 다음 if문에 의해서

P1은 section B를 실행하게 되고 P2는 section C를 실행하게 됩니다. 

return 받은 pid가 다르니까 if의 조건이 달라지죠?

P1은 section B를 실행한 후에 당연히 section G를 실행하고 끝납니다.

P2는 section C를 실행하고 다시 fork()를 만납니다.

fork를 실행하면 아시다시피 fork를 호출한 프로세스와 똑같은 프로세스가 하나 더

만들어 집니다.

즉 P2와 똑같은 놈 P3가 만들어지고 fork()로 부터 return을

P2는 P3의 프로세스 ID를 받고

P3는 자신이 fork되었으니 0을 받습니다.

그리고는 똑같은 위치인 pid2 = (fork의 return값) 을 실행합니다.

이때는 P2가 부모이고 P3가 자식이죠?

P2는 section D, F, G를 차례로 수행하고 끝날테구요..

P3는 section E,F,G를 수행하고 끝납니다.


여기서 주의할 점은 각 프로세스가 어느 놈이 먼저 수행될지는 아무도 모른다는 것이고,

이를 위해서 동기화 방법들이 있는 것입니다.


원본 위치 <http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10203&eid=n8OK2wWtO3/UXmPooNhPW2sdQgvDEWQz&qb=Zm9yaw==&pid=fvpKRloQsClssaVBrfdsss--408388&sid=SDpMUhYpOkgAAFsjn@k>