ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] Process & fork
    programing/OS 2017. 9. 21. 01:19


    안녕하세요, Einere입니다.

    오늘은 process와 fork함수에 대해 알아보도록 하겠습니다.



    위의 코드는 하나의 parent process에 대해 n개의 child process를 만드는 코드입니다.


    우선 인덱스를 위한 i, 반복 횟수를 위한 n, 그리고 status를 받기 위한 c_status변수를 선언합니다.

    만들 child process의 개수를 입력 받아 n에 저장합니다.

    fork의 반환값을 저장할 pid_t형 array인 pid[n]을 선언합니다.


    for문을 이용해 fork를 n번 실행하도록 합니다. 이때, child process를 exit시켜 프로세스가 2^n개가 되지 않도록 합니다.

    child process에 대해 exit를 하므로 parent process는 하나이며 child process는 n개 만드는 코드가 완성되었습니다.


    이제 각 process에 대해 waitpid함수를 실행하여 특정 process를 기다리게 합니다.

    이때 parent process만 실행되며, pid[i]에 해당하는 process를 기다리므로 child process가 종료되기를 기다리게 됩니다. (child process는 zombie상태가 되기 때문입니다.)

    이때 실행되는 process가 무슨 process를 기다리는지 출력합니다.

    그리고 child process가 정상적으로 종료된다면 parent pid와 child pid, status를 출력합니다.



    실행 결과입니다.

    Parent process인 2221이 child process인 2222, 2223, 2224, 2225, 2226이 종료될 때까지 기다리는 것을 알 수 있습니다.



    그렇다면 이번에는 child process를 종료시키는 exit함수를 주석처리 해보겠습니다.



    fork함수가 2번 반복되어서 2297, 2298, 2299, 2300의 4개의 process가 만들어졌습니다.

    처음의 코드와는 달리, child process에 대해서도 fork가 실행되어서 2*2인 4개가 된것 입니다.


    결과를 잘 보시면 parent process는 2297, 2298, 2299, 2300이며

    child process는 2298, 2299, 2300이 있는 것을 확인할 수 있습니다.

    -1로 뜨는 것은 종료되지 않았다는 뜻입니다.



    간략하게 정리했습니다.. (process value는 다릅니다.)

    exit를 안한 코드에서는 process가 저렇게 binary tree구조로 생성됩니다.

    최초의 init process가 65이며, fork가 실행될때마다 child process를 중복되지 않게 생성합니다.


    fork함수는 parent process일 경우, child process의 pid를 반환합니다.

    왜냐하면 parent process에서 waitpid함수를 편하게 사용하기 위해서입니다.

    (즉 pid가 65인 process는 pid[0]에 66을 가지고 있으며, pid가 66인 process는 child process이므로 pid[0]에 0을 가지고 있습니다.)


    즉, child process의 pid를 pid[n]에 저장했으므로, waitpid(pid[i], ~~)와 같은 방식으로 편하게 child process를 wait할 수 있습니다.

    결국, pid가 65인 parent process의 pid[]에 저장된 값은 66,67입니다.

    위의 결과 스크린샷에서도 "waiting ~~"에서 child process만 출력 되므로, 4개의 child process가 있다는 것을 확인할 수 있습니다.


    exit를 실행한 코드에서는 child process를 바로바로 종료시키므로, 하나의 process에 child process가 n개가 됩니다.

    child process를 exit시켜도 pid[]에는 반환값이 저장되어 있어서, pid[]은 두가지 코드에서 차이가 없습니다.

    사실 죽어버리는 child process는 pid[0]에 0만 저장하고 죽어버리기 때문에,

    위 사진에서 0 ─ 68                                 .

                                                     └ 0 은 잘못된것이긴 합니다.

    pid가 66인 process는 pid[]의 index가 1이상이 될 수 없으니까, {0, 68}과 같은 배열을 가질 수 없습니다.

    ([1]을 쓰는걸 까먹고 사진 찍었네요..)


    exit를 실행한 코드의 결과에서 "waiting 0"이 출력되지 않는 이유는, child process가 모두 종료된 이후에 parent process가 종료되기 때문입니다.

    (즉 exit를 안하면 parent process가 child process보다 먼저 종료될 수 있어서, "waiting 0"이 출력될 수 있습니다.)



    process가 fork로 인해 나뉘어도 각각의 process는 병렬적으로 실행되기 때문에, 절차지향적인 사고를 가지고 있으면 많이 힘든 주제인것 같습니다.


    'programing > OS' 카테고리의 다른 글

    [OS] 공룡책 강의노트  (0) 2018.10.16
    [Linux] process  (0) 2018.07.10
    [Linux] File System Implementation  (0) 2018.06.23
    [Linux] Disk Allocation Method  (0) 2018.06.16
    [Linux] Disk Scheduling  (0) 2018.06.16

    댓글

Designed by black7375.