요약
- OS는 프로세스에 복제, 대기, 실행이라는 명령이 가능하다.
- 실행만 존재하지 않고 복제와 실행이 나눠진 이유는 생성시점과 복제 시점을 분리해 자식 프로세스와 부모 프로세스 사이에 상호작용을 쉽게 컨트롤 하기 위함
본문
-
fork
- 프로세스가 fork() 시스템 콜을 호출하면 분리된 주소 공간, 레지스터, PC값을 같는 프로세스가 복제됨
-
wait
- wait 시스템 콜을 이용해 자식 프로세스 종료 시점까지 자신의 실행을 중단시킬 수 있음
-
exec
- 자기 자신이 아닌 다른 프로그램을 실행해야할 때 사용함
-
왜 새로운 프로세스를 생성하기 위해 이런 이상한 인터페이스를 만들까?
- fork와 exec가 분리되는게 이상함
- 쉘에서 많은 유용한 일을 쉽게 할 수 있음
-
ex1
wc p3.c > newfile.txt
- 이 파일은 p3.c의 출력 결과물을 newfile.txt로 보내는 명령어임
- 이런 프로그램을 작성할때 해당 설계는 강점을 보이는데 실행과 복제를 분리함으로써 새프로그램 실행 전 동작을 제어할 수있음, 세밀한 제어가 가능하다는 뜻
- 이게 가능하려면 p3.c 실행 이전에 표준 출력을 파일로 바꿔야함 만약 실행만 존재한다면, 실행 이전 동작을 제어가기가 어려웠을 것임
- ex2
grep foo | sort
- grep 출력을 sort의 입력으로 연결 가능해야하는데
- 부모가 먼저 파이프를 만듦
- 파이프는 읽기, 쓰기용 파일 디스크립터 두개로 이루어진 커널 버퍼
- fork() 두번 호출
- 첫번째 자식 stdout을 파이프의 쓰기에 연결, exec(grep, 'foo') 실행
- 두번째 자식 stdin을 파이프의 읽기쪽에 연결 exec('sort') 실행
- 파이프 fd 닫기
- 추천 책
- A Multiprocessor System Design
- Programming Semantics for Multiprogrammed Computations
- Hints for Computer System Desgin
- Advanced Programming in the Unix Environment
참고
Process는 프로그램의 인스턴스(실행중)이다. https://pages.cs.wisc.edu/~remzi/OSTEP/Korean/05-cpu-api.pd