이번에 프로세스와 스레드에 대해서 알아보면서 메모리의 구조가 명확하게 어떻게 구성되어있는지,
각자 어떤 역할을 갖고 있는 지 알아둬야 할 필요가 있을 것 같아서 메모리의 구조와 역할에 대해서 알아보았습니다.
우선 메모리의 구조에 대해서 알아보기 전에 프로그램이 어떻게 실행되는지 먼저 간단하게 알아봅시다.
먼저 우리가 만든 프로그램을 실행시키면 운영체제에서는 해당 프로그램의 정보를 읽고 그에 맞는 메모리를 할당해 줍니다.
그리고 해당 메모리에 프로그램이 동작하는데 필요한 정보들이 로드되고, 해당 정보에 따라서 동작되게 됩니다.
그럼 이제 메모리에 대해서 알아보도록 합시다.
메모리는 크게 코드 영역(텍스트 영역), 데이터 영역, 힙 영역, 스택 영역
이렇게 4가지로 구성되어 있습니다.
각 영역에 대해서 간단하게 설명하도록 하겠습니다.
Text영역이라고도 말하며 프로그래머가 작성한 코드 등이 저장되는 장소입니다.
프로그램이 종료될때까지 값이 변하지 않으며 Read_Only인 ROM에 저장되고
,
저장되는 값은 함수, 제어문, 상수
같은 녀석들이 해당되고
코드 영역은 컴파일 시 크기가 정해지게 됩니다.
데이터 영역에는 메인함수 전에 선언된 값들이 들어오게 됩니다.
전역변수, 정적변수
등이 이에 해당되며 프로그램이 끝날 때까지 메모리에 남아있게 됩니다.
데이터 영역은 크게 두가지로 나뉠 수 있는데 Data와 BSS
로 나눌 수 있습니다.
Data는 초기화가 된 변수를 저장하는 곳
이고, BSS는 아직 초기화가 되지 않은 변수
들이 저장되게 되고
데이터 영역은 컴파일 시 크기가 정해지게 됩니다.
사실 Data영역은 ROM에 저장됩니다.
하지만 ROM은 읽기만 수행이 가능하기 때문에 읽기, 쓰기가 가능한 RAM에 복사해서 사용하게 됩니다.
힙 영역은 사용자에 의해서 관리되는 영역입니다.
간단하게 말하면 동적 할당이 된 변수들이 저장되는 영역
입니다.
힙 영역은 런타임 시 크기가 정해지게 됩니다.
스택 영역은 함수를 호출할 때 해당 함수의 지역변수, 매개변수
등이 저장되는 공간입니다.
그리고 함수가 종료되면 해당 부분에서 선언된 변수들을 메모리에서 해제시킵니다.
스택 영역이 다른 영역과 다른 점이 있습니다.
다른 영역은 low address에서 high address
의 순서로 메모리에 쌓이게 되는데,
스택 영역은 반대로 high address에서 low address
의 순서로 메모리에 쌓이게 됩니다.
즉 다른 영역은 0x00 ~ 0x01 ... 의 순서이지만 스택 영역은 0xFF ~ 0xFE ...같이 사용됩니다.
스택 영역은 컴파일 시 크기가 정해지게 됩니다.