Open longlivedrgn opened 5 months ago
Level of Indirection
Abstraction for memory
Protection
의 문제
Transparency
Efficiency
즉 주요 차이점은?!…
프로그램이 혼자 메모리를 사용하는 것처럼 메모리를 가상화한 것이다.
물리적으로 정해진 메모리 안에서 더 많은 프로세스를 동시에 실행시키기 위해 등장한 개념이다.
가상 메모리 시스템에서는 실제 RAM 용량을 초과하는 메모리 요구를 충족시키기 위해 하드 디스크 드라이브(HDD)와 같은 보조 저장 장치를 사용해 추가적인 메모리 공간을 제공한다.
연속 메모리 관리
연속 메모리 관리 유형
불연속 메모리 관리
불연속 메모리 관리 유형
MMU(Memory Management Unit): 가상 메모리 주소를 물리 주소값으로 변환해주는 하드웨어 장치이다.
프로세스마다 각각 가상 메모리 공간이 할당된다.
페이지 3
(30~39)의 0번째 위치에 있다.페이지 3
을 찾는다.페이지 3
은 프레임 1
에 존재한다.프레임 1
의 0번째 위치에 접근한다. 이 주소가 가상 메모리 30번지의 물리 주소이다.크기 | 문제 | |
---|---|---|
페이징 | 고정 | 내부 단편화 발생 |
세그먼테이션 | 가변 | 외부 단편화 발생 |
두가지 관점에서 설명을 할 수 있을 것 같은데요. 하나는 운영체제 개발자의 관점이고, 하나는 응용 소프트웨어 개발자의 관점입니다. 먼저 운영체제 개발자의 관점에서, 운영체제의 가장 큰 책임은 자원을 관리하는 것입니다. 누가 어떤 하드웨어를 점유하게 할 것인지, 얼만큼의 시간을 줄 것인지, 이러한 절차를 어떻게 보다 효율적으로 처리할 것인지 등 다양한 고민이 필요합니다. 이러한 고민들 중 특히 눈여겨 볼만한 것은 저희가 메인메모리라고 부르는 영역에 대한 고민입니다. 굉장히 한정적이고, 자주 사용할 수 밖에 없는 영역인데요. 특히 요즈음에는 거의 모든 컴퓨터가 동일한 순간에 여러개의 프로그램을 돌리는 편이라는 걸 고려하면, 고민이 더욱 깊어질 수 밖에 없습니다. 당장 생각나는 것은 어떤 주소를 누가 소유할 것인지, 엑세스에 대한 우선순위를 어떻게 가져갈 것인지, 이러한 소유권과 우선순위의 불균형을 어떻게 조절할 것인지, 서로의 영역에 대한 침범은 어떻게 막을 것인지 등이 있을 것 같은데요. 이러한 문제점들은 첫번째로는 운영체제가 각 응용 소프트웨어의 명세를 알지 못하기에 발생하는 문제(지금의 경우에는 특히 메모리에 대한)이고, 두번째로는 운영체제와 응용 소프트웨어간의 약속이 없기 때문에 발생하는 문제입니다. 즉 각 응용 소프트웨어가 어떤 하드웨어를 얼만큼 사용할 것인지에 대한 약속을 만들어놓는다면, 운영체제는 해당 프로그램이 실행이 될 경우 자원을 어떻게 처리할 것인지를 보다 쉽게 구조화할 수 있습니다. 가상메모리는 이러한 관점에서 운영체제가 보다 손쉽게 자원을 관리할 수 있도록 하는 약속이라고 할 수 있습니다.
한편 응용 소프트웨어 개발자의 관점에서는, 하드웨어의 필요성이 분명함에도 불구하고, 다양한 하드웨어들의 동작원리를 아주 세세하게 파악하고 조정하고 제어하는 것은 굉장히 까다롭고 어려운 일입니다. 특히 메모리를 사용함에 있어서 특정 주소를 사용하고자 하는데, 만약 다른 프로세스가 해당 주소를 미리 점유했다면 어떻게 해야할까요? 이를 모두 파악하고 방어하는 로직을 작성하는 건, 개발자의 본래 목적에서 많이 돌아가는 길이 될 것입니다. 나아가 메인메모리가 어느 제조사의 것인지, 몇개인지, 어느 정도의 크기를 가지고 있는지 파악을 해야한다면, 저라면 개발 못할 것 같네요. 이러한 맥락에서 응용 소프트웨어 개발자는 가상메모리를 통해 사용할 메모리 영역을 어느 정도 계산하고, 구조화하고, 또 해당 메모리에 대한 소유권이 온전히 나에게 있다는 전제를 깔게 됩니다. 이를 통해 물리메모리에 대한 제어를 신경쓰지 않고도 앱을 개발하고 비즈니스를 실현할 수 있게 도와줍니다.
제 문장으로 정리한다면, 프로세스가 갖는 가상메모리와 컴퓨터의 물리메모리에 대한 맵핑이라고 정리할 수 있을 것 같은데요. 가상메모리를 일정한 크기를 갖는 페이지로 분리하고, 물리메모리를 페이지 프레임으로 분리한 뒤, 페이지 테이블을 통해 맵핑을 하게 됩니다. 이 때 필요한 것들만 적재하게 되는데, 물리메모리가 가상메모리에 맞추어 구조화 되므로 물리메모리에 낭비가 발생할 수 있습니다. 예를 들어,
123456789 123456789 123456789
위와 같이 메모리를 사용중인 상황에서, 아주 사소한 작업을 위해 1이 적재가 되어야할 수 있습니다. 하지만 페이지는 일정한 크기를 가지므로 위와 같은 형태에서는 1XXXXXXXX
이 적재가 되어야 합니다. 즉 만약 맨앞에 것을 날리고 적재가 된다면,
1XXXXXXXX 123456789 123456789
이 되는데 8칸이 비어있지만 9칸이 하나의 페이지이므로 다른 페이지가 이를 점유할 수 없게 되어 물리메모리에 낭비가 발생하게 됩니다.
먼저 공통점을 나열하면서 세그먼테이션을 정리하고, 이후에 차이점을 이야기하면 좋을 것 같습니다. 세그먼테이션과 페이징의 공통점은 일정한 영역으로 가상메모리가 분리가 된다는 것입니다. 또 테이블을 통해 가상메모리가 물리메모리로 맵핑이 됩니다. 차이점은 가상메모리는 고정된 크기의 페이지가 아니라 서로 다른 크기의 세그먼트로 분리가 됩니다. 이 설명만으로는 페이징의 문제점을 극복할 수 있을 것 같지만, 실제로는 그렇지 않습니다. 세그먼트가 하나의 단위로 메모리에 적재되어야 하기 때문에 페이징과 같은 문제점을 공유합니다. 오히려 세그먼트 단위로 물리메모리에 적재되어야 한다는 점에서 페이징 기법보다 물리메모리를 낭비할 수 있습니다. 예를 들면 작은 세그먼트들이 띄엄띄엄 적재된 경우 페이징 기법에서 보다 많은 단위를 물리메모리에서 내려야할 수 있습니다.