프로세스 관련 API
“운영체제 : 아주 쉬운 세가지 이야기”를 읽으면서 핵심 내용을 정리하였습니다.
이화여대 반효경 교수님의 운영체제 강의를 듣고 복습 차원에서 책 한권을 완독해보고자 합니다.
1. fork()
•
자식 프로세스를 만드는 시스템콜
•
자식 프로세스는 부모의 주소 공간을 복사하여 가지게 되지만 부모 프로세스와는 별도의 새로운 프로세스이다.
•
자식 프로세스가 상속 받는 것
◦
file descriptor
◦
시그널 처리 설정
◦
환경 변수
2. exec()
•
부모 프로세스에서 fork() 시스템콜을 사용하여 자식 프로세스를 만든 뒤 exec() 시스템콜을 사용하면 다른 프로그램을 실행 시킬 수 있다.
•
exec() 에 원하는 프로그램에 맞는 인자를 넣어 주면 해당 프로그램의 코드와 정적 데이터를 읽어 들여 현재 실행 중인 자식 프로세스의 코드 세그먼트, 정적 데이터 부분을 덮어쓴다. 추가로 힙과 스택 및 프로그램의 다른 메모리 영역 들은 초기화 된다.
3. wait()
•
프로세스 동기화를 위한 시스템콜
•
wait() 함수가 호출 되면 자식 프로세스가 종료 될때 까지 부모 프로세스는 자신의 실행을 중지 시킨다. 자식프로세스가 종료되면 wait() 함수가 리턴하고 부모프로세스가 다시 실행된다.
•
자식 프로세스가 종료되었다는 사실을 부모프로세스가 알 수 있게 해주는 함수.(좀비 프로세스가 생기는 것을 막아줌)
좀비 프로세스
- 프로세스가 종료되었지만 커널의 프로세스 관리 자료 구조인 프로세스 테이블에만 남아있는 상태
- wait() 함수가 종료된 프로세스를 프로세스 테이블에서 제거해 줌.
4. 왜 fork() 후 exec() 하는 구조를 가지게 되었을까?
•
UNIX에서 쉘을 구현하기 위해서는 fork() 와 exec()를 분리할 수 밖에 없었는데, exec()를 실행 하기전 실행하고자 하는 프로그램의 환경 설정을 해주어야 하기 때문이다.
◦
가장 쉬운 예로는 리다이렉션, 파이프와 같은 프로세스 입출력 변경이 있다.
◦
새로운 프로그램을 실행 시키기전에 입출력 변경을 먼저 해주어야함.
echo hello | grep "h" > out
// echo 프로세스는 "hello"를 파이프에 출력해야함
// grep 프로세스는 파이프로 부터 입력을 받고 out이라는 파일에 출력해야함
Bash
복사
참고 자료