[운영체제] 주소 공간과 가상 메모리(Address Space, Virtual Memory)

2024. 2. 24. 23:07·공부/운영체제

주소 공간과 가상 메모리

주소 공간 (가상 주소 공간, VAS, Virtual Address Space)

의미

  • 각 프로세스 당 주어지는 논리적인 공간
  • OS가 프로세스를 시작할 때 할당해주는 가상 메모리 공간
  • 프로세스에서 사용 가능한 주소의 범위
  • 프로세스가 참조하는 주소
  • OS가 제공하는 가짜 메모리
  • 크기는 물리 메모리(RAM)의 크기와는 독립적
  • 레지스터 크기에 종속적
  • 운영체제는 프로세스에게 연속된 가상 주소 공간을 제공하고, 이를 필요한 크기의 물리 메모리 페이지로 매핑
  • 메모리 공간의 낭비를 최소화

제공 메모리

  1. 32bit 시스템
    • 보통 4GB 크기의 가상 메모리 영역을 할당
    • 보통 하위 2GB를 유저 공간에, 상위 2GB는 시스템 공간에 사용
    • 하지만 사용자에 의해 유저 공간을 3GB로 늘릴 수 있음(/set increaseuserva)
    • VAS 범위 : 0x00000000 ~ 0x7FFFFFFF
  2. 64bit 시스템
    • 이론적으로는 16EB의 가상 메모리 영역을 할당 받을 수 있지만 너무 크고 비효율적이여서 128TB 정도로 제한함
    • VAS 범위 : 0x000’00000000 ~ 0x7FFF’FFFFFFF

구조

  1. 사용자 영역
    • 우리가 보통 사용하는 일반 응용 프로그램들이 사용하는 공간
  2. 커널 영역
    • 단일 공간
    • kernel-mode를 사용하는 모든 프로세스에서 공유됨
    • 커널 영역은 공유되면서 시스템 운영에 필수적이기 때문에 주로 페이지 파일보다는 RAM에 존재
  • code 영역 :
    • 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간
    • 프로그램이 수정되면 안 되므로 ReadOnly 상태로 저장
    • 기계어 (코드를 컴파일하여 기계어로 만들고 디스어셈블을 하여 어셈블리어로 바꾸어 - code 영역에 넣음(instruction))
  • data 영역 :
    • 전역변수, static 변수의 할당의 위해 존재하는 공간
    • 어떤 프로그램에 전역/static 변수를 참조하는 코드가 존재한다면, 이 프로그램은 컴파일 된 후에 data 영역을 참조
    • 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸
    • 초기화 되지 않은 변수가 존재한다면 BSS 영역에 저장
  • heap 영역 :
    • 프로그래머의 동적 할당을 위해 존재하는 공간
    • 런타임에 크기가 결정되는 영역
    • 사용자에 의해 공간이 동적으로 할당 및 해제
    • 주로 참조형 데이터 (ex. 클래스) 등의 데이터가 할당
    • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
  • stack 영역 :
    • 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 공간
    • Stack 영역의 값은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸

물리 주소

  • 실제 메모리의 주소
  • 하드웨어에서 직접 접근 가능한 주소
  • 시스템 전체적으로 공유되는 주소
  • 여러 프로세스가 공유 메모리 영역을 사용할 때 사용
  • 프로세스가 물리 주소로 접근하려면, 물리 주소를 가르키고 있는 가상 주소를 물리 주소로 변환해야 함

가상 메모리

의미

  • 가상 메모리(Virtual Memory)는 운영체제에서 실제 물리 메모리(RAM)보다 큰 주소 공간을 프로세스에 제공하기 위해 사용되는 기술
  • 프로세스를 실행할 때 실행에 필요한 일부만 메모리에 로드하고 나머지는 디스크에 두는 것
  • 사용자에게 논리적 메모리와 물리적 메모리를 분리하여 인식하도록 함
  • 이러한 분리는 적은 양의 물리적 메모리만 사용 가능할 때에도 프로그래머에게 대용량의 가상 메모리를 제공할 수 있음
  • 프로그래머들은 개발 중 사용 가능한 물리적 메모리의 양을 더 이상 고려하지 않아도 되기 때문에 개발을 더 쉽게 진행할 수 있게 됨
  • CPU는 TLB, MMU 를 사용하여 가상 메모리 주소에 접근
  • Paging 또는 Segmentation 을 사용

특징

  • 메인 메모리를 하드 디스크의 캐시로 처리하여 더 넓은 메모리 공간을 제공하여 임시 데이터를 하드 디스크 드라이브에 저장하고 필요에 따라 기본 메모리로 가져올 수도 있음
  • 메모리 크기의 제약으로부터 자유로워졌고 사용자 프로그램이 실행에 필요한 최소 크기의 메모리만 올라가져 있기 때문에 더 많은 프로그램을 동시 수행 가능
  • 추가 권한 비트를 사용하여 각 프로세스에 메모리에 대한 제한된 액세스 권한을 부여하여 메모리를 보호
  • OS는 권한 비트를 확인하여 한 프로세스가 다른 프로세스의 메모리 공간을 손상시키지 않도록 할 수 있음

요구 페이징 (Demand Paging)

  • 필요한 부분만 요청이 있을 때 물리적 메모리에 페이지 단위로 적재하는 방법
  • 특정 페이지에 대해 CPU 요청이 들어오면 해당 page를 메모리에 적재

'공부 > 운영체제' 카테고리의 다른 글

[운영체제] PCB와 Context Switching  (0) 2024.02.24
[운영체제] 시스템 콜(System Call)  (0) 2024.02.24
[운영체제] 인터럽트(Interrupt)  (0) 2024.02.24
[운영체제] CPU 스케줄링 알고리즘  (0) 2024.02.24
[운영체제] 프로세스와 스레드  (0) 2024.02.20
'공부/운영체제' 카테고리의 다른 글
  • [운영체제] PCB와 Context Switching
  • [운영체제] 시스템 콜(System Call)
  • [운영체제] 인터럽트(Interrupt)
  • [운영체제] CPU 스케줄링 알고리즘
2월2
2월2
  • 2월2
    서벅돌의 성장일기
    2월2
  • 전체
    오늘
    어제
    • 분류 전체보기 (118) N
      • TIL (2) N
      • Server (27) N
        • spring (6)
        • node.js (16)
        • 기타 (5) N
      • 공부 (75)
        • 깃&깃허브 (3)
        • 파이썬 (17)
        • 유니티 (4)
        • 자료구조 | 알고리즘 (15)
        • 자바 (3)
        • 운영체제 (8)
        • 안드로이드 (16)
        • AI와 데이터 (9)
      • 대외활동 (12)
        • NPC 동아리 (1)
        • UMC 동아리 (11)
      • 대학교 (1)
        • 교직 (1)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글 관리
  • 링크

  • 공지사항

    • Notice
  • 인기 글

  • 태그

    java
    파이썬
    Unity
    루아
    C
    mysql
    Lua
    Python
    코틀린
    자바
    Android
    kotlin
    안드로이드
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
2월2
[운영체제] 주소 공간과 가상 메모리(Address Space, Virtual Memory)
상단으로

티스토리툴바