메모리 관리 배경
프로그램은 반드시 메모리로 불러와야 실행할 수 있다!
💡CPU가 직접 접근할 수 있는 유일한 저장 공간
= Main Memory , registers
Register → 1 CPU clock (or less) 에 접근 가능 (굉장히 빠른 저장 공간)
Main memory → many cycles (*memory stall : main memory에 접근 하는 메모리 멈춤 시간)
중간에 cache(register 보다는 느리고, main memory 보다는 빠름!!)를 사용함으로써
메모리 접근 시간을 줄일 수 있다!! ( = 메모리 효율을 높일 수 있다!!)
💡 보조 기억장치(하드디스크) → 주 기억장치(메모리) → CPU
프로세스는 독립적인 메모리 공간(Stack, Data, Code, Heap)을 가지며,
PCB는 ReadyQueue("메모리")에 등록 되고, 스케줄러에 의한 CPU 할당을 기다린다.
프로세스는 CPU에 할당되기 전 메모리에 잔류하며, 주 기억장치(메모리)를 꼭 거친다.
따라서 중간 다리 역할을 하며, 터미널같은 존재인 메모리를 잘 관리하지 못하면
한정된 자원을 비효율적으로 사용해 성능이 저하될 수 있다.
이러한 이유로 메모리 관리가 필요하게 되었으며, 메모리 관리 전략에는
Swapping, Paging, Segmentation 등이 존재한다.
메모리 관리 전략
Swapping
- 메모리에 할당된 프로세스를 일시적으로 디스크로 옮겨놓고, 그 자리에 다른 프로세스를 올리는 방식
- 메모리 공간 부족으로 인한 문제를 해결할 수 있음
크게 두가지 경우에 발생
1. 메모리에 현재 실행 중인 프로세스들을 모두 담지 못할 때
2. CPU를 점유하고 있지만 입출력 등의 작업으로 인해 대기해야 할 때
(즉, CPU 할당 시간이 끝난 프로세스 뿐 아니라 실행 중인 프로세스를 디스크로 옮기는 경우도 존재)
* 보조기억장치(secondary storage,Backing storage)
💡 프로세스 단위로 스와핑을 하면 비효율적이기 때문에 현재는 사용하지 않음 !
💡 Swapping과 VMM(Virtual Memory Management) 차이점
Swapping: 프로세스 단위로 Swap in, Swap out
가상 메모리: 프로세스 일부(페이지 단위)를 Swap in, Swap out
Paging
- 하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없앤 메모리 관리 기법
- 물리 메모리는 Frame 이라는 고정된 크기로 분리되어 있고,
논리 메모리(프로세스가 점유하는)는 페이지라는 고정된 크기의 블록으로 분리됨
💡
외부 단편화와 압축 작업을 해소 하기 위해 생긴 방법론이지만, 내부 단편화 문제의 비중 증가
( 페이지 크기와 프로세스의 크기가 다르면, 빈 공간이 발생 )
Segmentation
- 페이징처럼 메모리를 같은 크기로 나누는것이 아닌 서로 다른 크기의 논리적 단위인 Segment로 분할
- 세그먼트 번호 + offset 으로 주소 표현 (물리적 메모리에도 세그먼트 번호 + offset으로 매핑되어 저장)
*Physical Memory : 메인 메모리 (CPU에서 직접 접근 가능한 메모리)
💡 Paging과 마찬가지로 세그먼트의 크기가 다르면 내부 단편화 문제 발생
💡 가변적인 크기라는 단점이 있어 여러번의 Swapping이 일어나면 외부 단편화 문제 발생
💡세그먼트-페이지(segment-page) 방식
* 세그먼트 방식과 페이징 방식의 장점을 결합한 것으로,
세그먼트에서 발생하는 외부 단편화, 페이징에서 발생하는 내부 단편를 모두 해결 가능
* Segmentation당 페이지 테이블을 유지하면서
논리 주소를 Segment 번호 + Page 번호의 조합으로 변환하여 물리 주소를 얻어냄
* 가상 메모리를 구현하는 기법 중 하나
* 매핑 테이블을 두 번 거쳐야하므로 매핑 속도가 상대적으로 느려질 수 있지만,
가상 메모리의 개념을 도입하여 물리 메모리가 부족한 경우에도 프로세스를 실행 가능.
* 때문에 대부분의 최신 운영 체제에서는 세그먼트-페이지 방식을 사용하고 있음
(매핑 테이블의 크기가 커지는 경우 세그먼트와 페이지 크기를 조정함으로써 문제를 해결 가능)
Fragmentation
메모리 공간이 충분함에도 불구하고 프로세스가 메모리에 적재되지 못해 메모리가 낭비되는 현상
프로세스들이 메모리에 적재되고 제거되는 일이 반복될 때 생기는
프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼에 작은 자유공간
내부 단편화 ( Internal Fragment )
: 할당 받은 영역 중 사용하지 않은 공간으로 인해 공간이 낭비되는것
외부 단편화 ( External Fragment )
: 메모리의 여유 공간이 분산되어 있어(Scattered Holes) 실제로 사용할 수 없는 경우
* 동적 메모리 할당 해제를 자주하는 경우 발생
압축
- 외부 단편화를 해소하기 위한 방법으로 Scattered Holes을 모으는 방법
- 메모리에 적재된 프로세스를 정지시키고 한쪽으로 이동시키는 작업이 필요해 비효율적
- Scattered Holes를 어느 자유공간을 기준으로 모을지 결정하는 알고리즘 또한 모호
* 현재는 사용 x , 가상 메모리와 같은 메모리 관리 전략이 사용됨!!
💡Address Binding
논리적 주소를 실제 물리적 주소로 변환하는 과정
(CPU가 논리적 주소만으로는 실제 메모리의 주소를 알 수 없기 때문에)
TLB (Translation Look-aside Buffer)
- 메모리 주소 변환을 위한 별도의 캐시 메모리
- page table에서 빈번히 참조되는 일부 엔트리를 caching 하고 있음
- CPU는 page table 보다 TLB를 우선 참조하여 frame #를 얻음!! (TLB에 없는 경우, page table 참조)
💡 원하는 엔트리가 TLB에 존재하는지 알기 위해선 TLB 전체를 탐색해야 하는 단점 존재
하지만, parallel search가 가능하므로 탐색하는 시간이 적음
💡 TLB의 성능을 높이고 싶은 경우, page의 크기를 키우면 됨!
Page Table 구조
Multi-level paging
Hashed Page Table
Inverted Page Table
'CS > 운영체제' 카테고리의 다른 글
가상 메모리(Virtual Memory) (0) | 2023.04.30 |
---|---|
DeadLock (교착 상태) (0) | 2023.01.12 |
프로세스 동기화 (Synchronization) (0) | 2022.12.28 |
CPU Scheduling (0) | 2022.12.01 |
프로세스와 스레드 (0) | 2022.11.30 |