Post

메모리, 포인터와 참조


컴퓨터 구조

컴퓨터 구조를 공부하면서 알게된 내용을 요약해서 작성해보자.

메모리

  • 메모리의 개념
    • 힙 영역
    • 스택 영역
    • 데이터 영역
    • 가상 메모리
    • 메모리 할당
    • 메모리 해제
    • 메모리 누수
  • 지하철역이나 쇼핑몰의 사물함을 메모리에 비유할 수 있다.
  • 메모리에는 사물함처럼 여러 종류를 수납할 수 없으며, 오로지 0과 1을 보관할 수 있다.
  • 여기에 보관되는 0, 1을 1비트라고 한다.
  • 1비트만으로는 활용하기에 한계가 있어 비트 여덟 개를 묶어 정보를 나타내는 1바이트를 사용한다.
  • 비트마다 번호를 붙이지 않고 바이트마다 번호를 붙인다. 모든 바이트는 메모리 내 자신의 주소를 가지고 있으며 이 주소를 일반적으로 메모리 주소라고 한다.
  • 메모리 주소 한 개를 사용하여 특정한 사물함 여러 개를 찾을 수 있으며, 이를 주소 지정이라고 한다.
  • 1바이트 역시 정보를 표현하는 능력에 한계가 있다.
  • 일반적으로 4바이트를 묶어 하나의 정수를 표현하는 단위로 사용한다.
  • 16비트 시스템에서 int 형의 크기는 16비트인 2바이트, 32비트 시스템에서는 32비트인 4바이트로 확장되었다. 64비트 시스템에서는 호환성을 위해 32비트 크기의 int형과 64비트 크기의 int64 형이 별도로 있다. int 형이 무조건 4바이트라고 하는 것은 위험하다.
  • 변수 크기가 중요하다면 int 대신 short, long, longlong 등 크기가 고정된 형식을 사용해야 한다.

메모리에서 변수로

  • 1바이트의 메모리가 있고 여기에 1 + 2 값을 계산하고 싶을 때 먼저 숫자 1과 2를 메모리에 저장해야 한다.
  • 숫자 1을 1바이트 메모리의 6번에 넣는다. 6번은 이제 숫자 1을 나타낸다.
  • 메모리 6번은 인간에게 익숙하지 않아 이름을 정해준다.
  • 이 때 6번에 a라고 정해주면 메모리 6번은 a가 되고 a는 메모리 6번을 나타낸다.
  • a에 저장된 값이 1이다. a = 1

변수에서 포인터로

  • 변수가 얼마나 많은 메모리 공간을 차지하고 있는지 관계없이 메모리 주소만 알고 있으면 해당 데이터를 바로 찾을 수 있다.
  • 주소 1 -> 주소 3 -> 데이터 방식을 간접 주소 지정이라고 한다.
  • 고급 언어에는 변수 개념이 있다.
    • 주소1 -> 주소 3 -> 데이터 - 어셈블리어 수준
    • b -> 데이터 - 고급 언어 수준
  • 이것이 포인터를 더 높은 수준의 추상화라고 일컫고 추상화 목적은 간접 주소 지정을 감싸기 위한 것이다.

포인터

  • 포인터를 지원하지 않는 프로그래밍 언어에서 c = a + b라는 코드를 작성할 때는 주소 개념이 없다.
  • 주소라는 개념은 추상화되어 있기 때문에 a, b, c가 어디에 저장되는지 신경 쓸 필요 없이 변수가 존재한다는 것만 알고 있으면 된다.
  • 포인터 개념이 있으면 메모리 같은 하드웨어를 직접 조작할 수 있다.

포인터에서 참조로

  • 참조란 무엇일까?
    • 자바라는 이름을 가진 이웃이 있다고 가정해보자. 자바에게는 많은 호칭이 있다.
    • 누구는 객체 지향언어, 누구는 독립적인 플랫폼, 누구는 인터프리터 언어 등으로 부른다.
    • 자바를 얘기할 때 모두 위 얘기를 듣고 자바라는 것을 알 수 있다.
    • 객체 지향언어, 독립적인 플랫폼, 인터프리터 언어 등 모두 자바에 대한 참조이다.
  • 참조라는 개념을 제공하는 언어에서 참조를 사용할 때는 변수의 구체적인 메모리 주소를 얻을 수 없다.
  • 참조를 사용하면 데이터를 복사할 필요가 없기 때문에 포인터를 사용할 때와 동일한 효과를 얻을 수 있다.
  • 포인터는 메모리 주소를 추상화한 것이고, 참조는 포인터를 한 번 더 추상화한 것이라고 할 수 있다.

메모리 안에서 프로세스

  • 모든 프로세스 주소 공간에는 코드 영역, 데이터 영역, 힙 영역, 스택 영역이 있다.
    • 코드 영역, 데이터 영역: 실행 파일을 초기화 할 때 생성되는 영역
    • 힙 영역: 동적 메모리 할당에 사용
    • 스택 영역: 함수 호출에 사용되며 매개변수, 반환 주소, 레지스터 정보 등을 포함한 함수 실행 시 정보를 저장하는데 사용된다.
  • 가상 메모리와 물리 메모리 사이의 사상 관계만 유지하면 된다.
  • 이런 사상 관계를 유지하는 것을 페이지 테이블 이라고 하며, 각각의 프로세스에는 단 하나의 페이지 테이블만 있어야 한다. 모든 가상 주소를 물리 주소에 사상하는 대신 프로세스의 주소 공간을 동일한 크기의 조각으로 나누고 이 조각을 페이지라고 부른다.
  • 가상 주소 공간은 현실에 존재하지 않고 논리적인 표현이다. 이것이 최신 운영 체제에서 매우 중요한 기능인 가상 메모리의 기본 구현 원리다.