안녕하세요! 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개가 존재하게 된다는 걸 꼭 알아두자!