Operating System : 운영체제

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

(1) fork() in UNIX

@ 앞에서 본 것을 좀 더 구체적으로 코드로 확인하겠습니다.

    Shell example

    // pid -> Child Process ID

        > Child Process ID는 0이 될 수 없습니다.

        > 기존 Parent Process가 0

    // pid 가 0인 부분은 Child Process가 수행되는 곳입니다.

        > Parent Process가 fork를 하게 되면 수행이 중단되고, Context가 복사됩니다.

            .. 그 후 Child Process에 PCB가 생성되고, PCB가 ready queue에 들어갑니다.

            .. 이 때 중요한 점은 System call이 호출되면 Interrupt가 발생하고,

            .. return address가 Stack으로 들어가게 됩니다.

            .. 그 return address가 바로 fork 다음으로 기억됩니다.

        > 그래서 Child Process가 수행될 때는 fork 다음 부터 수행됩니다.

        > return value가 0이 됩니다. (parent의 경우는 child의 pid, child의 경우는 0을 넣습니다)

        > 그렇게 child를 exec()을 하게 됩니다.

        > 끝나면 다시 Parent로 넘어가게 됩니다.

    // pid가 0보다 큰 경우는

        > 그렇기에 Parent라는 의미가 됩니다.

        > wait()이 수행됩니다.

        

? Question 기억해야 할 중요한 점은 pid value가 fork()함수를 통해 Child로 갈 때는

    // 0이 넘어간다는 것입니다.

        > 이것을 사용하는 것은 Technical한 요소입니다.

            .. 그리고 이를 이해하기 위해서는 코드를 이해할 수 있어야 합니다.

 

@ OS가 Process 0를 만들고

    // Child는 여러개를 만들 수 있게 됩니다.

    // 이 때 상충되는 개념이 Wait이 될 수 있는데

        > 더 많은 일을 하고 Wait을 할 수 있게됩니다.

            .. Parent가 Child의 종료상태에 관심이 있는 경우에만 Wait을 하게 됩니다.

            .. 실제로 Wait이 필요없는 경우가 있습니다.

 

@ 이는 조금 비효율적입니다.

    // Windows에서는 모두 Create하지만 왜 UNIX는 이렇게 Fork and exec을 하는 것일까요?

         > Process간에 파일을 주고 받을 때, 쉽게 그 주소를 알 수 있는 방법은

            .. fork()였습니다.

            .. 이 방법을 사용하면 Parent와 Child가 모두 그 원본이 같아 

            .. 원파일에 서로 영향을 미치는 것이 가능했습니다.

 

@ Process Termination

    // exit()

    // 자신이 잘못했을 때, Parent가 kill하는 것입니다

        > abort (실패하다)

 

        

댓글

댓글 본문
버전 관리
박천명
현재 버전
선택 버전
graphittie 자세히 보기