Memory Allocation

delma·2020년 2월 20일
0

CS

목록 보기
2/3
post-thumbnail

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다.


Memory Allocation

  • Static memory allocation
  • Dynamic memory allocation

메모리를 사용할 때 프로그래머가 코드를 어떻게 짜는지에 달려있다.
static / dynamic 중 되도록 dynamic으로 하는게 좋다

Different areas of memory allocated

Code segment

  • 실행할 프로그램의 코드가 저장되는 영역
  • 이 텍스트를 기반으로 실행 가능한 명령이 있는 object file을 만든다
  • CPU는 코드영역에 저장된 명령어를 하나씩 가져가서 처리
  • 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다

Data segement

  • 초기화된 변수를 포함한다
  • 프로그램의 전역변수와 정적(static) 변수, 상수 저장 영역
  • 프로그램 시작시 할당되고 프로그램이 종료될때까지 사라지지 않는다
  • 런타임시에 data segment의 사이즈는 바뀌지 않는다

Bss segment

  • 초기화되지 않은 전역변수, 정적(static) 변수 저장 영역(0으로 초기화된)
  • 런타임시에 Bss segment의 사이즈는 바뀌지 않는다
  • 이 세그먼트는 오브젝트 파일에서 실제 공간을 차지하지는 않고, 초기화되지 않은 변수의 갯수만 들어간다

초기화된 값과 초기화되지 않은 값을 구분한 이유????

  • 오브젝트 코드(컴파일된 소스코드) 안에 Bss segment를 넣지 않기 위해서
    => 값이 초기화되지 않았으니, 컴파일 시 오브젝트 코드 안에 그 값을 넣지 않기 위해서 구분해준 것.
    초기화된 값은 초기값이 있어서 컴파일 시 오브젝트 코드 안에 들어가게 된다. 반면, 초기화되지 않은 값은 오브젝트 파일 안에 들어가지 않아야 한다. 초기화되지 않은 변수의 갯수만 들어가고, 실행될 때 그 영역을 차지하게 됨.

Stack Memory

처음 시작할때 사이즈가 지정되지 않음. 실행하는 중에 계속해서 사이즈가 변한다.

  • 함수의 호출과 관계되는 지역변수, 매개변수,함수가 복귀해야하는 주솟값 저장
  • 지역변수, 매개변수 등이 할당되고 해제되면서 스택의 사이즈가 변하게 됨
  • 함수 호출 시 할당. 호출 완료시 소멸
  • 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러 발생

Heap Memory

사용자에 의해 동적으로 할당되고 런타임시에 크기 결정된다

  • 동적으로 할당받았으므로 다 쓰면 반납해야 한다
  • 메모리가 정상적으로 반납되지 않으면 메모리 누수가 일어날 수 있다
  • 동적 메모리 할당을 요구했는데, 할당해 줄 메모리 공간이 없는 경우 할당이 실패할 수도 있음
  • 사용자가 직접 관리해야 하는 메모리 영역
  • 스택보다 할당할 수 있는 메모리 공간이 많다는 것이 장점이지만 포인터로 메모리 영역을 접근해야 하기 때문에 다른 자료구조에 비해서 데이터를 읽고 쓰는게 느림

Reference

profile
🌐Code makes world better

0개의 댓글