Search
Duplicate
🍎

[운영체제] 프로세스 관련 API

간단소개
프로세스와 관련된 시스템 콜에 대해 간단히 알아보자
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
운영체제
태그
pipex
minishell
Scrap
8 more properties

프로세스 관련 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
참고 자료