메모리

C++ 2019. 12. 23. 11:10
반응형

메모리란 무엇인가

해당 절은 그 참고자료를 나름대로 해석을 한 것이므로 정보의 신뢰성(무료라이센스이지만 출처가 조금 애매함)을 따진다면 완전히 신뢰하지는 않았으면 한다. 다만 키워드에 중점을 두는 식으로 읽기를 바람.

메모리는 컴퓨터의 기본 저장 구역이며 [Bit]로 부른다. 이 Bit란 것은 오로지 0과 1의 값을 가지며 가장 효율적인 방법으로 데이터를 표현하는 방식이다. 이유는 디지털 정보를 저장하기 때문. 디지털은 전기신호를 뜻하고 켜짐, 꺼짐과 연관이 있다. (전기 신호란 것은 파장과 연관이 있으며, 빛의 있음과 없음 파장의 유무와 동일 시 되는 말이다. 결국 파장과 빛은 같은 것이기 때문에 말만 다를 뿐은 [있다, 없다]를 구분지을 뿐이다.)

그 Bit란 것을 저장할 수 있는 공간… Latch[플립플롭] 부른다.

 

플립플롭 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. R1, R2 = 1 kΩ, R3, R4 = 10 kΩ 플립플롭 또는 래치(영어: flip-flop 또는 latch)는 전자공학에서 1 비트의 정보를 보관, 유지할 수 있는 회로이며 순차 회로의 기본요소이다. 조합논리회로에 비해 플립플롭은 이전상태를 계속 유지하여 저장한다. 디지털 공학에서 입력을 출력에 반영하는 시점을 클럭 신호의 순간 엣지에서 반영하는 플립플롭과, 입력에 따라 항상 반영되는 래치로 구분된다. 필요한 플립

ko.wikipedia.org

C++ 코더 입장에선 사실 이 회로에 대한 자세한 내용은 이 더 이상 중요도가 떨어진다. 그래도 더 깊이 알아보고 싶다 링크를 타고 더더욱 많은 자료와 키워드를 접해보길 바란다. (문제는 기억은 안나지만 본인이 한번 공부 했다는 것이 함정 ㅋㅋㅋㅋ 다 까먹었지만 그림만 봐도 참... 새록새록하다ㅡ.ㅡ;;)

 

 

가상 메모리

해당 절 역시 나름대로 해석한 것이기에 너무 맹신하지 않았으면 한다. 다만, 키워드나 일부 정보들은 건질만 할 것이다.

 

초창기 컴퓨터는 메모리란 것이 크기가 작았고 가격도 상당했다. 따라서 프로그래머들은 제약된 환경 아래 메모리를 사용하였다. 오늘날은 그 크기와 가격이 각각 커지고 내려감에 따라 현대 코딩에서는 많은 메모리양을 필요로 하고 또 감당할 수 있게 되었다. 하지만, 역시 현대 코딩 역시도 메모리 결핍에 대한 문제에 봉착하는데 그 문제를 해결하는 방식이 바로 디스크의 메인 메모리에서 일부를 사용해 두 번째 매모리 공간을 할당하는 것이다.

 

이 분야에 첫 기술은 Overlay로 거슬러 올라가게 된다.

 

가상 메모리 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 가상 메모리는 활성 RAM과 DASD 상의 비활성 메모리로 결합되어 있다. 가상 메모리(문화어: 가상기억기) 또는 가상 기억 장치는 RAM을 관리하는 방법의 하나로, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 말한다. 이러한 방식은 멀티태스킹 운영 체제에서 흔히 사용되며, 실제 주기억장치보다 큰 메모리 영역을 제공하는 방법으로도 사용된다. 가상적으로 주어진 주소를 가상 주소(virtual a

ko.wikipedia.org

하지만, 누구나 그렇듯 과거에 구식인 방법을 사용해서 현재에 도입하려는 경우는 드물 것이다. 현재 가상메모리는 [Pages]란 것으로 정된다.

 

확실히 이 영역까지는 정리가 잘 되있는 블로그들도 있겠지만 워낙 실생활에도 밀접한 부분이기 때문에 쉽게 그 정의를 접할 수 있었다.

 

가상 메모리

프로그램이 실행되기 위해서는 주기억장치로 들어가야 하는데, 실행될 프로그램이 주기억장치보다 크거나 여러 개인 경우에는 주기억장치 공간의 부족으로 인해 프로그램이 제대로 실행되지 못할 수 있다. 그래서 당장 실행에 필요한 부분만 주기억장치에 저장하고, 나머지는 보조기억장치에 두고 동작하도록 하여 이런 문제를 해결할 수 있는데, 이런 개념을 가상 메모리라 하며 운영체제에서 지원한다. [가상 메모리] 프로그램이 실행되려면 우선 주기억장치에 들어가야 하는데, 다

terms.naver.com

 

메모리 구역

프로세스는 자신이 해결하고자 하는 일에 일련의 과정이나 공정이다. 또한 프로세스는 그 일에 대해 필요한 공간이 필요하다. 그 공간을 OS에서 관리하여, 가용할 수 있는 각각의 여러 프로세스들에게 [세그먼트]로 구분된 메모리 공간을 부여한다.

 

메모리맵

코드영역_

UNIX에서는 Text Segment로 불리는 이 영역은 함수의 이름, 정확히 말하면 그 함수의 코드를 저장한다. 일종의 집행하는 역할을 하며, 예를 들면 '쓴다'라는 함수가 있다고 가정했을 때 그 '어떻게 쓸것인가'에 접근하는 것이 아니라 그 '쓴다'라는 행위 자체를 저장하는 것이다. 따라서, 이 행위 자체가 없다면 행사를 할 것도 할 일도 없어진다. 이는 변수도 마찬가지다. 변수 선언 역시 할당하라는 행위이기 때문에 그 행위 자체를 저장하는 것이라 보면 된다.

 

 

데이터영역_

프로그래머로 명확히 구분되어지는 전역변수를 저장한다. 그것들은 프로그램 시작 시 코드영역 정의 후 바로 정의되어진다. 이 영역의 메모리는 프로그램이 종료되어야 소멸된다.

 

BSS_

초기화되지 않는 전역변수를 저장한다.

 

BSS는 크기의 사이즈를 할당한다

데이터영역은 메모리 자체를 할당한다

이 두 영역의 가장 큰 차이점은 메모리 할당의 유무다. 당연한 예기지만 초기화를 했을 때는 그 변수 크기에 맞게 메모리 할당이 가능한 것이고 그렇지 않을 때는 할당이 불가능하다는 점. 이점은 프로그램을 실행할 때 다르게 적용 되는데, 초기화를 하지 않을 경우 메모리 할당을 하지 않기 때문에 초기 메모리를 아낄 수 있다는 것이다. (다만, 그렇게까지 메모리 할당을 런타임으로 미루어야 하는지는 의문. 구조상 할당이 뒤로 밀리는 게 맞다면 말이다.)

 

여기까지는 Static 영역으로서 컴파일 간에 할당되는 영역이다. + 스택

 

 

HEAP_

해당 영역은 Dynamic 영역으로서 프로그램 실행간 할당되는 영역이다.

프로그램 실행간 즉, 런타임 간 메모리가 할당되는 영역 중 하나며, 프로그래머는 이 영역에 할당된 변수들을 포인터로 간접 관리를 할 수 있게 된다.

 

힙은 그 스택과 다르게 그 변수의 이름을 지정할 수 없으며, 메모리 접근 즉 포인터 형태로 관리되게 된다. 이 힙영역의 메모리는 제대로 관리되지 못해 프로세스 진행중 정상적으로 소멸을 시키지 못 할 경우 LEAK이란 것을 남기게 되어 이것들이 쌓여 메모리 할당 구역이 좁아지게 되다 결국, 프로그램이 터지게 된다.

 

해당 LEAK에 관한 관리는 철저해야하며, 이를 관리하는 여러가지 기술들 역시 존재한다.

 

 

STACK_

일반적인 지역변수들. 컴파일 시 크기가 정해지고 자료구조 STACK과 비슷하게 LIFO 형태를 취한다. 변수들이 차곡차곡 쌓여나가는 형식이며, 함수나 스코프 영역의 소멸 시에는 역시 위에서부터 하나씩 소멸해나가는 식이다.

 

 

 

 

 

 

 

C/C++언어 등의 변수가 선언되면 각각의 데이터 처리 변수 방식에 따라 특정 묶음으로 분리한다. 프로그래밍에 의해 작성 된 코드는 기계어 코드의 묶음으로 분리한다. 프로그램이 실행할 때 필요한 요소들의 묶음을 메모리에 나누어 배치한다.

 

각각의 기능적 묶음은 실행파일에서 구별하여 저장한다. 사용자에 의해 실행하면 메모리에 묶음을 나누어 배치하고 기계어코드 영역을 실행 한다.

 

메모리 관리 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

반응형

'C++' 카테고리의 다른 글

함수 호출 규약 - __thiscall, __clrcall  (0) 2019.12.23
함수 호출 규약 - __fastcall, __vectorcall  (0) 2019.12.23
함수 호출 규약 - __cdecl, __stdcall  (0) 2019.12.23
THREAD를 생성하는 5가지 방법  (0) 2019.12.23
C++이란...  (0) 2019.12.23
Posted by Library of Lotus
,