프로세스의 구조

DanChu 🌟·2022년 8월 12일
0

프로세스의 메모리 영역

Text

프로그램 코드와 상수가 정의되어있고, 읽기만 가능한 메모리 영역. 데이터를 저장하려고하면 분할 충돌을 일으켜 프로세스가 중지된다.

Data

전역 변수(global variable)와 정적 변수(static variable)가 저장되어 있는 영역.

Heap

프로그래머의 필요에 따라 동적 메모리 호출에 의해 할당되는 메모리 영역. C언어를 예시로 들면 malloc() 이나 calloc()함수에 의해 생성된 변수들이 이곳에 저장.

Stack

함수 인자 값, 함수 내의 지역 변수, 함수의 반환 주소 등이 저장되는 영역. 함수 호출의 전반적인 처리와 리턴값을 가짐. 상위 메모리 주소에서 하위 메모리 주소로 데이터가 저장.

Text, Data는 프로그램의 코드나 전역 변수의 실행 전에 이미 크기가 정해져 있다. 따라서 컴파일 시에 위치와 크기가 결졍되는 정적 할당영역이다. 반면, 힙이나 스택은 프로그램이 실행되는 동안 크기가 결정되는 동적 할당 영역이다. 입력 값에 의한 함수의 호출 횟수나 동적으로 생성되는 변수들의 크기는 런타임 시에 결졍되기 때문.


프로세스의 생성과 복사 + fork(), exec() 시스템 호출

fork()와 exec() 함수 모두 한 프로세스가 다른 프로세스를 실행시키기 위해 사용된다.

fork()

fork() 시스템 호출은 새로운 프로세스를 위한 메모리를 할당하는 함수로, fork()를 호출한 프로세스를 새로운 공간으로 전부복사하여 원래 프로세스는 원래 프로세스대로 작업을 진행하고 fork()를 통해 생성된 프로세스도 그 나름대로 fork() 시스템콜이 수행된 라인의 다음 라인부터 실행된다. fork() 함수로 복사된 자식 프로세스는 "복사"되었기 때문에 원래의 부모 프로세스와 똑같은 코드를 가진다.

fork()된 프로세는 pid가 0으로 리턴, 부모는 실제 프로세스의 pid를 가지므로 프로세스의 pid를 통해 부모-자식 관계를 알 수 있다.

exec()

exec()의 경우, fork()처럼 새로운 프로세스를 위한 메모리를 할당하지 않고, exec()을 호출한 프로세스가 아닌 exec()에 의해 호출된 프로세스만 메모리에 남게된다. 즉, exec()을 통해 새로 메모리에 할당되어 생성되는 프로세스는 없고, exec()을 호출한 프로세스의 pid가 그대로 새로운 프로세스에 적용이되어 exec()을 호출한 프로세스는 덮어씌워진다.




references

0개의 댓글