프로세스 생성(fork)
프로세스 기본구조
: 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 영역을 새로운 프로세스의 이미지로 덮어씌움
→ 별도의 프로세스 공간을 만들지 않음
∴ fork는 별도 공간을 만들기 때문에 부모프로세스의 상태 값 등을 다 볼 수 있고
exec는 부모 프로세스 공간은 사실상 사라진다.
fork 시스템콜 정리
1. pid = fork()가 실행되면 부모 프로세스와 동일한 자식 프로세스가 별도 메모리 공간에 생성
2. 자식 프로세스는 pid가 0으로 리턴, 부모 프로세스는 실제 pid 리턴
3. 두 프로세스의 변수 및 PC(Program Count) 값은 동일 → pid값이 다르기 때문에 코드를 pid 에 맞춰 조건문을 사용하면 부모프로세스와 자식프로세스는 다르게 동작할 수 있다.
4. 새로운 프로세스 공간을 별도로 만들고, fork() 시스템 콜을 호출한 프로세스(부모 프로세스) 공간을 모두 복사한 후,
fork()시스템 콜 이후 코드부터 실행
제로베이스 컴퓨터 공학 전공자 따라잡기 강의 정리한 내용입니다.