[운영체제] 프로세스 주소 공간

지니🧸·2023년 4월 7일
0

CS 저장소

목록 보기
4/48
post-custom-banner

🌷 프로세스 주소 공간

프로세스 주소공간: 프로세스가 메모를 할당받으면 자신만의 방법으로 메모리를 관리하기 위해 이 공간을 어떤 구조로 관리함

  • 메모리는 한정되어 있음 > 프로세스는 메모리 절약 시도
  • 영역:
    • Stack 영역:
      • 지역변수 & 매개변수 저장
      • 함수의 호출과 함께 할당 (컴파일 타임)
        • 함수 호출 완료시 소멸
      • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
      • 재귀 함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러 발생
    • Heap 영역:
      • 런타임에 크기가 결정됨
      • 사용자에 의해 공간이 동적으로 할당/해제됨
      • 주로 참조형 데이터 (클래스 등)이 할당됨
      • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
    • Data 영역:
      • 전역변수나 static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역
      • 어떤 프로그램에 전역/static 변수를 참조하는 코드가 존재하면 이 프로그램은 컴파일된 후에 data 영역을 참조하게 됨
      • 프로그램의 시작과 함께 할당.
        • 프로그램 종료시 소멸
    • Text(Code) 영역:
      • 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간
      • ReadOnly 상태로 저장: 프로그램 수정 방지
  • 최적화:
    • Data 영역의 공유: 각각의 스레드는 data 영역을 공유함 > 메모리 절약

🌷 BSS 영역

초기화 되지 않은 변수는 BSS 영역에 저장됨

Block Started by Symbel (BSS) 영역: 전역으로 선언된 초기화 되지 않은 데이터 영역

  • 컴파일타임에 메모리 할당
  • 크기 고정

🌷 Stack과 Heap의 크기

실제 객체는 Heap 영역에서 관리되기 때문에 Stack 영역의 크기는 클 필요 X

Stack 영역:

  • 생성과 동시에 크기가 정해짐 & 바뀌지 않음
  • Heap 영역과 상관없이 크기의 제한을 가짐

Heap 영역:

  • 런타임에 크기가 결정됨
  • 가변적 크기

🌷 Stack과 Heap에 대한 접근

Stack 공간:

  • 할당: 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주는 단순한 CPU instruction

Heap 공간:

  • 할당: 요청된 chunk의 크기, 현재 메모리의 fragmentation 등 다양한 요소를 고려하기 때문에 더 많은 CPU instruction 필요

Stack 공간이 더 빠름

🌷 공간 분할의 목적

  • 최대한 데이터를 공유하여 메모리 사용량을 줄임
  • Code는 같은 프로그램에서는 모두 같은 내용 > 따로 관리하여 공유
  • Stack/Data 영역 구분: 는 스택 구조의 특성과 전역변수의 활용성을 위해 나눔
  • Data/BSS 영역 구분:
    • 초기화되지 않은 변수: 프로그램이 실행될때 영역만 잡아주면 됨
      • 값을 프로그램에 저장하고 있을 필요 없음
    • 초기화된 변수: 영역 & 값 모두 프로그램에 저장하고 있어야 함
    • BSS 영역 변수들이 많아져도 프로그램의 실행코드 사이즈를 늘리지는 않음

🌷 스레드 주소 공간

각 스레드는 Stack 영역만 가지고 있음. 나머지 공간은 프로세스의 값과 함께 써서 다른 스레드와 공유함


참고:

profile
우당탕탕
post-custom-banner

0개의 댓글