가상메모리(virtual memory)
=> 램과 하드디스크를 하나의 추상화된 메모리 영역으로 제공한다.
가상메모리는 왜 태어났는가?
- 예전 도스시절 하나의 프로그램만 실행시키던 그 때 프로그램이 메모리를 사용하다가 프로그램이 죽는경우 이 메모리를 회수시킬 방법이 없어 결국 OS를 재시작하게 되는 문제로부터 시작되었다고 한다..
- 즉, 프로세스가 운영체제(시스템) 전체에 문제가 나는것을 막기 위해
- 프로세스의가 사용하는 공간을 가상세계로 범위를 제한시켜 애플리케이션이 죽어도 OS는 살아남는다. (시스템 안정성을 위해)
가상메모리 사용하면 가장 좋은점
- OS가 프로그램에게 가상메모리 영역을 할당하기 때문에 프로그램이 뻗어도 OS가 해당 프로그램의 주소위치를 알기 때문에 자원을 회수할 수 있어 메모리의 낭비가 없고, 프로그램이 죽어도 OS에 영향이 없다.
프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법, 가상 메모리 기법을 통해 사용자 프로그램이 물리적 메모리보다 커져도 실행이 가능하도록 만듭니다. 가상메모리는 실제의 물리 메모리 개념과 사용자 관점의 논리 메모리를 분리한 것입니다. 그래서 사용자가 메모리 크기에 관련한 문제를 염려하지 않아도 됩니다.
운영체제는 가상 메모리 기법을 통해 프로그램의 논리적주소 영역에서 필요한 부분만 물리적 메모리에 적재하고, 직접적으로 필요하지 않은메모리 공간은 디스크에 저장하게 됩니다.
그러면 필요한 부분만 어떻게 물리적 메모리에 적재를 할까요? 아래를 확인하시면 됩니다!
요구페이징(demand paging)
필요한 부분만 물리적 메모리에 page단위로 적재하는 방법을 요구 페이징 이라고 합니다. 요구 페이징 기법에서는 특정 page에 대해 cpu요청이 들어온 후에 해당 page를 메모리에 적재합니다. 그렇기 때문에 당장 필요한 page만을 메모리에 적재하기 때문에 메모리 사용량이 감소하고, 프로세스 전체를 메모링 적재하는 입출력 오버헤드도 감소하는 장점이 있습니다.
요구 페이징 기법에서는 *유효/무효 비트(valid/invalid bit)를 두어 각 page가 메모리에 존재하는지 표시하게 됩니다.
*유효/무효 비트 : 해당 비트가 유효하면 메모리에 있음을 의미하고, 무효하면 메모리에 없음을 의미합니다.
* Page fault
CPU가 무효비트로 표시된 page에 엑세스하는 상황을 page fault라고 합니다.
페이지 부재를 처리하는 과정
- CPU가 특정 페이지를 접근하여 페이지 테이블에서 무효 상태인지 아닌지 확인을 합니다.
- 페이지가 무효 상태일 경우 *MMU에서 Page fault trap이 발생합니다.
- 디스크에서 해당 페이지를 빈 프레임에 적재하고 페이지 테이블을 업데이트 합니다. (무효 -> 유효)
- 트랩에 의해 중단되었던 명령을 다시 수행합니다.
*MMU : 가상 주소를 물리 메모리 주소로 변환해주는 하드웨어 장치
*Page 교체 알고리즘(replacement algorithm)
page fault가 발생하면, 요쳥된 page를 디스크에서 메모리로 가져옵니다. 이 때 물리적 메모리 공간이 부족한 상황이 발생할 수 있습니다.
이럴 때 메모리에 올라와 있는 page를 디스크로 옮겨서 메모리 공간을 확보해야 합니다. 이를 페이지 교체라고 하고, 어떤 page를 교체할지 결정하는 방법은 Page 교체 알고리즘에 따라 달라집니다.
이 교체 알고리즘은 최대한 page fault가 적게 일어나도록 도와줘야 합니다. 그래서 앞으로 사용될 일이 적은 page를 선택하여 교체하는 것이 성능을 향상시킬 수 있습니다.
그러면 교체 알고리즘에는 어떤 종류가 있을까요?
알고리즘 | 설명 |
OPT(Optimal) | 앞으로 가장 오랫동안 사용하지 않을 page를 찾아 교체한다. 하지만 실제로 구현하기 거의 불가능한 알고리즘 이다. |
FIFO(First in First Out) | 메모리에 올라온지 가장 오래된 page를 교체하는 알고리즘. |
LRU(Least Recently Used) | 가장 오랫동안 사용하지 않은 page를 교체하는 알고리즘. |
LFU(Least Frequently Used) | 가장 참조횟수가 적은 page를 교체하는 알고리즘. |
[참고]
'CS' 카테고리의 다른 글
GSLB(Global Server Load Balancing) (0) | 2022.06.11 |
---|---|
트랜젝션(Transaction) (0) | 2022.05.03 |
교착상태(DeadLock) (0) | 2022.04.22 |
스레드와 멀티스레드 (Thread & Multi Thread) (0) | 2022.04.18 |
멀티 프로세스(Multi process), Context 와 Context Switching (0) | 2022.04.14 |