본문 바로가기
기초 CS 정리

System Call 시스템 콜

by 쿠리의일상 2023. 1. 29.

 

fork(), exec(), wait() 와 같은 것들은 Process 생성과 제어를 위한 시스템 콜이다.

 

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

 

fork()

  • 새로운 Process를 생성할 때 사용
int main(int argc, char *argv[]) {
    printf("pid : %d", (int) getpid()); // pid : 29146
    int rc = fork();					// 주목
    if (rc < 0) {
        exit(1);
    }									// (1) fork 실패
    else if (rc == 0) {					// (2) child 인 경우 (fork 값이 0)
        printf("child (pid : %d)", (int) getpid());
    }
    else {								// (3) parent case
        printf("parent of %d (pid : %d)", rc, (int)getpid());
    }
}

 

  • PID : 프로세스 식별자 (유닉스 시스템에서는 PID는 프로세스에 명령할 때 사용된다)
  • 다만 parent의 fork 값은 child의 pid값, child의 fork값은 0이라 차이점이 존재한다.
  • fork()가 실행되는 순간 프로세스가 하나더 추가되는데 이 때 생긴 프로세스, Child는 fork를 만든 프로세스인 Parent와 거의 동일한 복사본을 갖게 된다. 이 때 OS는 위와 똑같은 2개의 프로그램이 동작한다고 생각하고 fork가 return될 차례라고 생각한다. 그래서 새로 생성된 Process Child는 main에서 시작하지 않고 if문부터 시작하게 된다.

exec()

  • 단순 fork는 동일한 프로세스의 내용을 여러 번 동작할 때 사용하는데 exec는 child와 parent가 다른 동작을 하게 하고 싶을 때 사용
  • exec()가 실행되면 execvp(실행 파일, 전달 인자) 함수는 code segment 영역에 실행 파일 코드를 읽어와서 덮어 씌운다. 기 이후 heap, stack, 다른 메모리 영역이 초기화 되고 OS는 실행한다.
  • 즉 새로운 Process를 생성하지 않고 현재 프로그램에 wc라는 파일을 실행한다. 그로 인해 execvp() 이후의 부분은 실행되지 않는다.

wait()

  • child 프로세스가 종료될 때까지 기다리는 작업
  • parent쪽에 wait(NULL)을 넣어주면 child의 실행이 끝날 때까지 기다려준다.

'기초 CS 정리' 카테고리의 다른 글

IPC(Inter Process Communication)  (0) 2023.01.30
Process Control Block(PCB)와 Context Switching  (0) 2023.01.29
프로세스와 스레드, 인터럽트(Interrupt)  (0) 2023.01.28
운영체제  (0) 2023.01.27
폰 노이만 구조  (0) 2023.01.27