3장. 프로세스 관리

· ☕ 2 min read · 👀... views
  • 가상 기억장치가 없는 단순한 경우만 나타낸다. 실제 프로세스의 생성 및 삭제는 5장에서 자세히 다룸

프로세스 생성의 목적

  1. 같은 프로그램의 처리를 여러 개의 프로세스가 나눠서 처리, 예를 들어 웹 서버처럼 리퀘스트가 여러 개 들어왔을 때 동시에 처리해야 하는경우
  2. 전혀 다른 프로그램을 생성합니다. 예를 들어 bash 로부터 각종 프로그램을 새로 생성하는 경우
    fork(), execve() 함수를 사용 (시스템 내부에서는 clone() 과 execve() 시스템 콜을 호출)

fork() 함수

목적 1의 경우에는 fork() 함수만을 사용.
fork() 함수를 실행하면 실행한 프로세스와 함께 새로운 프로세스가 1개 생성, 이를 각각 부모, 자식 프로세스라 부름

  1. 자식 프로세스용 메모리 영역을 작성하고 거기에 부모 프로세스의 메모리를 복사
  2. fork() 함수의 리턴 값이 각기 다른 것을 이용하여 (부모는 자식 프로세스의 ID, 자식은 0을 리턴) 부모 프로세스와 자식 프로세스가 서로 다른 코드를 실행하도록 분기

execve() 함수

서로 다른 프로그램을 생성할 때에 사용

  1. 실행 파일을 읽은 다음 프로세스의 메모리 맵에 필요한 정보를 읽어 들임
  2. 현재 프로세스의 메모리를 새로운 프로세스의 데이터로 덮어씀
  3. 새로운 프로세스의 첫 번째 명령부터 실행

–> 전혀 다른 프로그램을 생성하는 경우 프로세스의 수가 증가하는 것이 아니라 기존의 프로세스를 별도의 프로세스로 변경하는 방식으로 수행.

실행 파일은 프로세스의 실행 중에 사용하는 코드와 데이터 이외에도 다음과 같은 정보가 필요.

  • 코드를 포함한 데이터 영역으 파일상 오프셋 사이즈, 메모리 맵 시작 주소
  • 코드 외의 변수 등에서 데이터 영역에 대한 같은 정보 (오프셋, 사이즈, 메모리 맵 시작 주소)
  • 최초로 실행할 명령의 메모리 주소 (엔트리 포인트 : entry point)

엔트리 포인트에서부터 프로그램을 실행.
리눅스의 실행 파일은 ELF(Executable Linkable Format) 형식 사용.

전혀 다른 프로세스를 생성할 때는 부모가 될 프로세스로부터 fork() 함수를 호출한 다음 돌아온 자식 프로세스가 exec() 함수를 호출하는 방식, 즉 ‘fork and exec’ 라는 방식을 주로 사용

종료 처리

프로그램 종료는 _exit() 함수 사용 (내부에서는 exit_group() 시스템 콜 호출
직접 _exit()를 호출하는 경우는 매우 드물며, 보통은 표준 C 라이브러리의 exit() 함수를 호출

Share on

snack
WRITTEN BY
snack
Web Programmer


What's on this Page