메모리 구조 알아보기
Memory(RAM:Random Access Memory): 컴퓨터가 켜지는 순간부터 CPU는 연산을 시작하고, 동작에 필요한 모든 내용이 전원이 유지되는 내내 이 기억장치에 저장된다. '주기억장치'로 분류된다. 프로그램 메
jh-keem.tistory.com
메모리 구조에 대해 알아볼 때, 가상메모리와 이를 운영체제에서 관리하는 것에 대해 언급했습니다.
운영체제가 메모리를 관리하는 전략에 어떤 것들이 있는지 알아보도록 합니다.
(이 내용은 정보처리기사에서도 다루어지니, 알고있으면 도움이 될 것 같습니다.)
1. 메모리 관리가 필요한 이유 ?
2. 메모리 관리 방법
1. 메모리 관리가 필요한 이유 ?
컴퓨터 시스템에서, 메모리는 모든 작업의 중심입니다. 메모리 구조에서 이야기했듯 동작에 필요한 모든 내용이 전원이 유지되는 내내 메모리에 기억됩니다.
- 리소스 제한 문제 해결: 메모리는 컴퓨터 사양에 따라 한정된 자원입니다. 따라서 이 제한된 메모리를 여러 프로세스에 적절히 나누어 할당해야 합니다.
- 다중 프로세스 지원: 동시에 여러 프로그램이 안정적으로 실행될 수 있도록, 각 프로그램이 자신의 메모리 공간에서 안전하게 작업되어야 합니다.
- 효율적 자원 활용: 유휴 상태의 메모리를 최소화하고, 메모리 사용을 최적화 하여 시스템 성능을 극대화 합니다.
- 안정성 및 보안: 한 프로세스가 다른 프로세스의 메모리에 접근할 수 없게 만들어, 시스템 안정성과 보안을 유지합니다.(온라인 게임에서 메모리 핵이라고 불리는 것들이 이를 침범하는 기술인 것 같습니다.)
2. 메모리 관리 방법
[운영체제가 맡는 역할]
운영체제는 다음과 같은 주요 역할을 통해 메모리를 관리합니다.
- 메모리 할당 및 해제
- 프로세스가 실행될 때 필요한 메모리를 할당하고, 작업이 끝나면 메모리를 해제합니다.
(JVM이 하는 GC와 비슷한 기능일까 ?)
- 프로세스가 실행될 때 필요한 메모리를 할당하고, 작업이 끝나면 메모리를 해제합니다.
- 주소 변환 (Address Translation)
- 프로세스는 논리 주소(Logical Address)를 사용하지만, 실제 메모리는 물리 주소(Physical Address)로 접근됩니다. 운영체제는 이 변환을 수행합니다.
(정보처리기사 설명에서는 메모리 관리 장치(NMU)에 의해 논리-물리 주소가 변환된다고 설명하고 있습니다.)
메모리 관리 장치(Wikipedia)
- 프로세스는 논리 주소(Logical Address)를 사용하지만, 실제 메모리는 물리 주소(Physical Address)로 접근됩니다. 운영체제는 이 변환을 수행합니다.
- 메모리 보호 (Memory Protection)
- 프로세스가 허용되지 않은 메모리 공간에 접근하지 못하도록 보호 장치를 제공합니다.
- 가상 메모리 지원
- 실제 메모리보다 더 많은 메모리를 사용하는 것처럼 보이게 만들어, 메모리의 효율성을 극대화합니다.
- 메모리 단편화 관리
- 메모리 사용 중 발생하는 내부 단편화와 외부 단편화를 최소화하여 효율적으로 메모리를 사용합니다.
메모리 단편화란 ?
: 메모리 공간이 효율적으로 사용되지 않아 낭비되는 현상을 말합니다. 메모리에 프로세스가 요구하는 공간보다 더 큰 공간이 할당되어 빈 공간이 발생하거나(내부단편화), 이런 사용되지않는 공간들이 흩어져있어 다른 하나의 큰 메모리 블록을 할당하지 못하게 되는 현상(외부단편화)을 말합니다.
동적 메모리 할당이 잘못되거나, 프로세스가 종료되거나 스왑되는 도중에 메모리 공간이 분리되며 발생하거나, 고정된 크기의 메모리블록으 사용해 요청 크기보다 큰 메모리가 할당되는 경우 발생합니다.
아래 관리기법에서 어떻게 해결하는지 알아봅니다.
⭐[메모리 관리 기법]⭐
메모리 관리는 반입(WHEN), 배치(WHERE), 할당(HOW), 교체(WHO) 크게 네가지 방법으로 이루어집니다.
1. 반입기법: 주 기억장치에 적재할 다음 프로세스의 반입시기를 결정합니다.
- 요구 반입 기법: 다음 프로세스가 참조 요구가 있는 경우 적재하는 기법.
- 예상 반입 기법: 시스템 요구를 예측해 미리 메모리에 적재하는 방법.
2. 배치 기법: 어느 위치에 저장할지를 결정합니다.
- 최초 적합: 가용 공간 중 첫번째 분할에 할당합니다.
- 최적 적합: 가장 크기가 비슷한 곳을 선택해 적재합니다.
- 최악 적합: 가장 큰 공간에 할당합니다.
3. 할당 기법: 어떤 방법으로 할당할 것인지 결정합니다.
- 연속 할당 기법: 주 기억장치 공간 내에 인접되게 연속 저장하는 방법
- 단일 분할 할당: 하나의 프로세스가 전체 메모리를 차지하는 방식입니다. 메모리를 운영체제-사용자 두 영역으로 나눕니다, 한 번에 하나의 프로세스만 실행 가능합니다. (오버레이: 메모리에 필요한 코드만 적재하는 기법, 스와핑: 메모리에 올라간 프로세스를 디스크로 내리고, 다른 프로세스를 올림)
→ 단, 이 기법들은 초기 컴퓨팅 환경에서 유용했으나, 멀티 태스킹 및 고도화된 메모리 관리가 요구되는 현대 시스템에서는 일반적으로 잘 사용되지 않는 고전적인 방법들. - 다중 분할 할당: 메모리를 여러 개의 고정 크기 블록으로 나누고, 각 프로세스는 해당 블록 중 하나를 차지합니다.
(고정 분할 할당, 동적 분할 기법 등이 있으나 역시 현대 시스템에서는 자주 사용되지 않습니다.)
- 단일 분할 할당: 하나의 프로세스가 전체 메모리를 차지하는 방식입니다. 메모리를 운영체제-사용자 두 영역으로 나눕니다, 한 번에 하나의 프로세스만 실행 가능합니다. (오버레이: 메모리에 필요한 코드만 적재하는 기법, 스와핑: 메모리에 올라간 프로세스를 디스크로 내리고, 다른 프로세스를 올림)
왜 연속 할당 기법은 잘 사용되지 않을까요? 앞서 설명한 단편화문제와 더불어 메모리 효율성이 떨어져 현대 시스템에서 요구되는 멀티태스킹과 대규모 프로세스 실행에 적합하지 않고 고정 분할 방식은 비효율적인데 동적 분할 방식은 관리비용이 커서, 현대 시스템에서는 더 발전된 형태인 페이징(Paging), 세그멘테이션(Segmentation) 그리고 가상 메모리(Virtual Memory)와 같은 기법들이 현대 운영체제에서 주로 사용됩니다.
- 분산 할당 기법: 하나의 프로세스를 여러개의 조각으로 나누어 공간 내에 분산 배치하는 기법
- 페이징 기법: 가상 메모리와 물리 메모리를 동일한 크기의 고정 블록(페이지)로 나눕니다.
- 페이지(Page): 프로세스가 사용하는 가상 메모리의 고정 크기 블록.
- 프레임(Frame): 실제 물리 메모리의 고정 크기 블록
- [장점]
- 외부 단편화 방지: 프로세스가 실행되면, 필요한 페이지를 물리 메모리의 프레임에 적재하여 실행합니다(페이지와 프레임의 크기가 동일하므로, 외부 단편화 문제를 방지할 수 있습니다.)
- 다중 프로세스 처리 가능: 여러 프로세스의 페이지가 서로 다른 프레임에 할당될 수 있으므로, 다중 프로세스 처리가 가능합니다.
- 공유 메모리 구현: 여러 프로세스가 동일한 페이지를 공유할 수 있습니다.(예:운영체제 코드나 라이브러리를 여러 프로세스에서 공유함)
- 유연한 메모리 관리: 프로세스 전체를 비연속적으로 적재해도 실행이 가능하며, 필요한 페이지만 로드해 유연한 메모리 관리가 가능합니다.
- [단점]
- 내부 단편화 발생: 페이지 크기와 프로세스가 요청한 크기가 정확히 일치하지 않는 경우 페이지 내부에서 공간 낭비가 발생하는 내부 단편화가 발생할 수 있습니다.
- 주소 변환 비용 발생: 주소 변환 과정에서 페이지 테이블을 참조해야 하므로, 추가적인 하드웨어 지원이 필요합니다.
- 속도 저하: 페이지 부재(Page Fault)발생 시, 디스크에서 메모리를 로드하는 데 시간이 걸립니다.
- 하드웨어 비용 증가: TLB와 같은 주소변환을 위한 하드웨어 혹은 페이지 테이블 저장을 위한 메모리 등 하드웨어 비용이 추가될 수 있습니다.
- 세그먼테이션 기법: 페이징 기법은 페이지(동일 크기의 조각)으로 나누었다면, 세그먼테이션 기법은 가변 크기의 블록으로 나누고 메모리를 할당합니다.
- 세그먼트(Segment): 기능적 또는 논리적 단위(코드, 데이터, 스택 등 흔히 메모리 구조라고 이야기하면 나뉘는 구조가 세그먼테이션 기법을 기반으로 나뉜 메모리 구조입니다.) 각 세그먼트는 크기가 다를 수 있으며, 프로세스의 논리적 구조를 반영합니다.
- 가변적인 데이터 구조와 모듈 처리가 가능한 장점이 있으나, 외부 단편화가 발생하는 단점이 있습니다.
- 이 기법을 사용할 때, 프로세스의 가상 메모리 주소는 세그먼트 번호와 변위로 표현됩니다.
- 페이징 기법: 가상 메모리와 물리 메모리를 동일한 크기의 고정 블록(페이지)로 나눕니다.
⭐그렇다면, Java 사용시 System.out.println(String객체)로 출력되는 메모리 주소는 세그먼트 번호와 변위인가 ?
NO ! 메모리 구조 알아보기 게시글을 참조해보면, Java 프로그래밍 언어는 JVM이 JVM만의 메모리 구조에 따라 메모리를 관리하므로 JVM이 관리하는 내부 메모리 구조에 따라 생성된 정보(추상적 참조 값)이다~
| 특징 | 페이징(Paing) | 세그멘테이션(Segmentation) |
| 분할 기준 | 고정 크기의 페이지로 나눔 | 논리적 단위(코드, 데이터 등)로 나눔 |
| 주소 구성 | 페이지 번호 + 변위 | 세그먼트 번호 + 변위 |
| 단편화 문제 | 내부 단편화 발생 | 외부 단편화 발생 |
| 메모리 보호 | 페이지 크기로 보호 | 세그먼트 경계로 보호 |
| 공유 메모리 | 특정 페이지를 공유 | 특정 세그먼트를 공유 |
| 주소 변환 비용 | 상대적으로 간단 | 비교적 복잡 |
[현대 시스템에서의 세그멘테이션]
현대 운영체제에서는 페이징과 세그멘테이션을 결합한 형태로 사용한다.
- 세그먼트-페이징(Segmented Paging)
- 세그먼트를 나누고, 각 세그먼트를 다시 페이지로 분할.
- 세그멘테이션의 논리적 구조와 페이징의 단편화 해결을 결합한 방식.
4. 페이지 교체 기법: 페이징 기법을 사용할 때, 어떤 프로세스를 제거할 것인지 결정합니다.
- FIFO(First In, First Out: 선입선출)
- 페이지가 적재된 순서대로 가장 오래된 페이지를 교체합니다. (먼저 들어온 놈이 먼저 나간다.)
- LRU(Least Recently Used)
- 가장 오랫동안 사용되지 않은 페이지를 교체합니다.
- LFU(Least Frequently Used)
- 참조 횟수가 가장 적은 페이지를 교체합니다.
- OPT(Optimal Algorithm)
- 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체합니다.
- 이론적으로 가장 적은 페이지 교체 횟수를 보장하지만, 미래를 알 수 없기 때문에 실제 구현 불가능.
- NUR(Not Used Recently)
- 최근에 사용되지 않은 페이지를 교체합니다.
- SCR(Second-Chance Replacement, Colck Algorithm)
- FIFO를 기반으로 하되, 참조 비트를 활용해 자주 사용된 페이지의 교체를 방지합니다.
[페이지 부재: Page Fault]
프로세스가 참조하려는 페이지가 물리 메모리(프레임)에 없는 경우 발생하는 이벤트입니다.
즉, 필요한 페이지가 디스크에 저장되어 있고, 메모리에 적재되지 않은 상황에서 발생합니다.
정보처리기사에서 굉장히 자주 나오는 문제가 페이지 부재 횟수를 적는것입니다.
페이지 참조 순서: A, B, C, A, D, B, C, E, A
프레임 크기: 3
페이지 부재 횟수는 !? (LRU 기법을 기준으로)
총 프레임 부재 발생 횟수 8번
메모리 관리방법에 대해 익숙해지셨다면, 다음은 프로세스 스케줄링에 대해서도 알아볼 만 합니다^^
프로세스 스케줄링 알아보기 →
(추가)
그렇다면... 메모리 관리까지 직접 해야된다고 이야기하는 프로그래밍언어.. C++을 사용하는 경우, 개발자가 이런 메모리 관리 기법까지 작성해서 SW를 개발하는걸까 ??

'Computer Science' 카테고리의 다른 글
| 확장자명은 무슨 역할을 하나 ? (1) | 2025.02.18 |
|---|---|
| 정적 콘텐츠를 파일로 저장하기 ? vs Base64 방식으로 저장하기 ? (4) | 2025.02.07 |
| Linux 권한설정 알아보기 (6) | 2025.01.16 |
| 메모리 구조 알아보기 (6) | 2025.01.09 |
| 컴파일러(Compiler)와 인터프리터(Interpreter) 알아보기 (4) | 2025.01.07 |