PromleeBlog
sitemap
aboutMe

posting thumbnail
메인 메모리의 구조 1 - 하루 10분 운영체제 9일차
Main Memory Structure 1 - 10 Minutes of OS Day 9

📅

🚀

들어가기 전에 🔗

운영체제에서 메인 메모리는
프로세스가 실행되기 위해 반드시 필요한 공간
입니다. 우리가 어떤 프로그램을 실행하면 그 내용은 하드디스크에서 메인 메모리(RAM)로 올라오고, CPU는 이 메모리에 접근해 명령어를 처리합니다.
이번 글에서는 메인 메모리의 구조와 대표적인 메모리 할당 방식, 그리고 현대 CPU 아키텍처에 따른 메모리 구조까지 간단한 예시와 함께 알아보겠습니다.

🚀

메인 메모리란? 🔗

메인 메모리(Main Memory) 또는 RAM(Random Access Memory)은
프로그램이 실행되기 위해 일시적으로 저장되는 공간
입니다. 속도는 빠르지만 전원이 꺼지면 내용이 사라지며, 운영체제는 메모리를 효율적으로 분배하고 관리하는 기능을 담당합니다.

🚀

연속 메모리 할당 🔗

초기의 운영체제는 연속된 공간에 프로그램을 적재하는
연속 할당(Contiguous Allocation)
방식을 사용했습니다.
이 방식에는 다음과 같은 세 가지 전략이 있습니다:

최초 적합 (First Fit) 🔗

가장 먼저 발견한 적절한 빈 공간
에 배치합니다.

최적 적합 (Best Fit) 🔗

요청 크기보다 크면서 가장 크기가 근접한 공간
을 선택합니다.

최악 적합 (Worst Fit) 🔗

가장 큰 공간
에 배치하여, 나머지 공간을 크게 남기려는 전략입니다.

🚀

페이징(Paging) 🔗

현대 운영체제는 대부분
페이징(Paging)
방식을 사용합니다. 프로그램을 일정한 크기(페이지)로 나누고, 메모리 공간도 같은 크기의 프레임으로 나눈 뒤 매핑하는 방식입니다.
장점은 메모리를 연속적으로 배치하지 않아도 된다는 점이며, 조각화 문제를 어느 정도 해소할 수 있습니다.
페이징 구조도
페이징 구조도

🚀

페이지 테이블 구조 🔗

페이지 테이블은 페이징 시스템에서 가장 핵심이 되는 구조입니다.
가상 주소
물리 주소
로 변환하기 위한 일종의 주소책 같은 역할을 하죠.
쉽게 말해, 컴퓨터가 가상 주소라는 '별명'을 사용하면, 운영체제는 페이지 테이블을 참고해 진짜 물리 주소를 찾아주는 역할을 합니다.

왜 페이지 테이블이 필요한가요? 🔗

우리가 어떤 프로그램을 실행하면, 그 프로그램은 실제 메모리 주소가 아닌
가상의 주소
를 사용합니다. 이 가상 주소를 실제 메모리 주소로 바꿔주는 역할을 하는 것이 바로 페이지 테이블입니다.
예를 들어, 책에서 '1장 5페이지'를 읽으라고 하면, 진짜 물리적인 책의 123페이지일 수도 있잖아요? 마찬가지로, 프로그램이 요청한 주소(예: 0x04FF)는 실제 메모리의 다른 위치에 있을 수 있습니다. 이 연결을 기록해둔 지도가 페이지 테이블입니다.

페이지 테이블 항목 구성 🔗

페이지 테이블의 한 줄에는 다음과 같은 정보들이 들어 있습니다
항목설명
페이지 번호가상 주소의 몇 번째 페이지인지 표시합니다
프레임 번호실제 메모리의 어떤 블록(프레임)에 저장되었는지
유효 비트해당 페이지가 메모리에 있는지 (0이면 디스크에 있음)
접근 권한읽기 전용인지, 쓰기도 되는지 등을 결정
변경 비트이 페이지가 변경되었는지 (디스크에 다시 써야 하는지 여부)

가상 주소는 어떻게 나뉘나요? 🔗

가상 주소는 두 부분으로 나뉘게 됩니다:
  1. 페이지 번호 (Page Number)
    – 이 주소가 몇 번째 페이지에 있는지
  2. 오프셋 (Page Offset)
    – 해당 페이지 안에서 몇 번째 위치인지
마치 책에서 "5장 13번째 줄"을 찾는 것과 같아요.
➡️

예시: 가상 주소 0x04FF을 풀어보면? 🔗

실제 주소 변환 예시 🔗

페이지 테이블이 다음과 같다고 가정합시다:
페이지 번호프레임 번호
07
13
36
49
이 경우 0x04FF → 페이지 4 → 프레임 9 → 물리 주소 = 9 x 256 + 255 = 2559
👨‍💻
결론: 0x04FF는 실제 메모리의 2559번 주소를 의미합니다

🚀

다단계 페이지 테이블 🔗

운영체제는 큰 프로그램을 실행할 때, 너무 커서 한 번에 다 관리하기 어려운
페이지 테이블
을 나눠서 관리합니다. 이게 바로
다단계 페이지 테이블(Multi-level Page Table)
입니다.

왜 다단계로 나눌까요? 🔗

단일 페이지 테이블은 주소 공간이 크면 너무 커져서 메모리를 많이 차지합니다. 예를 들어:
→ 이걸 통째로 메모리에 올려놓는 건 부담이 됩니다.
그래서 필요한 것만
계층적으로 나눠서 부분적으로
메모리에 유지합니다.

아파트 단지 주소처럼 🔗

생각해보세요.
📮 "강남구 301동 2층 5호"라고 할 때,
→ 먼저 구, 다음에 동, 그 다음 층, 마지막에 호수를 찾죠.
다단계 페이지 테이블도 마찬가지입니다
  1. 상위 페이지 번호
    → 페이지 디렉터리에서 하위 테이블 찾기
  2. 하위 페이지 번호
    → 실제 페이지 테이블에서 프레임 정보 찾기
  3. 오프셋
    → 최종 주소 계산
➡️

예시 계산 🔗

필드비트 수의미
상위 인덱스10비트페이지 디렉터리 인덱스
하위 인덱스10비트실제 페이지 테이블 인덱스
페이지 오프셋12비트해당 페이지 안의 위치

주소 변환 흐름 🔗

  1. 가상 주소: 0x12345678
  2. 2진수로 변환: 0001 0010 0011 0100 0101 0110 0111 1000
  3. 상위 10비트: 0001001000 = 72 → 디렉터리 인덱스
  4. 중간 10비트: 1101000101 = 837 → 페이지 테이블 인덱스
  5. 하위 12비트: 011001111000 = 1656 → 오프셋
→ 페이지 디렉터리 72번 항목 → 페이지 테이블 837번 항목 → 프레임 번호 + 1656 → 최종 물리 주소

🚀

요약 🔗

이번 글에서는 메인 메모리의 기본 개념과 할당 방식, 페이지 테이블 구조에 대해 살펴봤습니다. 다음 글에서는 페이지 테이블 최적화 기법인 TLB와 스와핑 기법에 대해 알아보겠습니다.

참고 🔗