컴퓨터 공학/알고리즘

👉 [CS] 메모리 관리, 페이징(Paging)

bitcodic 2021. 6. 3. 17:09

여러 프로세스를 사용하면, 같은 메모리 공간을 건드리는 경우도 있을텐데 그러면 문제가 발생할 것이다.

가령 남의 메모리 공간을 지워버린다거나.. 수정한다거나..

코드를 캡슐화하는 것과 조금 비슷한 고민이라고 생각한다.

 

Q. 어떻게 메인 메모리를 프로세스간에 공유할 수 있을까?

Q. 어떻게 각각의 메모리들을 보호할 수 있을까?

 

이와같은 물음에 대해 우리는 가상 메모리 개념을 도입한다.

가상 메모리(Virtual Memory)

가상 메모리는 physical memory의 주소값을 갖는 형태로, 프로세스별로 각각 독립된 가상 메모리 공간을 가지면 physical memory에 가상 메모리에 담긴 주소값으로 접근하는 것이다. Virtual Memory -> Physical Memery 로의 전환은 MMU(Memory-Management-Unit)이 담당하며, 런타임에 매핑된다

 

가상 메모리 구조도

base register(=relocation register)에서 시작해서 limit register까지의 공간을 정의한다

 

 

External Fragmentation (외부 단편화)

메모리 공간 내 hole 발생

문제는 이런식으로 프로세스 공간을 제공하다보면 release된 메모리들에게 hole이 발생하고, 이 부분을 채워주지 않는다면 메모리가 낭비된다. 위 그림의 경우 process 10의 공간이 hole보다 작았기에 쓸 수 있던 것이지, 만약 hole의 공간보다 메모리 영역이 컸다면 공간이 없다고 OS는 판단할 것이다.

 

이러한 Hole이 나타나는 것을 External Fragmentation 이라고 한다.

 

이를 해결하기 위해 Paging을 활용한다

 

 

 

 

Paging

페이징

페이징은 Virtual Memory는 같은 크기의 page로 분할하고, Physical Memory에는 같은 크기의 frame으로 잘게 나누는 것이다. 즉 기존의 방법은 연속적 공간을 가져갔다면, 이제는 Physical Memory의 비연속적인 공간을 가져가는 것이다. 띄엄띄엄!

 

단 페이지 테이블이 필요해진다. frame 별로 주소가 다 다르기 때문이다. 이 주소를 한번 더 mapping 하니까!

페이지 테이블

 

Internal Fragmentation - Paging의 문제 

 

Paging도 마찬가지로 fragmentation이 발생한다.

내부 단편화 예시

4KB의 page를 설정했고 process A가 5kb의 메모리 영역이 필요하다. 이때 page가 2개가 필요해진다. (4KB + 1KB) 문제는 1KB영역에 페이지는 3KB가 남아버린다.. 

 

즉 기존에는 "힝 ㅜㅠ.. 메모리가 있는데 할당을 못 해줘.." 였다면 지금은 "아씨, 메모리 할당해줬는데, page에 겁나 많이남네?" 가 되는 것이다.

 

역설적이게도 메모리를 레고처럼 착착 효율적으로 쌓고 싶었는데, 반대로 공간이 남아버리는 것이다.

 

 

Ttranslation Look-aside Buffer (TLB) - Paging 속도 저하 문제

 

Paging은 결국 두번의 search 과정을 거친다. 첫번째로 페이지 테이블, 여기서에 나온 주소를 가상 메모리에서 찾는 것 까지. 추가적인 작업이 필요해졌고, 너무 느려졌다.

 

따라서 TLB라는 캐시 메모리를 MMU와 함께 사용하여 속도 문제를 해결했다. 역시 캐시가 최고인가보다!