CS/시스템 프로그래밍

프로세스 생성(fork)

:_: 2022. 3. 2. 16:10

 

프로세스 기본구조

: TEXT, DATA, BSS, HEAP, STACK

STACK 영역 : 함수를 위한 영역.

HEAP 영역 : 동적 메모리. 가장 많이 쓰이는 malloc()

BSS 영역: 변수 초기값이 들어가 있지 않은 변수들이 들어가 있고

DATA 영역 : 초기값이 들어가 있는 경우

 ex) int I = 0 : DATA 영역, int I;  BSS 영역

TEXT 영역 : 실행 코드 이미지가 들어가 있음.

 

→ BSS, DATA, TEXT는 컴파일 시 실행

 

프로세스 생성

1. 기본 프로세스 생성 과정

  1) TEXT, DATA, BSS, HEAP, STACK의 공간을 생성

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

   ( → TEXT, DATA, BSS 초기상태가 정해져 있으므로 메모리에 그대로 올린 상태에서 )

  3) 실행하면서 HEAP, STACK 처리

 

2. 프로세스 계층 : 다른 프로세스는 또다른 프로세스로부터 생성

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

 → 모든 프로세스에는 부모프로세스가 있다는 말이다. (부모프로세스를 복사해 사용한다.)

 

fork() 와 exec() 시스템콜

 → 프로세스를 실행하는 시스템콜은 리눅스 계열에서 두가지가 있다. (fork, exec)

 

fork() 시스템콜

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

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

 → 부모 프로세스 안에 fork 위치

fork 실행하면 새로운 프로세스 공간을 만든 다음에 실행되고 있던 프로세스(부모프로세스) 모든 내용 복사

자식 프로세스에 PC 가져다 놓고 fork 실행한 다음줄부터 실행

pid 다름. 공간도 다름.

 

exec() 시스템콜

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

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

프로세스 안에 exec 위치. exec를 호출하면 새로운 프로세스를 만들지 않고 프로그램 실행파일을 읽어서 현재 실행하고 있는 공간에 REXT, DATA, BSS 영역을 덮어씌운다.

 

∴ fork 별도 공간을 만들기 때문에 부모프로세스의 상태 값 등을 있고

exec 부모 프로세스 공간은 사실상 사라진다.

 


 

fork 시스템콜 정리

 

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

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

3. 두 프로세스의 변수 및 PC(Program Count) 값은 동일  pid값이 다르기 때문에 코드를 pid 맞춰 조건문을 사용하면 부모프로세스와 자식프로세스는 다르게 동작 있다.

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

fork()시스템 콜 이후 코드부터 실행

 

 

 

제로베이스 컴퓨터 공학 전공자 따라잡기 강의 정리한 내용입니다.
728x90