Search
Duplicate

메모리와 변수

간단소개
메모리에 관한 기초(?)
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
컴퓨터구조
개발지식
Scrap
태그
9 more properties
안녕하세요! 5기 gulee입니다!
우리가 C를 배우는데 가장 베이스로 필요한 메모리에 관해 정보 공유를 하고 싶었구요. 이번에 평가를 보면서 데이터메모리섹션과 힙메모리섹션과 그런 메모리에 관해 제대로 모르고 키워드들을 사용하는 경우를 보고 좀 기본적으로 알고 넘어갔으면 좋겠어서 이렇게 적게 되었습니다!

1. 메모리 설명

2. 메모리 종류

3. 변수

4. 가상 주소 공간상의 변수

1. 메모리의 설명

메모리의 구조
물리적인 의미로는 기억창치로 의미하고, 논리적인 의미로는 기억공간 이라고 한다.
프로그램이라는 것은 명령어와 데이터의 묶음이다. 이 명령어와 데이터는 메모리의 공간에 자리를 잡는다. 특히 실행 되기 위해서는 RAM이라는 메모리 공간에 자리를 잡는다. 일반적으로 우리가 메모리라고 말하는 것은 RAM을 말하는 것이다.
절대주소
절대주소의 크기는 1byte의 크기를 보관하고 있다. 64k짜리라면 2^16 개의 주소가 존재하게 된다. 이것을 16진수로 표기하게 되면 0번지부터 FFFF까지의 주소를 가지게 된다.
예로, 2byte크기의 데이터를 보관한다면 주소 2개를 사용하고, 만약 4byte크기의 데이터를 보관한다면 주소 4개를 사용한다.
데이터를 보관하는 장소를 보고 절대주소라고 한다.
1byte
보통의 컴퓨터는 1byte를 8bit로 되어 있다.
1byte는 보통의 컴퓨터는 데이터를 읽어오는 최소의 크기라고 생각하면 된다.
1bit는 2가지의 상태를 가지는데, 그게 on/off 두가지를 가지고 있다. 이것을 0 또는 1이라고도 한다. True/False 와 같은 맥락이라고 봐도 좋다.
1byte는 8bit 즉, 256가지의 상태를 표현할 수 있다.
메모리와 프로세스 관계
우리가 프로그램을 실행하면 프로그램은 os에서 관리하는 메모리상에 떠서 활동하게 된다. 이때 실제 메모리는 os가 관리하게 되고, 프로세스에서는 실제 메모리주소를 확인할 수 없고, os에 의해서 감춰지게 된다. 이렇게 하는 이유는 프로세스에서 다른 프로세스가 사용하고 있는 메모리에 접근하지 못하도록 함으로써 이 os에서 조금 더 안정적으로 프로세스와 프로세스 사이에 서로 사용하고 있는 메모리를 방해하거나 침범에서 발생하는 오류들을 방어하기 위해서 이와 같은 시스템을 사용한다.
프로세스들은 가상 주소 공간을 사용하게 되고 , 32bit, 64bit에 따라서 좀 다르긴 하지만 32bit 기준에서는 최대 4GB이다. 또 다른 프로세스는 또 자신만의 독립적인 4GB의 주소를 가진다. 이 주소의 크기는 2^32 개가 존재한다. 그걸 16진수로 표현하면 0부터 FFFFFFFF까지 자릿수 만큼의 개수가 각각 프로세스마다 존재하게 된다.
실제로 가상공간에 2바이트의 메모리를 사용하고 있다면, 이 데이터를 실제 메모리공간주소에 맵핑 되서 데이터가 보관된다.

2. 메모리 섹션의 종류

첫 번째, 스택 메모리 섹터
각 함수에서 사용하는 지역 변수 등을 임시적으로 저장하는 공간이다.
순차적으로 주소를 가지게 된다. 보통의 컴퓨터는 큰주소부터 작은주소로 움직인다.
함수가 호출될 때마다 그 함수에서 필요한 공간을 스택에서 떼어줬다가 그 함수가 반환하면 지워버리는 개념이다.
함수를 호출할때 스텍에 정확히 어떤게 어떤 순서로 들어가는지 호출 함수 규약(calling convention)에 따라 다르다.
두 번째, 힙 메모리 섹터
컴퓨터에 존재하는 범용적인 메모리이다.
스택 메모리처럼 특정 용도로 떼어 놓은 용도가 아니다
스택과 달리 컴파일러 및 CPU가 자동적으로 메모리 관리를 안 해준다.
따라서 프로그래머가 필요에 원할 때, 원하는 만큼 메모리를 할당 받아와 사용하고 반납할 수 있다.
용량의 제한이 없다. 이 말은 곧 남아있는 메모리의 모든 공간을 사용할 수 있다고 볼 수 있다.
프로그래머가 데이터 수명을 직접 정할 수 있다.
스택에 저장되어 있는 변수처럼 함수가 끝나면 사라지지 않는다.
전역 변수처럼 프로그램이 실행되는 동안 계속 살아있는 것도 아니다.
세 번째, 데이터 메모리 섹터
데이터 메모리 섹터는 실행중에 움직이는 메모리가 아니다.
우리가 전역변수, static(정적) 변수를 선언하게 되면 이 곳 데이터 메모리에 저장되게 된다.
이 데이터 메모리는 프로그램이 끝날때까지 없어지지 않고 계속 그 자리에 있게 된다.
네 번째, 코드 메모리 섹터
코드 메모리 섹터는 우리가 컴파일할때 필요한 코드들 그러니까 우리가 작성한 코드들이 들어있는 메모리라고 보면 된다.

3. 변수

변수는 메모리 공간의 “이름”이다.
우리가 코드를 짤 때 char c = 'A'; char형도 1바이트의 정수형이다. 이런식의 코드는 1바이트라는 메모리 공간을 할당을 하고 그 메모리 공간의 이름이 c라는 이름을 가진다.
int n = 100; int형식도 정수형이다. 이 코드는 시작주소부터 4개의 메모리를 사용해서 할당을 하고 그 메모리 할당한 장소의 이름을 n으로 한다. 그 안에 값은 100이라는 정수를 가지고 있다.

4. 가상 주소 공간 상의 변수

우리가 지금까지 봐왔던 변수들의 주소는 가상주소이다.
프로세스 공간에 4GB의 가상주소 공간이 할당이 되고 시작주소 0번지 부터 FFFFFFFF의 주소를 가지게 된다. 32bit환경에서는 가상 주소 공간을 2^32 개를 가지고 있고 1byte 크기의 주소 하나 하나를 사용하고 있다.
우리가 보는 주소들은 모두 프로세스에서만 볼 수 있는 가상주소다. 그리고 이 주소들은 os에 의해서 물리메모리에 매핑이 된다. 물리 메모리에 실제 주소가 존재하게 되고, 2개가 존재하게 된다는 걸 꼭 알아두자!