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 |