개발 공부

손승열(Son Seungyeol)

[운영체제][OSTEP] 프로세스 API

프로세스 API에 대해 공부해봅니다.

손승열(Son Seungyeol)
[운영체제][OSTEP] 프로세스 API

1️⃣ fork( ) 시스템 콜

프로세스 생성에 사용되는 시스템 콜

fork()를 통해 생성된 프로세스는 호출한 프로세스의 복사본

p1이라는 프로세스가 fork()를 수행하면 운영체제상에는 2개의 p1 프로그램이 존재

새로 생성된 프로세스는 일반적으로 자식 프로세스, 생성한 프로세스부모 프로세스라 불림

자식 프로세스는 부모 프로세스와 완전히 동일하지는 않음
➡️ 자식 프로세스는 자신의 주소 공간, 자신의 레지스터, 자신의 PC 값을 가짐

fork() 시스템 콜의 반환 값이 서로 다름

  • 부모 프로세스생성된 자식 프로세스의 PID(프로세스 식별자(process identifier))를 반환받음

  • 자식 프로세스0을 반환받음

fork()가 수행되면 프로세스가 생성되는 시점에 부모와 자식 프로세스 중 하나가 실행

  • CPU 스케줄러(scheduler)가 실행할 프로세스를 선택


2️⃣ wait( ) 시스템 콜

부모 프로세스가 자식 프로세스의 종료를 대기해야 하는 경우 사용되는 시스템 콜

자식 프로세스가 종료되면 wait()는 리턴

앞서 fork()가 수행되면 프로세스가 생성되는 시점에 부모와 자식 프로세스 중 하나가 실행된다고 언급했음

  • 이때 wait()을 사용하게 되면,

  • 자식 프로세스가 먼저 실행되는 경우 자연스럽게 자식 프로세스 ➡️ 부모 프로세스 순으로 실행

  • 부모 프로세스가 먼지 실행되는 경우 wait()에 의해 자식 프로세스 ➡️ 부모 프로세스 순으로 실행

  • wait()가 그러나 자식 프로세스가 종료하기 전에 리턴하는 몇 가지 경우가 있음(man 페이지 참조)


3️⃣ exec( ) 시스템 콜

자기 자신이 아닌 다른 프로그램을 실행해야 할 때 사용하는 시스템 콜

6가지 변형이 존재 : execl(), execle(), execlp(), execv(), execvp(), execve()

exec()의 수행 과정

  1. 실행 파일의 이름과 약간의 인자가 주어짐

  2. 해당 실행 파일의 코드와 정적 데이터를 읽어 들여 현재 실행 중인 프로세스의 코드 세그멘트와 정적 데이터 부분을 덮어 씀

  3. 힙과 스택 및 프로그램 다른 주소 공간들로 새로운 프로그램의 실행을 위해 다시 초기화

  4. 운영체제는 프로세스의 argv와 같은 인자를 전달하여 프로그램을 실행

    1. 새로운 프로세스를 생성하지는 않음

    2. 현재 실행 중인 프로그램을 다른 실행 중인 프로그램으로 대체

  5. exec() 시스템 콜이 성공하게 되면 기존 프로그램은 절대로 리턴하지 않음


4️⃣ API가 위와 같이 설계된 이유

Unix의 쉘을 구현하기 위해서는 fork()exec()을 분리해야 함

  • 쉘이 fork()를 호출하고 exec()를 호출하기 전에 코드 실행 가능

  • 이때 실행하는 코드에서 프로그램의 환경을 설정하고, 다양한 기능을 준비

쉘의 동작 순서

  1. 쉘은 프롬프트를 표시하고 사용자의 입력을 기다림

  2. 사용자가 명령을 입력

  3. 쉘은 파일 시스템에서 실행 파일의 위치를 찾고 명령어를 실행하기 위해 fork()를 호출하여 새로운 자식 프로세스를 생성

  4. exec()의 변형 중 하나를 호출하여 프로그램을 실행시킨 후 wait()를 호출하여 명령어가 끝나기를 기다림

  5. 자식 프로세스가 종료되면 쉘은 wait()로부터 리턴하고 다시 프롬프트 출력 후 다음 명령어를 기다림

fork()exec()의 분리를 통한 다양한 기능 수행

1️⃣ 리다이렉션(> 등)

자식이 생성되고 exec()이 호출되기 전에 표준 출력(standard output) 파일을 닫고 출력 대상 파일을 엶

2️⃣ 파이프( | )

리다이렉션과 유사한 방식으로 구현되지만 pipe() 시스템 콜을 통하여 생성한 프로세스의 출력이 다음 프로세스의 입력으로 사용


5️⃣ 프로세스 제어와 사용자

Unix 시스템에는 이외에도 많은 프로세스 관련 인터페이스가 존재

kill() 시스템 콜프로세스에게 시그널(signal)을 보내는 데 사용

  • 시그널은 프로세스를 중단시키고(block), 삭제하는 등의 작업에 사용

    • control-c는 프로세스에게 SIGINT(interrupt) 시그널을 보냄

    • control-z는 프로세스에게 SIGSTOP(stop) 시그널을 보냄

signal() 시스템 콜을 통해 프로세스는 다양한 시그널을 "캐치"할 수 있음

  • 일반적으로 우리가 사용하는 시스템들은 동시에 여러 사람들이 사용할 수 있음

    • 이러한 사람들 중 임의로 SIGINT와 같은 시그널을 보내게 되면 그 시스템의 사용성과 보안이 위태로워질 수 있음

    • 결과적으로 현대적인 시스템들은 사용자(user) 개념에 대한 강력한 개념이 포함

사용자는 패스워드를 입력하여 로그인 함으로써 시스템 자원에 접근할 수 있음

사용자는 일반적으로 자신의 프로세스들만 제어할 수 있음

운영체제는 CPU, 메모리, 디스크 등의 자원을 각각의 사용자에게 나눠 전체적인 시스템 목표를 달성하도록 함


6️⃣ 유용한 도구들

유용한 명령어 도구들이 다양하게 존재

  • ps: 어떤 프로세스가 실행 중인지 알아보기 위해 사용

  • man: 각종 명령어들의 사용법과 플래그를 알아보기 위해 사용

  • top: 시스템에 존재하는 프로세스와 그 프로세스가 CPU 및 다른 자원들을 얼마나 사용하고 있는지를 보여줌

  • 다양한 CPU 측정기가 제공되어 시스템의 부하 정도를 알 수 있음(Raging Menace software사의 MenuMeter 등)


📚 참고 문헌

Operating Systems: Three Easy Pieces ― 5: Interlude: Process API

운영체제 아주 쉬운 세 가지 이야기 ― 8: 막간 : 프로세스 API

관련있는 게시물

[운영체제][OSTEP] 프로세스
개발 공부

[운영체제][OSTEP] 프로세스

프로세스가 무엇인지에 대해 공부해봅니다.

손승열(Son Seungyeol)
손승열(Son Seungyeol)
[운영체제][OSTEP] 제한적 직접 실행 원리
개발 공부

[운영체제][OSTEP] 제한적 직접 실행 원리

제어를 유지하면서 효과적으로 CPU를 가상화하는 방법에 대해 공부해봅니다.

손승열(Son Seungyeol)
손승열(Son Seungyeol)

Made with React, Gatsby and DatoCMS by @smastrom

Contribute or star on GitHub

© 2022-2023 손승열 for 🅒🅞🅝🅣🅔🅝🅣🅢

모두 좋은 하루 보내세요! 😊