1. fork() system call
parent process의 복사본, child process를 만들어준다.
하지만 child process는 독립된 자신의 address space, register value, PC value를 갖는다.
fork() 후에 OS가 parent process를 먼저 시작할지 child process를 먼저 시작할지는 알 수 없다.
2. wait() system call
부모 프로세스가 자식 프로세스의 종료를 대기해야 하는 경우에 사용한다.
아래 예시에서는 parent process가 먼저 실행되어도 wait()가 호출되고 이 system call은 child process가 종료될 때까지 리턴하지 않는다.
3. exec() system call
fork() system call은 자신의 복사본을 생성하여 실행한다. 하지만 자기 자신이 아닌 다른 프로그램을 실행해야 할 때는 exec() system call을 사용한다.
실행 파일의 이름과 argv 인자가 주어지면 해당 실행 파일의 코드와 정적 데이터를 읽어 들여 현재 실행 중인 프로세스의 코드 세그먼트와 정적 데이터 부분을 덮어 쓴다. 힙과 스택 및 프로그램의 다른 주소 공간들도 새로운 프로그램의 실행을 위해 다시 초기화된다.
exec() system call이 성공적으로 실행되면 원래 프로세스는 다시 실행되지 않는다.
API의 활용 - 쉘 프로그램
쉘은 prompt를 표시해주는 프로그램이다.
prompt는 사용자의 명령어 입력을 기다린다.
명령이 입력되면,
1. fork()를 호출하여 새로운 child process를 생성한다.
2. exec()를 호출하여 프로그램을 실행시키고 wait()를 호출하여 명령어가 끝나기를 기다린다.
3. child process가 종료되면 쉘은 wait()로부터 리턴하고 다시 prompt를 출력한다.
API의 활용 - redirect (pipelining)
prompt > wc p3.c > newfile.txt
위 명령을 실행할 때 프로세스는 다음과 같은 순서로 수행된다.
1. 표준 출력(standart output) 파일을 닫고
2. newfile.txt 파일을 연다. ( 이때 fd가 STDOUT_FILENO로 지정됨!)
이렇게 되면 printf()에 의한 쓰기는 화면이 아니라 새로 열린 파일로 향하게 된다.
+) 기타 API
프로세스에게 signal을 보내는 kill() system call
어떤 프로세스가 실행 중인지 알아보는데 사용하는 ps 명렁어
시스템에 존재하는 프로세스와 각 프로세스가 사용하는 CPU 및 다른 자원을 알아보기 위한 top 명렁어
'Operating Systems: Three Easy Pieces' 카테고리의 다른 글
07 CPU Scheduling (1) (1) | 2018.10.16 |
---|---|
06 Direct Execution (0) | 2018.10.15 |
[Operating Systems: Three Easy Pieces] 책소개 (0) | 2018.10.15 |
04 Processes (0) | 2018.10.03 |
02 Introduction (0) | 2018.09.29 |