Just do IT
article thumbnail

프로세스 기본 구조

   * TEXT, DATA, BSS, HEAP, STACK

 

프로세스 생성

   * 기본 프로세스 생성 과정

      - TEXT, DATA, BSS, HEAP, STACK 공간을 생성

      - 프로세스 이미지를 해당 공간에 업로드하고, 실행 시작

   * 프로세스 계층 : 다른 프로세스는 다른 프로세스로부터 생성

      - 부모 프로세스, 자식 프로세스

 

fork() exec() 시스템콜

   * fork() 시스템콜

      - 새로운 프로세스 공간을 별도로 만들고, fork() 시스템콜을 호출한 프로세스 (부모 프로세스) 공간을 모두 복사

      - 별도의 프로세스 공간을 만들고 부모 프로세스 공간의 데이터를 그대로 복사한다

   * exec() 시스템콜

      - exec() 시스템콜을 호출한 현재 프로세스 공간의 TEXT, DATA, BSS 영역을 새로운 프로세스의 이미지로 덮어씌움

      - 별도의 프로세스 공간을 만들지 않음

 

fork() 시스템콜

   * pid = fork() 실행되면 부모 프로세스와 동일한 자식 프로세스가 별도 메모리 공간에 생성된다

   * 자식 프로세스는 pid 0으로 리턴, 부모 프로세스는 실제 pid 리턴

   * 프로세스의 변수 PC(Program Count) 값은 동일

   * 새로운 프로세스 공간을 별도로 만들고, fork() 시스템콜을 호출한 프로세스 (부모 프로세스) 공간을 모두 복사한 , fork() 시스콜 이후 코드부터 실행

 

exec() 시스템콜 family

   * l 계열 (execl, execlp) : 인자를 열거하는 방식이 나열형

   * v 계열 (execv, execvp) : 인자를 열거하는 방식이 배열형

   * p 붙은 계열 (execlp, execvp) : path 잡혀있으면 실행, 실행파일의 이름만 지정

   * p 안붙은 계열 (execl, execv) : 경로를 지정해 주면, 현재/절대경로를 기준으로 찾게 된다, 경로로 실행파일을 지정

exec() 시스템콜 family 정리

 

시스템 함수

   * fork() : 부모 프로세스로부터 새로운 프로세스 공간을 만들고 부모 프로세스 테이더

   * exec() : 새로운 프로세스를 위한 바이너리를 새로운 프로세스 공간에 덮어씌움

   * wait()

      - fork() 함수 호출 , 자식 프로세스가 종료할 때까지, 부모 프로세스가 기다린다

      - 자식 프로세스와 부모 프로세스의 동기화, 부모 프로세스가 자식 프로세스보다 먼저 죽는 경우를 막기 위해 사용(고아 프로세스)

 

fork(), execl(), wait() 시스템콜

   * execl() 사용하면, 부모 프로세스가 사라진다

   * 이를 유지하기 위해, fork() 새로운 프로세스 공간 복사 , execl() 사용

   * wait() 함수를 사용해서 부모 프로세스가 자식 프로세스가 끝날 때까지 기다릴 있다

 

리눅스 프로세스

   * 프로세스당 4GB 가상 메모리 할당

   * 사용자 (0GB ~ 3GB), 커널 (3GB ~ 4GB)

   * 실제로 커널에 할당한 가상 메모리는 프로세스간 공유한다

 

copy-on-write

   * fork() 새로운 프로세스 공간 생성 , 기존 프로세스 공간 복사

   * 4GB 복사한다면, 프로세스 생성 시간이 오래 걸림

   * 자식 프로세스를 생성 , 부모 프로세스 페이지를 우선 사용

   * 부모 또는 자식 프로세스가 해당 페이지를 읽기가 아닌 쓰기를 페이지를 복사하고 분리함

   * 장점

      - 프로세스 생성 시간을 줄일 있다

      - 새로 생성된 프로세스에 새롭게 할당되어야 하는 페이지 수도 최소화

 

copy-on-write (read )

   * 자식 프로세스 생성시, 부모 프로세스 페이지를 우선 사용

copy-on-write (write )

   * 부모 또는 자식 프로세스가 해당 페이지를 읽기가 아닌 쓰기 처음 요청 페이지 복사 분리

 

프로세스 종료

   * exit() : 프로세스 종료

   * exit() 함수 : 즉시 프로세스를 종료한다 (exit() 함수 다음에 이쓴 코드는 실행되지 않는다)

   * 부모 프로세스는 status & 0377 계산 값으로 자식 프로세스 종료 상태 확인 가능하다

   * exit() 시스템콜 주요 동작

      - atexit() 등록된 함수 실행

      - 열려 있는 모든 입출력 스트림 버퍼 삭제

      - 프로세스가 오픈한 파일을 모두 닫음

      - tmpfile() 함수를 통해 생성한 임시 파일 삭제

      - 참고: tmpfile() 임시 파일을 wb+ ( 있는 이진파일 형태) 모드로 오픈가능

 

atexit() 함수

   * 프로세스 종료 실행될 함수를 등록하기 위해 사용한다

   * 등록된 함수를 등록된 역순서대로 실행

 

wait() 시스템

   * fork() 함수 호출 , 자식 프로세스가 종료할 때까지, 부모 프로세스가 기다린다

   * 자식 프로세스가 종료되면, 좀비 프로세스가 되어 해당 프로세스 조사를 위한 최소 정보만 가지고 있는 상태가 된다

   * 완전히 끝나면 해당 정보도 삭제되고, 부모 프로세스에 SIGCHLD 시그널이 보내진다

   * status 정보를 통해 기본적인 자식 프로세스 관련 정보를 확인할 있다

 

출처 : 제로베이스

profile

Just do IT

@AmyG

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!