CS

RAM(메모리) 구조 (stack, heap, data 영역, code 영역)

서윤-정 2023. 8. 16. 13:37

 

 

 

 

✔️ RAM(Random Access Memory)

컴퓨터 시스템의 주요 메모리 구성 요소 중 하나로,

프로그램과 데이터를 저장하고 CPU가 빠르게 액세스하여 처리할 수 있는 물리적인 공간이다.

램은 컴퓨터가 작업을 수행하는 동안 필요한 데이터를 일시적으로 저장하며, 프로그램의 실행과

데이터 처리에 중요한 역할을 한다.

 

프로그램이 실행되는 과정

출처: https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

 

● 저장방식

램은 전기 신호로 데이터를 저장하고 읽어온다.

각 메모리 셀은 비트(0 또는 1)을 저장할 수 있는 작은 용량을 가지며, 이 비트는 정보를 나타낸다.

램은 플립플럽과 커패시터 등의 전자 기술을 사용하여 데이터를 보관한다.

 

● 용량

램의 용량은 컴퓨터 시스템마다 다르며, 일반적으로 몇 기가바이트(Gigabytes, GB)에서

수십 기가바이트까지 다양한 크기로 제공된다.

램 용량이 클수록 컴퓨터는 더 많은 데이터를 동시에 처리할 수 있다.

 

● 액세스 속도

램은 하드 디스크나 SSD보다 훨씬 빠른 데이터 액세스 속도를 제공한다.

이는 CPU가 데이터를 빠르게 가져와 처리할 수 있게 하며,

프로그램의 실행 속도와 성능에 직접적인 영향을 미친다.

 

● 임의 접근(Random Access)

램은 임의 접근 메모리로, 주소를 통해 특정 위치의 데이터에 직접 액세스할 수 있다.

이는 데이터를 순차적으로 읽거나 쓸 필요없이 필요한 데이터로 빠르게 이동할 수 있게 한다.

 

● 휘발성(Volatile)

램은 전원이 꺼지면 저장된 데이터가 사라지는 휘발성 메모리이다.

따라서 램에 저장된 데이터는 컴퓨터가 켜져 있는 동안에만 유지된다.

이 특성으로 인해 데이터는 영구적으로 보존되지 않는다.

 

● 계층 구조

램은 CPU의 레지스터와 캐시 메모리보다는 느리지만, 하드 디스크나 SSD보다는 빠른 속도를 가지며

중간 계층에 위치한다.

따라서 램은 주 메모리로서 주로 프로그램의 실행과 데이터 처리에 사용되고, 

보조 저장장치에 비해 더 빠른 속도를 제공한다.

 

 

 

 

✔️ RAM 구조

램은 컴퓨터 시스템의 주 메모리로, 프로그램과 데이터가 실행되고 처리될 때 사용되는 물리적인 메모리 공간이다.

램은 프로그램 코드, 변수, 스택, 힙, 그리고 실행 중인 프로그램에 필요한 데이터를 저장한다.

램의 구조는 크게 스택, 힙, 데이터 섹션, 코드 섹션으로 나눌 수 있다.

 

● 스택 (Stack)

스택은 주로 호출과 지역 변수를 관리하는데 사용된다.

함수가 호출될 때 함수의 매개변수와 지역 변수가 스택에 순차적으로 저장된다.

함수의 실행이 끝나면 해당 함수에 할당된 스택 프레임이 제거된다.

후입선출(LIFO) 방식으로 동작한다.

 

● 힙 (Heap)

힙은 동적으로 할당되는 데이터를 저장하기 위한 영역이다.

개발자가 직접 메모리를 할당하고 해제하여 데이터 구조나 객체를 관리한다.

힙은 프로그램 실행 중에 필요한 크기만큼 동적으로 확장될 수 있다.

 

● 데이터 섹션 (Data Section)

데이터 섹션에는 정적(static) 변수와 전역(global) 변수가 저장된다.

이러한 변수들은 프로그램의 시작부터 끝까지 메모리에 유지되며, 프로그램 실행 중 어디서든 접근할 수 있다.

 

● 코드 섹션 (Code Section)

코드 섹션은 프로그램의 명령어와 실행 코드가 저장되는 공간이다.

프로그램의 명령어들은 이곳에 저장되며, CPU는 여기에서 명령어를 읽어와 실행한다.

 

램 구조는 프로그래밍 언어와 컴파일러, 운영 체제 등의 동작과도 밀접한 관련이 있으며, 

프로그램의 성능과 메모리 사용에 중요한 역할을 한다.

출처: https://code4human.tistory.com/129

 

 

 

 

 


 

 

✔️ 스택 (Stack)

컴퓨터 메모리의 한 영역으로, 주로 함수 호출과 지역 변수의 관리를 위해 사용되는 자료구조이다.

 

● 데이터 저장과 제거

스택에 데이터(주로 변수 값)를 추가할 때는 '푸시(push)'라는 용어를 사용하며, 가장 위쪽에 데이터를 추가한다.

데이터를 제거할 때는 '팝(pop)'이라는 용어를 사용하며, 가장 위쪽의 데이터를 제거한다.

이렇게 후입선출 방식으로 데이터를 추가하고 제거하므로, 가장 최근에 추가된 데이터가 가장 먼저 제거된다.

 

● 함수 호출과 복귀

함수가 호출될 때, 해당 함수의 매개변수와 지역 변수는 스택에 순차적으로 저장된다.

함수가 실행을 마치고 반환되면, 해당 함수에 할당된 스택 프레임이 제거되어 이전 상태로 돌아간다.

이렇게 스택을 사용하여 함수의 호출과 복귀를 관리하면, 함수들 간에 데이터가 겹치지 않고 독립적으로 실행될 수 있다.

 

● 재귀 호출

스택은 재귀 함수 호출에 필수적이다.

재귀 함수는 자기 자신을 호출하는 형태로 작성되며, 각 호출마다 새로운 스택 프레임이 생성된다.

재귀 호출이 완료되면 스택 프레임이 역순으로 제거되며, 이를 통해 재귀 호출의 실행 흐름을 관리한다.

 

● 메모리 관리

스택은 정적 메모리 할당과 달리 동적 메모리 할당을 필요로 하지 않는다.

데이터가 함수의 호출과 반환과 밀접하게 관련되어 있는 경우에 유용하게 사용된다.

그러나 스택은 일반적으로 제한된 크기를 가지며, 스택 오버플로우(Stack Overflow)가 발생할 수 있다.

이는 스택에 데이터를 추가하려고 할 때 스택이 이미 가득 차 있는 경우에 발생하는 현상이다.

 

 

 

출처: https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

위의 힙과 스택영역은 사실 같은 공간을 공유한다.

힙이 메모리 위쪽 주소부터 할당되면 스택은 아래쪽부터 할당되는 식이다.

그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 heap overflow, stack overflow라고 칭한다.

스택 영역이 크면 클수록 힙 영역이 작아지고, 힙 영역이 크면 클수록 스택 영역이 작아진다.

 

 

✔️ 힙 (Heap)

컴퓨터 메모리 구조 중 하나로, 동적으로 할당되는 데이터를 저장하기 위한 영역이다.

 

동적 메모리 할당

힙은 프로그램 실행 중에 동적으로 메모리를 할당할 수 있는 영역이다.

개발자는 힙에서 필요한 만큼의 메모리를 할당하고,

더 이상 사용하지 않을 때 메모리를 해제하여 다시 사용할 수 있게 된다.

이러한 동적 할당은 유연성과 효율성을 높이는 데 도움이 된다.

 

메모리 누수 관리

힙에서 메모리를 할당한 후에는 개발자가 해당 메모리를 명시적으로 해제해야 한다.

할당된 메모리를 해제하지 않으면 메모리 누수가 발생하여 사용하지 않는 메모리가 계속 남아있게 된다.

이로 인해 시스템의 메모리 사용량이 계속 증가하게 되므로, 메모리 관리가 중요한 부분이다.

 

  데이터의 임의접근

힙은 데이터를 입의 접근(Random Access) 방식으로 관리한다.

이는 데이터를 주소를 통해 직접 접근할 수 있게 하며, 데이터의 크기나 위치에 상관없이 효율적인 데이터 

액세스를 가능하게 한다.

 

가변 크기

힙은 프로그램 실행 중에 동적으로 메모리를 할당하므로, 데이터의 크기에 따라 힙의 크기가 동적으로 조정될 수 있다.

이는 프로그램이 실행 중에 필요한 만큼의 메모리를 사용할 수 있게 해준다.

 

힙은 주로 객체 지향 프로그래밍에서 객체나 데이터 구조를 동적으로 생성하고 관리하기 위해 사용된다.

다양한 프로그래밍 언어와 라이브러리에서 힙 관리를 위한 함수와 클래스를 제공하여 효율적인 메모리 사용을 도와준다.

하지만 힙 관리는 실수로 메모리 누수를 발생시키거나 메모리 파편화와 같은 문제를 유발할 수 있으므로 주의가 필요하다.

 

 

 

➕ 매개변수(Parameters)

매개변수는 함수가 호출될 때 함수에 전달되는 값을 받는 변수이다.

함수는 입력값을 처리하고 결과를 반환하기 위해 매개변수를 사용한다.

함수의 정의부에서 매개변수의 이름과 데이터 타입을 지정하며, 함수가 호출될 때 이에 해당하는 값이 전달된다.

예를 들어, 다음과 같은 함수 정의에서 x와 y는 매개변수이다.

int add(int x, int y) {
    return x + y;
}

 

함수 호출 시에는 매개변수에 실제 값을 전달한다.

int result = add(5, 3); // 5와 3이라는 값이 매개변수 x와 y에 전달됨

 

 

➕ 지역변수(Local Variables)

지역변수는 함수 내부에서 선언되고 사용되며, 함수 내에서만 접근할 수 있는 변수이다.

지역 변수는 해당 함수가 호출될 때마다 생성되고 함수 실행이 끝나면 소멸된다.

이러한 변수들은 함수의 작업이 필요한 데이터를 저장하거나 임시적으로 사용하는데 사용된다.

예를 들어, 다음 함수 내에서 total은 지역변수이다.

int calculateSum(int a, int b) {
    int total = a + b;
    return total;
}

tatal 변수는 함수 내에서만 접근 가능하며, 함수의 실행이 끝나면 메모리에서 소멸된다.

 

매개변수와 지역변수는 프로그램의 정확성과 가독성을 높이는 데 중요한 역할을 한다.

함수 내에서만 사용되는 데이터는 지역변수로 선언하며 다른 부분과의 충돌을 방지하고, 함수의 재사용성을 높 수 있다.

 

 

 

 

 

 

 

✔️ 데이터 섹션 (Data Section)

프로그램의 정적인 데이터를 저장하기 위한 메모리 영역이다.

프로그램이 실행될 때 데이터 섹션에 할당되며, 프로그램의 시작부터 끝까지 유지되는 데이터들을 저장한다.

데이터 섹션에는 전역 변수와 정적 변수가 저장되며, 이들 변수들은 프로그램 전체에서 접근 가능한 데이터이다.

 

정적 데이터 저장

데이터 섹션은 프로그램의 정적 데이터를 저장하기 위해 사용된다.

정적 데이터는 프로그램이 실행되는 동안 메모리에 상주하며, 프로그램이 종료될 때까지 유지된다.

따라서 전역 변수와 정적 변수가 이곳에 저장된다.

 

전역변수(Global Variable)

전역 변수는 프로그램 어디서든 접근 가능한 변수로, 프로그램 내에서 여러 함수나 블록에서 사용될 수 있다.

전역 변수는 프로그램의 시작부터 끝까지 유지되므로, 언제든지 접근할 수 있다.

 

정적변수

정적 변수는 특정 함수 내에서 선언되었지만 해당 함수의 실행이 끝나도 소멸되지 않고 데이터 섹션에 저장된다.

이렇게 저장된 정적 변수는 함수 호출 간에도 유지되며, 다음번에 해당 함수가 호출될 때 이전 값을 유지한다.

 

데이터 섹션의 사용은 프로그램의 여러 부분에서 동일한 데이터에 접근해야 하는 경우에 유용하다.

전역 변수와 정적 변수는 프로그램의 다양한 위치에서 공유되므로,

데이터의 일관성과 중복을 방지하여 프로그램의 유지 보수와 가독성을 향상시킬 수 있다.

하지만 지나치게 많은 전역 변수와 정적 변수를 사용하면 코드의 복잡성이 증가하거나 예기치 못한

문제가 발생할 수 있으므로 적절한 사용이 필요하다.

 

 

 

 

 

✔️ 코드 섹션 (Code Section)

프로그램의 명령어와 실행 코드가 저장되는 메모리 영역이다.

코드 섹션은 컴파일된 프로그램의 기계어 명령어나 중간 코드와 같은 실행 가능한 명령어들이 저장되어 있다.

이 명령어들은 프로그램의 로직과 동작을 결정하며, CPU가 해당 명령어를 읽어와 실행한다.

 

코드 섹션의 주요 특징은 다음과 같다.

 

프로그램 명령어 저장

코드 섹션은 프로그램의 실제 명령어와 실행 코드가 저장되는 곳이다.

프로그램이 실행될 때, CPU는 코드 섹션에서 명령어를 읽어와 실행하며, 이를 통해 프로그램 동작이 결정된다.

 

실행 가능한 명령어

코드 섹션에 저장되는 명령어들은 CPU가 직접 실행 가능한 명령어여야 한다.

이러한 명령어들은 컴파일러나 어셈블러에 의해 생성되며, 프로그램의 로직을 표현하고 제어한다.

 

메모리에 상주

코드 섹션에 저장된 명령어들은 프로그램이 실행되는 동안 메모리에 상주하며, CPU가 해당 명령어를 실행하게 된다.

코드 섹션의 내용은 실행 중에 변경되지 않고 고정되어 있다.

 

일련의 명령어

코드 섹션은 일련의 명령어로 구성된다.

각 명령어는 특정 작업을 수행하거나 명령어의 흐름을 제어하는 역할을 한다.

이러한 명령어들의 순서와 조합에 따라 프로그램의 동작이 결정된다.

 

코드 섹션은 프로그램의 핵심이며, 프로그램이 실행되는 동안 CPU가 실제로 수행하는 작업들이 저장되어 있는 곳이다.

컴파일된 프로그램의 실행 파일 내부에 포함되며, 프로그램 실행 중에는 해당 섹션의 명령어가 메모리에

로드되어 CPU에 의해 실행된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

😊 참고

 

https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

 

[컴퓨터 기초] 메모리구조(Memory Structure) - jinShine

프로그램 실행 순서 메모리 영역에 관해 이야기하기 전에 어떤식으로 프러그램이 실행되는지 과정을 살펴 보겠습니다. 프로그램의 정보를 읽어 메모리에 로드되는 과정을 보실 수 있으실텐데,

jinshine.github.io

 

'CS' 카테고리의 다른 글

JWT란 무엇일까?  (0) 2023.08.10