메모리란? https://www.youtube.com/embed/dgMeWRy84l8
(이 동영상이 제일 직관적으로 알기 쉬움)
물리 메모리 크기의 한계를 극복하기 위해 나온 기술
→ 물리 메모리보다 큰 프로세스를 수행하기 위해 사용
→ ? 뭔소리야 🤔, 100MB 메모리 크기에서 200MB 크기의 프로세스를 어떻게 돌려
가상 메모리의 핵심은 필요한 부분만 메모리에 적재(부분적재)하는 것!
→ 프로세스를 실행할 때, 실행에 필요한 부분만 메모리에 올린다 (적재 여부를 페이지테이블에 표시)
실행될 가능성이 낮은 코드 (ex) 오류 처리 코드 등), 과도하게 크게 선언된 데이터 영역(ex) 행렬, 리스트 및 테이블은 실재로 필요한 크기 이상으로 프로그램에서 선언되어 할당됨), 프로그램의 옵션 부분을 처리하느 코드 등은 굳이 메모리에 적재될 필요가 없다!
⇒ Locality of Reference 성질: 프로그램의 어느 한 특정 작은 부분만 한동안 집중적으로 참조하는 현상 (Principle of Locality)
⇒ 한정된 크기의 실제 메모리를 효율적으로 사용하는 방법 필요
→ 프로세스의 일부분은 페이지 단위 또는 세그먼트 단위지만 현재는 대부분 페이지 단위 사용 (세그먼트 기법 & 페이지 기법)
현재 필요한 페이지만 메모리에 올리는 것을 요구페이징이라고 한다.
⇒ 페이징과 스와핑을 합쳐놓은 형태라고 생각하면 쉽다. 메모리를 페이지 단위로 나누어 페이지 테이블을 통해 물리 메모리에 맵핑을 하는데, 필요한 페이지만을 스와핑을 통해 메모리에 올리고 나머지는 하드디스크에 두는 방식이다.
🤓 page table: A는 4번에 있고, C는 6번에 있고, F는 9번에있어~
→ valid-invalid bit로 알 수 있음.
유효/무효 비트(Valid-invalid bit)란? 현재 메모리에 페이지가 있는지 없는지를 나타내는 비트 (있다면 1, 없다면 0)
오염비트(dirty bit, modify bit): 페이지 대치 시 디스크로 다시 출력 (write back) 필요 여부 판정 필요, 페이지 적재 후 변경 유무를 표시
(페이징 기법: 컴퓨터가 메인 메모리에서 사용하기 위해 2차 기억 장치(보조 기억 장치)로부터 데이터를 저장하고 검색하는 메모리 관리 기법이다)
1) 특정 페이지를 실행하기 위해 페이지 테이블을 참조하여 메모리가 올라와있는지 여부를 확인 (valid-invalid bit 확인)
2) 페이지가 메모리에 올라와 있지 않은 경우 (page fault, invalid인 경우) MMU가 인터럽트를 발생시킴 (🤔 NMU: 아 잠깐 이페이지없는데?)
3, 4) 운영체제는 해당 프로세스를 wait 상태로 만들고 요구된 페이지를 하드디스크에서 찾아 메모리의 자유프레임(free frame)(빈공간)에 적재
5) 페이지 테이블 갱신 (i → v)
6) 트랩에 의해 중단되었던 명령을 다시 수행: wait상태인 해당 프로세스를 다시 ready → running 하여 작업 재진행
가상 메모리를 만드는 방법은 대표적으로 두 가지(요구 페이징, 요구 세그먼트)가 존재하지만, 대부분 요구 페이징을 사용하므로 가상 메모리와 요구 페이징을 같은 용어로 사용하는 경우가 많다.
그럼 물리 메모리가 다 차면 어떡하지? 🤷♀️