CS/OS

[OS]프로세스 연산 (Operations on Processes ), 시스템 콜(System Call)

장그래 2021. 4. 30. 13:39
반응형

System Call

fork( ), exec( ), wait( )와 같은 것들은 Process 생성과 제어를 위한 System call임.

  • fork, exec는 새로운 Process 생성과 관련이 되어 있음
  • wait는 Process (Parent)가 만든 다른 Process(child)가 끝날 때까지 기다리는 명령어임.

프로세스 생성(Process Creation)

  • 프로세스는 여러 개의 새로운 프로세스들을 생성할 수 있다. 생성한 프로세스를 부모 프로세스(parent process), 새로운 프로세스는 자식 프로세스라고 부른다.
  • 또한 생긴 새로운 프로세스도 다시 프로세스를 생성할 수 있으며, 이러한 과정을 반복하면 프로세스 트리가 생성된다.

  • 각 노드들은 프로세스 식별자(pid)를 사용하여 구분되며, 이 식별자는 보통 정수이다.
  • 트리의 root node인 init은 유일하게 부모 프로세스가 없는 노드이다. (커널이 부팅하는 과정에서 커널이 직접 init 만든 것임)
  • 운영체제마다 다르지만 부모 프로세스의 자원을 자식 프로세스에게 물려주는 경우가 많다. (자식 프로세스는 부모 프로세스의 자원을 가진 상태로 생겨남)
  • 부모 프로세스의 주소 공간을 복제하여 자식 프로세스에게 사용하게 된다.
  • fork()
    • UNIX 운영체제의 system call
    • 프로세스 생성에 사용되는 시스템 콜
    • 부모 프로세스가 fork()를 호출하면 자식 프로세스가 생성됨
  • exec()
    • 부모 프로세스에 의해 fork()되어서 생성된 자식 프로세스는 생성된 직후에 exec() 시스템 콜을 호출함
    • exec()을 호출한 프로세스 주소 공간을 시스템 콜에서 지정한 실행파일로 교체함 (즉, exec()을 실행하면 부모 프로세스와 다른 자신의 프로그램을 실행하게 됨)
    • 위 사진은 아래 코드를 보면 더욱 이해가 쉽다.
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main(){
pid t pid;

    /* 새 프로세스를 생성한다(fork) */
    pid = fork(); // fork()가 성공적으로 return 되는 경우 부모 프로세스, 자식 프로세스 모두에게 리턴 

    // 부모 프로세스에게는 fork()리턴 값이 자식 프로세스의 pid가 리턴 됨 (양수 값)
    // 자식 프로세스에게는 fork()의 리턴 값이 0
    if (pid<0){
        fprintf(stderr, "Fork Failed");
           return 1;
    }
    else if(pid == 0){ /*"자식 프로세스"*/
        execlp("/bin/ls", "ls", NULL); //자식 프로세스가 ls라는 프로그램을 실행함
        //exec는 프로세스 자체는 유지하되, 프로세스가 실행하고 있는 프로그램을 다른 프로그램으로 대체하는 시스템 콜
        //즉, 프로그램이 바뀜
    }
    else{ /*"부모 프로세스"*/
        /* 부모가 자식이 완료되기를 기다림 */
        wait(NULL);
        printf("Child Complete");
    }
    return 0;
}

프로세스 종료(Process Termination)

  • exit() 시스템 콜이 종료 기능을 수행함
  • exit()을 수행한 프로세스는 모든 자원을 반환함. 종료하고자 하는 프로세스가 자기 자신이 호출함
  • abort() 비정상적으로 프로세스를 종료 시킴. 자식 프로세스를 강제 종료시키기 위해 부모 프로세스가 호출하는 시스템 콜
    • 언제 abort()를 사용하냐?
    • 자식 프로세스가 자원 사용량이 지나치게 많을 때 abort()를 호출
    • 자식 프로세스가 수행하는 작업이 더 이상 필요 없을 때
    • 부모 프로세스가 exit()를 했는데, 자식 프로세스만 남아있는 것을 원치 않을 때
  • 부모 프로세스는 wait() 시스템 콜을 통해서 자식 프로세스의 종료를 기다릴 수 있다. / 리턴 값은 종료한 자식 프로세스의 pid
  • 좀비 프로세스 (Zombie process)
    • 자식 프로세스가 exit()은 하였는데, wait()를 호출하고 있는 부모 프로세스가 없는 경우
  • 고아 프로세스 (orphan process)
    • 부모 프로세스가 먼저 종료한 경우

 

출처 - 공룡 책 (Operating System Concepts)

반응형