개발관련/컴퓨터구조론

컴퓨터 구조 - 메모리 구조

고통받는다 2023. 7. 7. 10:59

회사에서 일하고 있는데 대표님이 메모리 구조표 들고오시면서 이거 뭔지 아시냐고 물어보시더군요..

대학생때 컴퓨터 구조론 들으면서 봤던 기억이나서 이거저것 이야기 하다가 나중에 대표님이 신입 면접볼때 이거 아는지 물어봐야겠다 라고 하셔서 아이거 포스팅 해야겠다... 라고 마음먹었습니다.

우선 완전 딥하게는 들어가지 않을겁니다. 그냥 컴퓨터 구조론에있는 메모리 구조에 대한 전반적인 설명만 드릴겁니다.

이정도 까지만 알아도 OK입니다.

깊게내려가면 정말 한도끝도 없는거라 이해해 주시길 바랍니다.

주절주절 설명할 이유가 있겠습니까 먼저 그림부터 보시죠.

 

메모리의 구조

위키백과에서 나타내는 메모리구조

음... 일단 너무 복잡한것 같습니다. 좀더 간략화 해보도록 하죠.

메모리의 구조는 크게 5가지 영역으로 나누시면 됩니다.

CODE, DATA, BSS, HEAP, STACK 이렇게 말이죠.

그럼 각 영역이 어떤 역할을 하는지 알아보겠습니다.

TEXT(CODE)

 

실행 명령을 포함하는 코드들이 들어가는 부분입니다.

Read Only 영역이기 때문에 프로세스가 함부로 변경할수 없습니다. 만약 변경하려고 한다면 오류가 발생합니다.

코드 자체를 구성하는 메모리 영역으로 Hex 파일이나 Bin 파일 메모리입니다.

프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역입니다.

 

DATA

 

전역변수, 정적변수, 배열, 구조체 등이 저장되는 영역입니다.

(초기화된 전역 데이터는 DATA영역에, 초기화되지 않은 전역 데이터는 BSS영역에 저장됩니다.)

프로그램이 실행 될 때 생성되고 프로그램이 종료 되면 시스템에 반환됩니다.

함수 내부에 선언된 static 변수는 프로그램이 실행 될 때 공간만 할당되고, 그 함수가 실행 될 때 초기화 됩니다.

BSS

 

DATA 영역은 초기에 사용할 메모리를 확보하는 반면 BSS 영역에서는 런타임 후에 메모리 영역이 확보됩니다.

따라서 메모리 사용면에서 BSS 영역을 사용하면 효율적입니다.

초기화 되지 않은 전역 데이터가 저장되는 공간입니다.

※ 왜 BSS와 DATA영역을 구분하는가요?

초기화가 되지 않은 변수는 프로그램이 실행될때 영역만 잡아주고 그 값을 프로그램이 저장하고 있을 필요가 없습니다.

하지만 초기화가 된 변수는 그렇지가 않죠... 그 값도 프로그램에서 저장하고 있어야 하기 때문에 두가지를 구분해서 영역을 잡는것입니다.

이것이 BSS영역을 구분하는 이유입니다.

이런 특성 때문에 BSS 영역의 변수들은 그 수가 많아져도 프로그램의 실행코드 사이즈를 늘리지 않습니다.

(메모리 효율성 문제 때문에 구분했다고 이해하시면 됩니다.)

 

HEAP

 

대학생때 교수님께서 정말 너무나도 강조하신 부분이라서... 아직도 기억이 나네요.

대부분의 오류가 이부분에서 발생하고 프로그래머의 실력을 이곳에서 확인할수 있다고 하는....

필요에 의해서 동적으로 메모리를 할당하고자 할 때 위치하는 메모리 영역으로 동적 데이터 영역이라고 부릅니다.

메모리 주소 값에 의해서만 참조되고 사용되는 영역입니다.

C에서는 해당 영역에 데이터를 저장하기 위해서 malloc() 을 사용하고 Cpp 에서는 new() 함수를 사용합니다.

참고로 malloc()으로 할당해주시고 더이상 사용하지 않는다면 free()로 해제를 해주셔야합니다.

이거 안해서 OOM 나는 문제가 많다고 교수님께서 말씀하셨덕네 기억나네요...

 

STACK

 

프로그램이 자동으로 사용하는 임시 메모리 영역입니다.

local 변수, parameter, return 값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역입니다.

함수 호출시 생성되고, 함수가 끝나면 시스템에 반환됩니다.

스택 사이즈는 각 프로세스마다 할당 되지만 프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀수 없습니다.

명령 실행시 자동 증가/ 감소하기 때문에 보통 메모리의 마지막 번지를 지정합니다.

코드로 좀더 자세히 알아보자.

음.. 막연하게 이렇게 글로만 설명하면 잘 이해가 안갈수도 있습니다.

한번 간단한 코드로 위 구조를 이해해 보도록 하겠습니다.

확실히 코드를 보니 위 메모리 구조에 뭐가 들어가는지 알것 같습니다.

이상으로 메모리 구조에 대한 포스팅을 마치도록 하겠습니다.

나중에 기업 면접을 가시기 전에 이정도는 숙지하고 가시는게 좋을것 같습니다.