컴퓨터는 정보를 어떻게 저장할까? [크래프톤정글 10일차 ]

jinsung·2025년 5월 22일

크래프톤 정글 9기

목록 보기
8/59

난 이상하게 기초 CS 공부할 때가 재밌는 것 같다.
늘 컴퓨터가 어떻게 동작하는지 알고 싶었어서 그런가, 역시 사람은 하고싶은 걸 해야한다.

1. 정보의 저장

내 마음속에 저장 ☆

은 당연히 아니고.. 이전포스트에서 정보는 비트와 컨텍스트로 이루어진다고 했고 메모리에 저장된다고 했다.

즉 컴퓨터에서 정보의 저장이라 함은 '1'과'0'으로 이루어진 무수한 '0101010111' 을 메모리에 저장한다고 볼 수 있겠다.

이 메모리에는 각각 '주소'가 붙어있는데 메모리는 이 주소가 들어있는 거대한 바이트의 배열(처럼보임)인다. 실제로는 거대한 바이트의 배열은 아니지만 컴퓨터가 여러가지 기능을 사용해서 프로그램에게 그렇게 보이게 만들어준다.

주소       값
---------------
Ox2000     Ox12
Ox2001     Ox34
Ox2002     Ox56
Ox2003     Ox78

이 주소가 모여있는 저장공간이 있는데 이를 "가상주소공간" 이라고 한다.

실제로 메모리에 계속 값이 들어있지는 않지만 해당 주소로 요청이 들어오면 운영체제가 물리적 저장장소에서 메모리로 이동시킨 후, 프로그램의 요청을 처리한다.

이 가상주소 공간의 크기는 2^워드크기 - 1 인데.
워드크기는 CPU가 한 번에 처리할 수 있는 기본단위다.

ex) window32 bit = 4BYTE , window64 bit = 8BYTE

4바이트인 경우 가상 주소공간은 4GB 정도 되지만 8BYTE 인 경우는 엄청나게 크기가 커진다.

이 메모리 주소를 보면 현재 16진수로 표현된 것을 볼 수 있다.

왜 16진수로 메모리 주소를 표현하게 되었을까?

메모리 주소는 1byte(8bit) 값인데 이걸 각각 표현 방식을보자

  • 00000000 ~ 111111111 = 이진표현은 너무 장황하다.
  • 0 ~ 255 = 십진수는 비트패턴으로 변환해야한다.
  • 0~9 A~B (소문자도 가능) = 16진수가 적합하다.

이 16진수를 저장하는 데에도 방법이 있다.

1-1. 리틀레디안과 빅레디안

리틀레디안과 빅레디안의 성능차이는 아예없다고 봐도 좋다.
그래서 어떤게 더 좋냐고 개발자들끼리 싸울 때, 감정적이 된다고 한다.
난 F 싫어.

개념은 이렇다.

int 자료형의 16진수 메모리가 있다고 하자.

int 자료형은 4BYTE 이므로
int = Ox12345678

이런 주소가 생성될 것이다.

이걸 1BYTE 씩으로 나누면 (Ox12, Ox34, Ox56, Ox78) 이 되는데

이걸 16진수 표기법으로 나타내면

12 * 16^3 + 34 * 16^2 + 56 * 16^1 + 78 * 16^0

이다.

그래서 숫자의 크기가 Ox12 > Ox34 Ox56 > Ox78 가 되는데

컴퓨터는 "숫자의 크기가 큰 것을 더 중요한 데이터라고 판단한다"

리틀레디안과 빅레디안은 어떻게 다를까?

리틀레디안은 이렇게 표기한다.
=> Ox78563412
중요도가 낮은 순서대로 배치한다.

빅레디안은 이렇게 표기한다.
=> Ox12345678

그래서 실제로 C에서 포인터 변수를 만들었을 때, 리틀레디안인지 빅레디안인지에 따라

멀티 바이트 객체 ( 바이트를 여러개가지는 객체 char = 1 Byte , int = 4 Byte ) 의 메모리 위치가 달라진다.

왜냐하면 멀티바이트객체의 주소는 최소바이트의 주소이기 때문이다.

리틀레디안과 빅레디안은 이 최소바이트의 주소를 다르게 정한다.

네트워크 통신할 때의 문제

이 차이는 네트워크 통신일 때 문제가 되는데

송신 ======= 네트워크 표준으로 변경 =======> 네트워크
네트워크 ======== 내부바이트 표시방식으로 변경 ======> 수신

이렇게 송신측과 수신측에서 바이트 표시방식을 변경해줘야 한다.

회고

어떻게 정보가 표현되고 어떻게 저장되는지 조금 더 이해할 수 있는 공부였다.
이 공부들을 토대로 c언어를 배우고 핀토스까지 진행한다면
진짜 제대로 알고있는 개발자가 될거같아서 기쁘다.

0개의 댓글