프로세스란 무엇일까?
📌 프로세스란 실행되고 있는 프로그램을 의미합니다!
프로그램은 실행하기 전까지는 코드 조각에 불가한데요,
이를 실행하면 프로그램 실행 중에 사용할 메모리 공간이 할당되고,
이 순간부터 프로세스라고 부를 수 있습니다.
프로세스의 메모리 구조
앞서 말한대로, 프로세스는 시작될 때 운영체제로부터 메모리를 할당받습니다.
이 때 메모리는 아래와 같은 구조를 갖고 있습니다.
Code 영역
먼저 code 영역에는 프로그램이 기계어 형태로 저장되며, text 영역이라고도 부릅니다.
code 영역의 크기는 컴파일 타임에 결정되며, 프로그램이 종료될 때까지 메모리에 계속 남아있습니다.
해당 영역은 실행되고있는 프로그램의 정보를 담고 있어 실행 중에 변경되지 않아야 하므로 Read-only 영역입니다.
Data 영역
Data 영역에는 사전에 선언된 전역 변수와 정적(static) 변수가 저장되고, code 영역과 마찬가지로 컴파일 타임에 크기가 결정됩니다.
이 때 초기화된 전역변수는 data 영역에 저장되지만, 초기화 되지 않은 전역변수는 별도로 bbs 영역에 저장됩니다.
Heap 영역
Heap 영역에는 동적으로 할당되는 데이터들이 저장됩니다.
C/C++에서 malloc 등으로 할당하는 메모리가 바로 heap 영역에 해당합니다.
해당 영역의 크기는 컴파일 타임이 아닌 런타임에 결정됩니다.
프로세스가 사용할 수 있는 메모리 용량에는 한계가 있으므로, Heap 영역을 잘 사용하는 것이 중요합니다.
C나 C++에서는 이를 free 등으로 프로그래머가 직접 해야하는 반면,
Java의 JVM 등에서는 Heap 영역에서 사용하지 않는 메모리를 적절히 비워주는 garbage collection(GC)을 제공하기도 합니다.
Stack 영역
Stack 영역에는 함수의 호출과 관계되는 지역변수와 매개변수, 함수의 return 값 주소 등이 저장됩니다.
해당 영역의 데이터는 함수의 호출과 함께 할당 되며, 함수가 끝날 때 함께 소멸합니다.
Stack 영역은 컴파일 할 때 최대 크기가 결정되는데, 런타임 도중에 재귀함수를 너무 깊게 호출하면 할당된 영역에 호출된 함수의 정보를 모두 담을 수 없어 stack overflow 에러가 발생합니다.
Heap vs Stack
Stack은 동적으로 할당되는 Heap과 달리 최대 용량이 컴파일 타임에 정해져 한정적이지만,
메모리 주소가 높은 곳에서 부터 할당되는 LIFO(Last In First Out) 구조를 가지고 있어 stack pointer만 이동시킴으로써 메모리를 할당하고 해제할 수 있기 때문에 메모리 접근이 굉장히 빠릅니다.
반면 Heap은 사용자 의해 런타임에 동적으로 할당되므로, stack에 비해 느립니다.
자세히 설명하자면 heap은 메모리를 블록 단위로 관리하는데, 비어있는 메모리 블록 정보를 free list에 저장해둡니다.
사용자의 요청으로 메모리를 할당하려면 free list에서 적절한 크기의 메모리 블록을 찾아내는 과정이 필요하고,
또한 메모리를 해제할 때도 free list에 적절한 형태로 해당 블록 정보를 넣어주는 과정이 필요하므로,
단순히 stack pointer만 이동시켜주면 메모리를 할당하고 해제할 수 있는 stack에 비해 메모리 관리가 느리다고 할 수 있습니다.
또한 제때에 메모리를 해제해주지 않으면 memory leak이 일어날 수 있습니다.
하지만 그 크기를 컴파일 타임에 제한하지 않았기 때문에 유연함을 가지고 있다는 것이 장점입니다.
잘못된 내용이 있다면 알려주시길 바랍니다! 감사합니다 😊
'개발 > 💻 컴퓨터 공학' 카테고리의 다른 글
[Python] re 모듈로 문자열 처리하기 (3) | 2024.11.13 |
---|---|
[Python] try 구문 모든 예외 처리하기 (1) | 2024.11.07 |
[Python] Python은 난수를 어떻게 생성할까? (3) | 2024.10.29 |
[Python] 파이썬 GIL - Multiprocess vs Multithread (3) | 2024.10.29 |