- 유닉스 프로세스 생성
fork()
,exec()
시스템 콜wait()
:
fork() 시스템 콜
생성된 프로세스가 호출한 프로세스의 복사본
- 완전 동일하지는 않음
- 각자 다른 주소공간, 레지스터, PC값
- fork() 시스템 콜의 반환 값이 서로 다름
- 자식 프로세스: 0
- 부모 프로세스: 생성된 자식의 PID
- 부모 프로세스, 자식 프로세스 실행 순서
- CPU 스케줄러가 선택
- 비결정성: 멀티쓰레드 프로그램 다양한 오류의 원인
wait() 시스템 콜
- wait 시스템 콜은 자식 프로세스가 종료될 때까지 리턴하지 않음
- 부모가 먼저 실행되더라도 자식 종료 후 wait()가 리턴함
exec() 시스템 콜
- 다른 프로세스 실행
- 실행파일의 이름과 인자
- 실행파일의 코드 + 정적 데이터를 읽어 형재 프로세스의 코드 세그멘트와 정적 데이터 부분을 덮어씀
- 실행파일의 이름과 인자
- 주소공간들로 새로운 프로그램의 실행을 위해 다시 초기화됨
- 새로운 프로세스를 생성하지는 않음
- 현재 실행중인 프로그램을 다른 실행 중인 프로그램으로 대체함
- 이전 코드는 리턴하지 않음
이런 API 존재이유: 프로세스를 생성하고 조작하는 강력한 방법
- unix 쉘을 구현하기 위해서는 fork 와 exec를 분리해야함
- 쉘이 fork를 호출하고 exec를 호출하기전에 코드를 실행하기 위함
- 실행하는 코드: 프로그램 환경설정, 다양한 기능을 준비
- 쉘이 fork를 호출하고 exec를 호출하기전에 코드를 실행하기 위함
- 한 프로세스의 출력은 자연스럽게 다음 프로세스의 입력으로 사용 가능, 명령어 체인 형성됨
핵심 질문
- 프로세스를 생성하고 제어하는 방법?
- OS가 어떤 인터페이스를 제공해야?
- 이 인터페이스는 어떻게 설계?
출처
http://ostep.org/Korean/05-cpu-api.pdf