inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[인프런 워밍업 클럽 스터디 3기] CS - 3주차 발자국

한선규
0

이번 주차에 가상 메모리를 배우며 정말 흥미를 느꼈습니다.

사람들이 주어진 메모리 안에서 최대한 활용하기 위해 엄청 노력하여 만들어낸 여러 기술들을 보며 재밌게 공부한 한 주 였습니다.

 

메모리의 종류와 주소 체계

1. 메모리의 종류

컴퓨터에서 사용되는 주요 메모리는 다음과 같이 구분된다.

1.1 레지스터 (Register)

1.2 캐시 메모리 (Cache Memory)

1.3 메인메모리 (RAM, Random Access Memory)

1.4 보조 저장장치 (HDD, SSD)


2. 메모리와 주소 체계

운영체제는 메모리를 효과적으로 관리하기 위해 1바이트 단위로 구역을 나누고 각 구역에 **주소(Address)**를 부여한다.

2.1 32비트 vs 64비트 CPU

2.2 물리 주소와 논리 주소

2.3 절대 주소 vs 상대 주소

2.4 메모리 주소 변환 예시

  1. 사용자가 논리 주소 0x100의 데이터를 요청

  2. CPU가 메모리 관리자에게 0x100번지 데이터를 요청

  3. 메모리 관리자는 **재배치 레지스터 값(예: 0x4000)**을 더해 **절대 주소 0x4100*의 데이터를 가져옴

  4. 프로그램 시작 주소가 변경되더라도 재배치 레지스터 값만 수정하면 됨

메모리 할당 방식

과거 유니프로그래밍 환경에서는 메모리보다 큰 프로그램을 실행할 때 필요한 부분만 메모리에 올리고, 나머지는 하드디스크에 저장하는 메모리 오버레이 기법을 사용했다. 이를 통해 큰 프로그램을 여러 조각으로 나누어 일부만 실행하며, 나머지는 하드디스크의 스왑 영역에 저장했다.

현대의 멀티프로그래밍 환경에서는 메모리 할당 방식이 **가변 분할 방식(세그멘테이션)**과 **고정 분할 방식(페이징)**으로 나뉜다.


1. 가변 분할 방식 (세그멘테이션)

장점

단점


2. 고정 분할 방식 (페이징)

장점

단점


메모리 단편화 문제와 해결 방법

외부 단편화

내부 단편화


버디 시스템

예시

  1. 2048B(2^11)의 메모리가 있음

  2. 500B 크기의 프로세스 A가 메모리를 요청

  3. 512B(2^9) 크기의 블록을 할당

이처럼 프로세스 크기에 맞게 할당되며, 불필요한 공간 낭비를 줄일 수 있음.


현대의 메모리 관리 방식

현재는 가변 분할(세그멘테이션)과 고정 분할(페이징) 방식을 조합하여 사용한다.

이를 통해 내부·외부 단편화 문제를 최소화하면서도 효율적인 메모리 활용이 가능하다.

가상 메모리 정리

운영체제나 프로세스가 4GB 메모리 환경에서 동작하도록 설계되었다면, 그보다 적은 메모리에서는 실행되지 않는 문제가 발생할 수 있음.

가상 메모리(Virtual Memory) 를 사용하면 이 문제를 해결 가능.


가상 메모리 개념


가상 메모리의 동작 방식

운영체제를 포함하여 총 4GB 용량의 프로세스들이 실행되는 경우를 가정하면:

  1. 필요한 메모리보다 물리 메모리가 부족할 수 있음.

  2. 가상 메모리 시스템은 사용하지 않는 일부 데이터를 하드디스크의 스왑 영역으로 이동함.

  3. 실행이 필요할 때 해당 데이터를 다시 물리 메모리로 불러와 실행모든 프로세스가 실행 가능.

📌 동적 주소 변환 (Dynamic Address Translation)


메모리 관리자의 역할

메모리 관리자는 다음과 같은 복잡한 문제를 처리함.


가상 메모리 시스템의 할당 방식

운영체제는 자신의 영역을 제외한 나머지 메모리일정한 크기로 나누어 프로세스에 할당함.

📌 메모리 분할 방식:

  1. 고정 분할 (Fixed Partitioning)

  2. 가변 분할 (Variable Partitioning)

  3. 세그멘테이션 (Segmentation)

  4. 페이징 (Paging)

각각의 단점을 보완하기 위해 세그멘테이션-페이징 혼합 기법도 사용함.


가상 주소와 물리 주소 매핑

📌 2강: 세그멘테이션 정리

🔹 세그멘테이션 개념

🔹 논리 주소 vs 물리 주소

🔹 MMU의 논리 주소 → 물리 주소 변환 과정

1⃣ 세그먼트 테이블(Segment Table) 조회

세그먼트 번호 Base Address (기본 주소) Bound Address (크기) 0 1500 500 1 5200 1000 2 3700 1200 3 6400 500

2⃣ 논리 주소 검증

3⃣ 물리 주소 변환


🔹 예제: MMU의 주소 변환 과정

예제 요청:

scss
복사편집
MMU야! 세그먼트 1번에서 0x632(= 1586) 번지 요청!

변환 과정:

  1. 세그먼트 테이블에서 1번 세그먼트 확인

    • Base Address = 5200

    • Bound Address = 1000

  2. 논리 주소(0x632)가 Bound(1000)보다 작은지 확인

    • 0x632 (1586) < 1000 정상

  3. 물리 주소 변환

    • Base Address + 논리 주소 = 5200 + 1586 = 0x5832 (물리 주소)

3강 📌 페이징 정리

1. 페이징의 개념

2. 페이징의 특징

고정 크기의 페이지이므로 외부 단편화는 발생하지 않음

하지만 페이지 크기보다 작은 데이터는 내부 단편화를 유발

논리 주소와 물리 주소 변환을 위해 페이지 테이블(Page Table) 사용


📌 페이징의 동작 원리

1) 논리 주소와 물리 주소 변환

📌 변환 과정

  1. CPU가 논리 주소를 생성

  2. 페이지 번호를 이용해 페이지 테이블에서 프레임 번호를 찾음

  3. 해당 프레임 시작 주소에 오프셋을 더해 물리 주소 생성

💡 예제

계산 항목 값 페이지 번호 논리 주소 / 페이지 크기 = 0x1000 / 0x1000000 = 0 오프셋 논리 주소 % 페이지 크기 = 0x1000 % 0x1000000 = 0x1000

📌 페이지 테이블 예시

인덱스 (페이지 번호) 프레임 번호 0 3 1 1 2 Invalid … …

📌 물리 주소 계산


📌 페이징 vs 세그멘테이션 비교

구분 페이징 세그멘테이션 메모리 할당 방식 고정 크기로 나눔 논리적 영역(코드, 데이터, 스택 등)으로 나눔 단편화 내부 단편화 발생(페이지 크기보다 작은 데이터) 외부 단편화 발생(세그먼트 크기만큼 연속된 공간 필요) 크기 조정 모든 페이지 크기가 동일(Bound Address 필요 없음) 세그먼트마다 크기 다름(Bound Address 필요) 공유 및 권한 관리 제한적 (페이지 단위로 공유 어려움) 세그먼트 단위로 공유 및 권한 관리 가능 주소 변환 방식 페이지 테이블 사용 (1차원 배열 구조) 세그먼트 테이블 사용 (크기 가변적)


📌 페이징의 단점: 페이지 테이블 크기 관리

📌 정리

페이징의 핵심은 효율적인 메모리 관리를 위해 페이지 크기와 페이지 테이블 크기를 적절히 조정하는 것! 🚀

4강: 페이지드 세그멘테이션

1. 개요

페이지드 세그멘테이션은 세그멘테이션과 페이징의 장점을 결합한 메모리 관리 기법이다.


2. 메모리 접근 권한

운영체제는 특정 메모리 번지에 대해 읽기(Read), 쓰기(Write), 실행(Execute) 세 가지 권한을 설정할 수 있다.

프로세스의 주요 메모리 영역과 권한

메모리 영역 설명 권한 CODE 프로그램 실행 코드 읽기(R), 실행(X) (수정 불가) DATA 전역 변수, 상수 읽기(R), 쓰기(W) 가능 여부 결정 STACK & HEAP 동적 할당된 데이터 읽기(R), 쓰기(W) 가능

메모리 접근 권한은 가상 주소를 물리 주소로 변환할 때마다 검사되며, 위반 시 프로세스가 강제 종료(error) 된다.


3. 페이지드 세그멘테이션 구조

페이지드 세그멘테이션에서는 기존 세그멘테이션 테이블을 확장하여 권한 비트, 페이지 번호, 페이지 개수를 포함한다.

세그멘테이션 테이블

세그먼트 번호 권한 비트 페이지 번호 페이지 개수 0 RW 2 500 1 RE 0 1000 2 R 1 1200 3 RWE n 500

페이지 테이블

인덱스 프레임 번호 0 3 1 1 2 Invalid 3 …


4. 가상 주소 변환 과정

가상 주소 예시: 0x12300 번지 접근

  1. 세그먼트 번호 확인

    • MMU Table을 확인 → 0x12300번지는 세그먼트 1에 속함

    • 세그먼트 1의 정보를 세그멘테이션 테이블에서 가져옴

  2. 메모리 접근 권한 검사

    • 세그먼트 1의 권한: RE(읽기/실행)

    • 만약 쓰기(W) 요청이라면 → 권한 위반 (Error: 프로세스 종료)

    • 읽기/실행 요청이라면 → 다음 단계 진행

  3. 페이지 테이블에서 프레임 번호 확인

    • 세그먼트 1의 페이지 번호를 사용해 페이지 테이블을 참조

    • 예: 페이지 테이블에서 프레임 3을 찾음

  4. 물리 주소 변환

    • 프레임 3에서 페이지 개수(1000)를 더해 최종 물리 주소 계산

  5. 스왑 처리 (필요한 경우)

    • 만약 해당 프레임이 물리 메모리에 없다면 → 디스크(스왑 영역)에서 가져와 메모리에 적재


5. 페이지드 세그멘테이션의 단점

이러한 단점 때문에 현대 운영체제는 페이징과 페이지드 세그멘테이션을 적절히 조합하여 사용한다. 🚀

답변 0