보글보글 개발일지
article thumbnail
반응형

프로세스 메모리 구조

Code(Text) 영역 : 읽기만 가능

  • 소스코드. 실행할 프로그램의 코드가 저장.
  • 수정 불가능한 기계어로 저장되어 있음
  • 코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정
  • 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다.

Data 영역: 읽고 쓰기 가능

  • 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
  • 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역
  • 전역변수, static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다.
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸
  • 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정
  • BSS영역: 초기화 되지 않은 변수가 0으로 초기화 되어 저장
  • Data영역: 0이아닌 다른 값으로 할당된 변수들이 저장

Stack 영역: 읽고 쓰기 가능

  • 함수의 호출과 관계되는 지역 변수와 매개변수, 함수가 저장되는 영역
  • Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
  • 원시타입의 데이터가 값과 함께 할당
  • Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
  • 컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없다.
  • 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생한다.

Heap 영역

  • 런타임에 크기가 결정되는 메모리 영역
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제
  • 참조형의 데이터의 값이 저장
  • 예를 들어 클래스가 이 부분에 해당
  • Heap은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당

질문

Stack과 Heap 공간에 대해, 접근 속도가 더 빠른 공간은 어디일까요?

스택이 훨씬 빠르다. 스택은 이미 할당되어 있는 공간을 사용하는 것이고, 힙은 사용자가 따로 할당해서 사용하는 공간
힙 할당: 요청된 chunk의 크기, 현재 메모리의 fagmentation 상황 등 다양한 요소를 고려하기 때문에 더 많은 CPU Instruction이 필요
스택 할당: 이미 생성되어 있는 스택에 대해 포인터 위치만 바꿔주는 단순한 CPU Instruction(덧셈, 뺄센 연산)
Stack 영역이 클수록 Heap 영역이 작아지고 Heap 영역이 클수록 Stack 영역이 작아진다.

다음과 같이 공간을 분할하는 이유가 있을까요?

최대한 데이터를 공유하여 메모리 사용량을 줄이기 위해서이다. 같은 Program의 Process일 경우 Code 부분을 공유(Share)하여 메모리 사용량을 줄이는 목적에서 코드 공간이 존재
반응형

'코딩기록 > CS' 카테고리의 다른 글

[OS] 프로세스 스케줄링 알고리즘  (1) 2023.03.13
[OS] 단기, 중기, 장기 스케줄러  (0) 2023.03.09
[OS] 프로세스  (0) 2023.03.08
[OS] 인터럽트  (0) 2023.03.08
[OS] 시스템 콜  (0) 2023.03.08
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!