메모리란 프로그램과 프로그램 수행에 필요한 정보(프로세스의 코드, 데이터, 중간 결과, 상태 정보) 등을 저장하는 장치를 말한다.
- 주기억장치: RAM이라고도 하며, 프로세서(흔히 CPU)가 실제로 접근하여 데이터를 읽고 쓸 수 있음.
- 보조기억장치: HDD, SDD 등 데이터의 영구 저장을 담당
프로그램은 메인 메모리인 RAM에 올려서 실행된다. 즉 프로세스가 실행되기 위해서는 메인 메모리가 충분한 공간을 가지고 있어야 한다. 물리적 메모리는 한정적이기 때문에, 메모리의 크기보다 큰 프로세스의 경우 메모리가 부족하게 되는 경우가 있다.
오버레이 방식으로 문제를 극복하고자 하였으나, 이러한 방법들은 단일프로그래밍(하나의 프로세스만 동작) 환경에서 사용하는 방법. 즉 다중 프로그래밍 환경에서는 적합하지 않다.
가상 메모리 기법은 하나의 프로그램을 실행하는데, 얼마나 많은 메모리를 실행하는데 집중하는 것이 아닌, 실행하는데 최소한 얼마만큼의 메모리가 필요한지에 집중한다.
단 오버레이와 스왑은 가상 메모리 방식의 기초가 되는 아이디어다. 오버레이는 프로그램을 쪼개어 필요한 모듈을 먼저 메모리에 할당하는 방식을 말하며, 다음 모듈을 실행하기 위해 이전 모듈 위에 다음 모듈을 덮어 씌운다. 스왑(스와핑)은 프로그램 전체를 주기억장치에 할당하여 사용하다. 필요에 따라 다른 프로그램과 교체하는 기법을 의미한다.
가상 메모리는 보조기억장치의 일부(Swap area)를 주기억장치처럼 사용하여 메인 메모리의 용량을 더 커보이게 만드는 기법이다. 프로그램이 실행되면, 사용되는 기법(페이징, 세그멘테이션)에 따라 작게 나누어, 가상 주소(논리 주소)를 생성하고, 실행되는 부분만 메모리에 적재시킨다. 실행이 되지 않은 조각들은 보조기억장치에 저장된다. 이러한 조각들은 블록 단위로 처리된다.
- 물리적 주소 : 실제로 RAM에 올라가는 위치, 하드웨어에서 직접 접근 가능한 주소이다.
- 논리적 주소 : 가상 주소라고도 하며, CPU가 생성하는 주소이다. 프로세스마다 독립적으로 가지는 주소 공간이기 때문에 프로세스의 내부에서 사용하고, 각 프로세스마다 0부터 시작.
- 가상 메모리 공간 : 프로세스가 메모리를 바라보는 논리적 관점
인위적 영속성이란 가상공간의 연속적 주소가 실제 물리적인 공간에서 연속일 필요가 없다는 것. 사상 테이블을 통해 논리적 주소(가상 주소)를 통해 물리적 주소를 알 수 있음.
가상 메모리 방식에서는 프로세스를 실행시킬 떄, CPU가 가상 메모리 주소를 사용하고, 해당 데이터를 읽고 쓸 때는 해당하는 물리 메모리 주소로 접근하여 실행한다. 즉 가상 주소를 물리적 주소로 변환하는 과정이 필요한데, 이것을 MMU가 담당한다.
MMU : CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품
블록 사상이란 블록 단위로 처리(byte나 word 단위는 주소 사상 테이블 유지를 위한 정보량이 커짐)
블록이란 가상 메모리의 분할 단위로, 블록의 크기가 일정하면 페이지, 블록화 방법을 페이징 기법이라고 하며, 블록의 크기가 다른 경우(논리적인 내용을 기반으로 나눔) 세그먼트라고 하며 세그먼테이션 기법이라고 한다.
사상이란 매핑(Mapping)이라고도 하며, 가상 주소를 실제 물리적 주소로 변환하는 과정을 의미한다.
요구페이징은 프로세스가 실행되는 동안, 필요한 페이지만 메인 메모리에 올리고, 필요하지 않은 페이지는 디스크에 저장하여 메인 메모리를 절약하는 방법이다. 요구 페이징은 필요한 페이지만 메모리에 적재하기 때문에, 메모리에 효율성이 높아지게 되고, 실행속도도 개선된다.(오버헤드가 발생하지 않기 때문)
페이지 교체 알고리즘
FIFO: 가장 먼저 메모리에 올라온 페이지를 가장 먼저 내보넴. 구현은 간단하지만 성능이 구림
OPT : 앞으로 가장 오랫동안 사용하지 않을 페이지를 교체
LRU : 가장 오랫동안 사용하지 않은 페이지를 교체, 많은 운영체제가 채택하는 알고리즘
LFU : 참조횟수가 가장 적은 페이지를 교체, 여러 개라면 가장 오랫동안 사용하지 않은 페이지 교체
MFU : LFU와 반대로 가장 참조횟수가 많은 페이지를 교체하는 알고리즘.
https://code-lab1.tistory.com/60
프로세스의 주소 공간을 여러 개의 논리적 세그먼트로 나누어서 사용하는 방식이다.
페이징과 마찬가지로 mapping을 위한 세그먼트 테이블이 필요하다. 또한 크기가 다양하기 때문에, limit라는 offset이 존재한다. 세그먼트 크기는 가변적이기 떄문에, 외부 단편화가 발생할 수 있다.
https://slidesplayer.org/slide/11177640/
https://velog.io/@adam2/OS%EA%B8%B0%EC%B4%88%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC%EC%A3%BC%EC%86%8C-%EB%B0%94%EC%9D%B8%EB%94%A9
https://superohinsung.tistory.com/127
https://code-lab1.tistory.com/60
https://cocoon1787.tistory.com/860