안녕하세요! 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가 자동적으로 메모리 관리를 안 해준다.
- 따라서 프로그래머가 필요에 원할 때, 원하는 만큼 메모리를 할당 받아와 사용하고 반납할 수 있다.
- 용량의 제한이 없다. 이 말은 곧 남아있는 메모리의 모든 공간을 사용할 수 있다고 볼 수 있다.
- 프로그래머가 데이터 수명을 직접 정할 수 있다.
- 스택에 저장되어 있는 변수처럼 함수가 끝나면 사라지지 않는다.
- 전역 변수처럼 프로그램이 실행되는 동안 계속 살아있는 것도 아니다.