프로세스 기본 구조
* 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 정보를 통해 기본적인 자식 프로세스 관련 정보를 확인할 수 있다
출처 : 제로베이스
'공부 Note > 시스템 프로그래밍' 카테고리의 다른 글
Chapter 05 프로세스간 커뮤니케이션 (0) | 2022.02.07 |
---|---|
Chapter 04 시스템 프로그래밍 (4) (0) | 2022.02.07 |
Chapter 04 시스템 프로그래밍 (2) (0) | 2022.02.07 |
Chapter 04 시스템 프로그래밍 (1) (0) | 2022.02.07 |
Chapter 03 쉘로 시작하는 시스템 프로그래밍 (5) (0) | 2022.02.07 |