컴퓨터가 가지고 있는 메모리의 자원은 매우 한정적이지만 실행해야할 프로세스와 불러들어야할 정보들은 많다.
그래서 주 기억 장치에서는 자주 페이징 교체가 일어난다.
이번 포스트는 페이징 교체 알고리즘이 아닌, 페이징 자체가 어떻게 동작하는지 알아보려고 한다.
CPU와 기억 장치 사이에는 MMU(Memory Management Unit)이라고 하는 장치가 있다.
이 장치 안에 존재하는 재배치 레지스터를 이용해 cpu가 요청하는 논리적 주소를 물리적 주소로 전환시켜준다.
이렇게 논리적 메모리 주소를 쓰게 된다면 이점이 생기게 되는데 그 중 하나가 '동적 적재'가 가능하다는 점이다.
이러한 동적 적재는 "프로그램 실행에 필요한 부분만 적재하는 것"이라는 의미를 가지고 있다.
프로그램 내에서 모든 부분이 다 사용되지는 않을 것이고, 그런 부분을 적재시키지 않고 필요한 부분만을 적재시킬 수 있도록 하는 것이다.
또한 '동적 연결' 이라는 것도 있는데, C 언어의 입출력에 관련된 기능에 경우 각각의 프로그램에 같은 기능이 메모리에 적재될 수 있고, 이를 방지하기 위해 하나의 라이브러리 루틴만 적재, 연결을 시킴으로써 메모리 낭비를 줄일 수 있다.
메모리 할당 방법
컴퓨터가 발전하면서 다중 프로그래밍 환경으로 바뀌고 이것은 메모리 안에 구분되는 영역이 생긴다는 의미다.
시간이 지날수록 메모리의 초기 상태와는 다르게 여러 프로세스가 적재되었다가 빠지기를 반복하면서 여러개의 작은 hole이 생길 수 있는데 이것으로 인해 메모리 낭비를 볼 수 있다. 이러한 현상을 '메모리 단편화' 라고 한다.
이러한 현상이 예방하거나 고치기 위해서는 각 프로세스 공간을 오밀조밀하게 다시 이동시키거나 해야 하지만 그러기에는 자원 낭비도 심할 뿐더러 실제로 가능하지 않은 방법이다.
하지만 이 것을 해결하기 위한 좋은 방법이 있는데 그것이 '페이징' 이다.
페이징
메모리안의 hole의 낭비를 방지하기 위해 메모리에 적재된 데이터를 옮기는 것은 너무 비효율적인 방식이었다.
그렇게 해서 나온 방법이 페이징이다. 페이징은 프로세스를 일정 크기로 잘라서 관리하는 방법인데 이 나눠진 것들을 '페이지'라고 부른다.
하지만 프로세스를 하나의 연속된 데이터로 만들기 위해 어쩔 수 없이 단편화가 일어났는데, 프로세스를 나눠버린다면 어떻게 이를 해결 할 수 있을까?
이는 MMU의 재배치 레지스터로 가능하게 만들 수 있다. MMU를 이용해 CPU가 요청하는 논리 주소를 실제 물리 주소로 바꾸어 데이터를 불러오는 것을 응용해 실제 프로세스를 페이지 단위로 나눠 각기 다른곳에 적재 시킨다고 하더라도 재배치 레지스터를 페이지마다 만들어 둔다면 CPU 입장에서는 이 것들이 하나의 연속된 과정으로 보이게 될 것이다.
MMU의 재배치 레지스터를 이용해 페이징을 구현하게 된다면, 메모리의 hole들의 발생을 최소화 시킬 수 있게 되고, 메모리 공간을 더욱 더 아낄 수 있게 되는 것이다.
레퍼런스 : copycode.tistory.com
'OS' 카테고리의 다른 글
[OS] 페이지 관리 방법 (0) | 2020.09.27 |
---|---|
[OS] CPU 스케쥴링 (0) | 2020.09.18 |
[OS] 데드락 - Deadlock (0) | 2020.09.18 |
[OS] 프로세스와 쓰레드 (0) | 2020.09.17 |
[OS] 리틀 엔디안, 빅 엔디안 (0) | 2020.09.16 |