메모리의 동작

Jongwon·2021년 11월 28일
0

Linux Programming

목록 보기
5/25

프로세스의 모든 데이터는 메모리에 적재되어있고 메모리로의 접근은 가상 주소를 통해 이루어진다.

프로세스 수행 이미지

가상 메모리에 코드, 데이터, 힙, 스택 영역이 구성되는 것


메모리의 주소공간은 여러 세그먼트로 분할된다. 모든 제이터는 자신의 수명동안 유일한 주소를 가진다.

  • Code: 프로그램 로직이 들어간 바이너리가 저장(0,1로 구성된 코드)
    • 여러개 함수가 호출된다면, Code부분에 2개의 메모리 주소가 있고, 각각이 다른 함수 가리킴

int main(void) {printf("Hello") ...}에서 "Hello"는 데이터고, 나머지 부분만 코드에 2진수로 저장됨
main 실행 -> printf 함수 호출 후 뒷부분 stack에 저장 -> printf에서 "Hello"데이터 호출 -> 실행 종료 후 main으로 돌아옴

  • Data: 데이터가 저장되는 공간
    Data 영역에 저장되는 데이터의 종류는 전역변수, static변수, 문자열이 있다

    • BSS: 초기화되지 않은 데이터 저장
      초기화되지 않은 데이터는 메모리 영역만 잡고있다

    • Initialized Data: 초기화된 데이터 저장

      BSS와 초기화 데이터를 구분하는 이유
      BSS에는 실행파일에 데이터 크기만큼의 메모리를 잡아야한다는 정보만있고 실제로 배정하진 않음. 따라서 컴파일 시에는 실행파일의 크기를 줄일 수 있다.
      => 하지만 실제 실행 시에는 자동 초기화되어 메모리 배정받음.

  • Heap: 동적 할당 메모리공간
    malloc(), calloc()을 통해 할당

  • Stack: 지역변수 등 임시로 사용하는 데이터가 저장, 큰 주소부터 작은 주소로 채워가며 사용
    지역변수, 함수의 매개변수, 함수 반환값, 함수 복귀 주소 저장

    • Heap vs Stack
      Heap은 주소를 점점 키워가며 채우고, Stack은 큰 주소부터 점점 줄이며 채워가는데, 둘 사이는 매우 커서 만날 일이 없지만, 만나게 된다면 프로세스가 죽음.

메모리의 입출력

메모리의 입출력은 워드단위이다. 워드란 컴퓨터에서 한번에 처리할 수 있는 크기로, short와 int가 같이 있는 구조체여도, short뒤의 남은 2바이트를 dummy로 제공하여 워드 단위로 정렬하도록 한다.
-fpack-struct를 제공하면 dummy를 넣지 않고 메모리를 배정한다.

profile
Backend Engineer

0개의 댓글