시프 - 3주차 Memory Representation

강준호·2024년 3월 21일

시스템프로그래밍

목록 보기
1/18

메모리 표현 및 관련 개념

메모리의 기본 개념

메모리는 비트로 표현된다

  • 컴퓨터에게 메모리는 단순히 비트들의 집합으로 인식됩니다.
  • 데이터 타입은 소프트웨어적으로 정의됩니다.
  • 현대 프로세서는 주로 정수와 부동 소수점 숫자를 직접적으로 조작할 수 있습니다.

메모리는 단어로 표현된다

  • 메모리는 '단어' 단위로 표현하는 것이 더 정확합니다.
  • 단어: 플랫폼의 네이티브 정수 크기
    • 예: x86-64는 64비트, ARM Cortex-A32는 32비트
  • 메모리 버스의 너비가 단어 크기를 결정할 수 있습니다.
  • 네이티브 정수 크기와 메모리 버스 너비가 동일하다고 가정합니다.

컴퓨터 아키텍처

버스

  • 버스의 너비: 물리적인 선의 수
    • 각 선은 전송당 1비트를 전송합니다.
  • CPU는 메모리에서 데이터를 버스 너비 단위로 가져옵니다.
  • CPU 레지스터는 네이티브 정수 크기입니다.
    • x86-64는 여러 크기의 정수를 단일 레지스터에서 조작할 수 있습니다.

메모리의 구조화

데이터 타입의 표현

  • 프로그래밍 언어는 불리언, 클래스, 문자열, 구조체 등의 데이터 타입을 제공합니다.
  • 메모리에서 데이터 타입은 관례에 따라 해석됩니다.
    • 예: C 문자열은 인접한 바이트의 시퀀스입니다.

16진수 사용

  • 16진수는 컴퓨팅에서 많이 사용됩니다.
  • 16진수: 0~15를 0-9와 A-F로 표현
  • 16진수는 4비트를 한 자리로 표현하므로 편리합니다.

C 구조체

구조체의 개념

  • 구조체: 하나 이상의 기본 타입으로 구성된 복합 데이터 타입
  • 구조체의 메모리 배치는 각 타입의 크기에 맞춰 패딩됩니다.
  • 구조체의 주소는 포함된 가장 큰 타입의 크기로 나누어집니다.

패딩과 정렬

  • 데이터 타입은 주소가 타입의 크기로 나누어질 수 있도록 정렬됩니다.
  • 패딩은 데이터 타입 간의 정렬을 맞추기 위해 사용됩니다.

구조체와 포인터

  • 구조체 포인터는 '->' 연산자를 사용해 역참조합니다.
  • 포인터 연산은 포인터가 가리키는 타입의 크기를 단위로 합니다.

포인터 타입과 위험성

  • 포인터 타입은 컴파일러에게 해당 타입으로 취급하라는 지시를 합니다.
  • 잘못된 포인터 연산이나 할당은 프로그램의 안정성을 해칠 수 있습니다.

동적 할당

malloc과 free

  • malloc(size): 지정된 크기의 메모리를 동적으로 할당하고, 포인터를 반환합니다.
  • free(ptr): 할당된 메모리를 해제합니다.
    • 해제된 메모리는 재사용될 수 있으며, 해제된 포인터는 다시 사용하면 안 됩니다.

메모리 덤프

dump_mem 함수

  • 메모리의 내용을 바이트 단위로 출력합니다.
  • 바이트 단위로 캐스팅된 메모리를 순회하면서 각 바이트를 16진수 형식으로 출력합니다.
#include <stdio.h>
void dump_mem(const void *mem, size_t length) {
    const unsigned char *buffer = (const unsigned char *)mem;
    for (size_t i = 0; i < length; ++i) {
        if (i > 0 && i % 8 == 0) {
            printf("\n");
        }
        printf("%02x ", buffer[i] & 0xff);
    }
    printf("\n");
}

int main() {
    int numbers[] = {1, 2, 3, 4};
    dump_mem(numbers, sizeof(numbers));
    return 0;
}

출력 결과

  • 리틀 엔디안 방식으로 메모리에 저장된 정수 배열을 16진수로 출력

바이트 순서와 부호 확장

바이트 순서

  • 리틀 엔디안: 낮은 주소에 하위 바이트가 먼저 저장됨
  • 정수 98303 (0x17fff)의 저장: ff 7f 01 00

부호 확장

  • 음수 정수는 이진수 보수를 사용해 표현합니다.
  • 예: char c = 0x80; => -128로 표현됨

부동 소수점

부동 소수점 수의 표현

  • 가변 소수점 수: 소수점의 위치가 변할 수 있는 수
  • 예: 3.14159, 6.626 × 10^-34

IEEE 754 표준

  • 현대 컴퓨터에서 부동 소수점 수를 표현하는 표준

요약

  • 메모리와 레지스터 접근은 단어 단위로 이루어짐
  • 16진수는 메모리를 표현하기에 편리함
  • C 구조체는 메모리에서 인접하게 배치된 데이터 타입들로 구성됨
  • 정렬은 메모리 배치에 영향을 미침
  • 정수와 부동 소수점 표현에는 각각의 복잡성이 존재함

0개의 댓글