Computer Science/유닉스프로그래밍

[유닉스 시스템 프로그래밍] Ch06. 프로세스 생성과 실행

계속지나가기 2020. 10. 19. 22:51
반응형

(본 강의 노트는 한빛 아카데미의 <유닉스 시스템 프로그래밍> 책을 기반으로 하고 있습니다)

Ch06. 프로세스 생성과 실행

학습목표

  • 프로세스를 생성하는 방법을 이해한다.
  • 프로세스를 종료하는 방법을 이해한다.
  • exec함수군으로 새로운 프로그램을 실행하는 방법을 이해한다.
  • 프로세스를 동기화하는 방법을 이해한다.

목차

  1. 프로세스 생성
  2. 프로세스 종료함수
  3. exec 함수군 활용
  4. exec 함수군과 fork 함수
  5. 프로세스 동기화

01. 프로세스 생성

  • 프로그램 실행 : system( )

    • 새로운 프로그램을 실행하는 가장 간단한 방법이나 비효율적이므로 남용하지 말 것
    • 실행할 프로그램명을 인자로 지정
  • 프로세스 생성 : fork( )

    • 새로운 프로세스를 생성 : 자식 프로세스(Cv hild Process)
    • fork 함수를 호출한 프로세스 : 부모 프로세스(Parent Process)
    • 자식 프로세스는 부모 프로세스의 메모리를 복사
    • 부모 프로세스와 다른점은?
      1. 자식 프로세스는 유일한 PID, PPID를 가짐
      2. 부모 프로세스가 설정한 프로세스 잠금, 파일 잠금, 기타 메모리 잠금은 상속 안함
      3. 자식 프로세스의 tms 구조체 값은 0으로 설정
    • 부모 프로세스와 자식 프로세스는 열린 파일을 공유하므로 읽거나 쓸 때 주의
    • fork 함수를 이용한 새로운 프로세스 생성 과정

02. 프로세스 종료 함수

  • 프로세스 종료 : exit( )

    • status : 종료 상태값
    • 프로세스를 종료하고 부모 프로세스에게 종료 상태값 전달

    ![image-20201014140021225](/Users/mac/Library/Application Support/typora-user-images/image-20201014140021225.png)

  • 프로세스 종료시 수행할 작업 예약 : atexit( )

    • func : 종료시 수행할 작업을 지정한 함수명
  • 프로그램 종료 : _exit()

    • 일반적으로 프로그램에서 직접 사용하지 않고 exit함수 내부적으로 호출

03. exec 함수군 활용

  • exec 함수군
    • exec로 시작하는 함수들로, 명령이나 실행 파일을 실행할 수 있다.
    • exec 함수가 실행되면 프로세스의 메모리 이미지는 실행파일로 바뀐다
  • exec 함수군의 6가지 형태
    • path : 명령의 경로 지정
    • file : 실행 파일명 지정
    • arg#, argv : main함수에 전달할 환경변수 지정
    • envp : main함수에 전달할 환경변수 지정
    • 함수의 형태에 따라 NULL값 지정에 주의해야 함
#include <unistd.h>
int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ..., const char *argn,(char *)0, char *const envp[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ..., const char *argn, (char *)0);
int execvp(const char *file, char *const argv[]);

04. exec 함수군과 fork 함수

  • fork로 생성한 자식 프로세스에서 exec 함수군을 호출
    • 자식 프로세스의 메모리 이미지가 부모 프로세스 이미지에서 exec 함수로 호출한 새로운 명령으로 대체
    • 자식 프로세스는 부모 프로세스와 다른 프로그램 실행 가능
    • 부모 프로세스와 자식 프로세스가 각기 다른 작업을 수행해야 할 때 fork와 exec 함수를 함께 사용

05. 프로세스 동기화

프로세스 동기화

  • 부모 프로세스와 자식 프로세스의 종료 절차
    • 부모 프로세스와 자식 프로세스는 순서와 상관없이 실행하고 먼저 실행을 마친 프로세스가 종료됨
    • 부모 프로세스와 자식 프로세스 사이에 종료절차가 제대로 진행되지 않을 경우 좀비 프로세스 발생
  • Zombie Process
    • 실행 종료, 자원 반납한 자식 프로세스의 종료 상태를 부모 프로세스가 가져가지 않으면 발생
    • 프로세스 테이블에만 존재
    • 일반적인 제거 방법 없음
    • 이를 방지하기 위해 부모 프로세스와 자식 프로세스를 동기화해야 함
  • Orphan Process
    • 자식 프로세스보다 부모 프로세스가 먼저 종료할 경우 자식 프로세스들은 고아 프로세스가 됨
    • 고아 프로세스는 1번 프로세스(init)의 자식 프로세스로 등록

프로세스 동기화 함수

  • 프로세스 동기화 : wait
    • stat_loc : 상태정보를 저장할 주소
    • wait 함수는 자식 프로세스가 종료할 때까지 부모 프로세스를 기다리게 함
    • 부모 프로세스가 wait 함수를 호출하기 전에 자식 프로세스가 종료하면 wait 함수는 즉시 리턴
    • wait 함수의 리턴값은 자식 프로세스의 PID
    • 리턴값이 -1이면 살아있는 자식 프로세스가 하나도 없다는 의미
  • 특정 자식 프로세스와 동기화 : waitpid( )
    • pid에 지정할 수 있는 값
      1. if pid < -1 : pid의 절댓값과 같은 그룹ID에 속한 자식 프로세스 중 임의의 프로세스의 상태값 요청
      2. if pid == - 1: wait 함수처럼 임의의 자식 프로세스의 상태값을 요청
      3. if pid == 0 : 함수를 호출한 프로세스와 같은 프로세스 그룹에 속한 임의의 프로세스의 상태
      4. if pid > 0 : 지정한 PID의 상태값 요청
    • Options : waitpid 함수의 리턴 조건'
반응형