Process의 생성과 실행

hgh1472·2023년 12월 23일
0

Process의 생성

fork 시스템 호출

#include <sys/types.h>
#Include <unistd.h>
pid_t fork(void);
  • 수행되던 process(parent)의 복사본 process(child) 생성
  • fork() 바로 다음 문장부터 동시에 실행

두 프로세스의 차이점

  • pid와 ppid가 다르다.
  • fork()의 return 값이 다르다.
    • parent process : child process의 pid
    • child process : 0
  • fork 실패 시 -1 return
    • 시스템 전체 process의 수 제한
    • 한 process가 생성할 수 있는 process 수 제한

fork : 파일과 자료

child process는 parent process의 복제.

  1. 모든 변수 값이 그대로 복제된다.
  2. fork()후에 변경된 값은 복제되지 않는다.
  3. file descriptor도 복제된다. (parent process가 open한 file은 child process에게도 open)
  4. parent와 child가 file을 공통으로 사용 가능

exit 시스템 호출

사용법

#include <stdlib.h>
void exit(int status);
  • exit : process 정지 -> open된 file 닫기 -> clean-up-action

exec을 이용하여 새 프로그램을 수행

사용법

#include <unistd.h>
int execl(const char *path, const char *arg0, ... ,const char *argn, (char *)0);
int execlp(const char *file, const char *arg0, ... , const char *argn, (Char *)0);
int execv(const car *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

공통점

  • 호출 프로세스의 주기억장치 공간에 새로운 프로그램을 적재
    • 호출 프로세스는 no longer exists
    • 새 process는 처음부터 실행
    • 새 process는 호출 프로세스의 id로 실행
  • 실패 시 -1 return. 성공 시 return이 없다.
  • fork와의 차이점 : 기존 프로세스와 병렬 수행이 아니다.

차이점

  • path : 파일의 경로 이름 포함 vs file : 파일 이름
  • 인수
    • arg0 : 프로그램 이름(경로 제외) and arg1 ... argn : 프로그램에 입력으로 사용될 인수들. 마지막엔 null pointer
    • argv[] : 배열로 받기
  • file 이름을 쓰는 경우는? = 환경 변수에 의해 설정된 path안의 file

프로세스의 동기화

wait 시스템 호출

#include <sys/wait.h>
#include <sys/types.h>
pid_t wait(int *status);
  • 하나 이상의 child process 수행 시 아무나 하나가 종료되면 return
  • child process가 종료될 때 까지 기다린다. parent process는 blocked 상태
  • return 값 : 종료된 child의 id or -1(살아있는 child process가 없는 경우)
  • status : child의 종료 상태가 전달

parent가 child의 종료상태를 확인했을 때 process table에서 삭제한다. parent에서 wait를 하지 않으면, child를 종료하지 못한채 프로세스 테이블을 채우고 있다.

프로세스 종료 검사

child가 parent에게 전달하는 값이 status의 상위 8bit에 저장된다.

  • WIFEXITED(status) : status의 하위 8bit가 0인지 검사 = 정상종료인지 검사
  • WEXiTSTATUS(status) : status의 상위 비트에 저장된 값을 return

waitpid 시스템 호출

#include <sys/types.h>
#include <sys/wiat.h>
pid_t waitpid(pid_t pid, int *status, int options);
  • pid 기다리고 싶은 chlid의 id
  • status : child의 종료 상태
  • options : WNOHANG - child가 종료하지 않았으면 0을 return

Zombie와 너무 이른 퇴장

  • 부모 프로세스가 wait를 수행하지 않고 있는 상태에서 자식이 퇴장할 때 = child는 zombie가 된다.
  • 하나 이상의 자식 프로세스가 수행되고 있는 상태에서 부모가 퇴장할 때 = child는 init의 child로 남는다.

0개의 댓글