Virtual Memory
Virtual Memory(가상 메모리)
메인 메모리인 램과 보조 기억 장치의 조합으로
실제 메인 메모리보다 더 큰 메모리가 있는 것처럼 표현하는 기술
-
각 프로세스의 가상 메모리 공간은 개념상 ‘연속된 공간’에 존재하지만
실제로는 물리 메모리(Ram)에 산재하여 존재하거나
보조 기억 장치에 존재
(HDD,SSD) -
이러한 방식을 통해 OS는 다음과 같은 역할 수행 가능
- 메인 메모리 보다 더 큰 파일의 실행
- 다른 프로세스와 같이 실행하는 ‘멀티태스킹’
- 각 프로세스의 영역을 격리 가능(보호와 고립)
- 메인 메모리 보다 더 큰 파일의 실행
페이징 기법
이런식으로 ‘프로세스’를 조각내어 일정 크기만큼 저장하는 방식을
페이징 기법이라 함
- 이런식으로 메인 메모리를 꽉 채워서 사용하기에
‘외부 단편화’ 문제를 해결하는 데 유용함
-
- 외부 단편화?
- 메모리 내의 여유 공간이 ‘작은 조각’으로 나누어져 있어서
‘총 여유 메모리’는 충분하지만, 한번에 할당할 수 있는 양은 부족함
- 외부 단편화?
-
- 내부 단편화?
- 할당된 메모리 공간이 실제로 사용 중인 데이터 보다 큰 상태
‘사용되지 않는 할당 메모리 공간’이 있어, 낭비됨
- 내부 단편화?
- 단편화의 해결법
- 압축 : 메모리 공간을 재배치 하여, 분산된 공간을 하나로 합침
- 통합 : 단편화로 인해 분산된 메모리를 ‘인접’한 것끼리 통합
- 압축 : 메모리 공간을 재배치 하여, 분산된 공간을 하나로 합침
-
- 이런식으로 프로세스를 조각내기에
필요할 때만 가져오는 것(Demanding Page)이 가져함
- 전체 로딩할 필요가 없으므로 필요할때만 로딩
- 실제 코드만 실행할 때, Page Fault를 발생시켜
필요한 데이터만 메인 메모리에 올림
(Lazy Loading)
-> 메모리 사용 효율 극대화!
- 전체 로딩할 필요가 없으므로 필요할때만 로딩
-
- 세그멘테이션(Segmentation) 기법?
- 꼭 필요한 만큼의 데이터를 할당받기에 ‘내부 단편화’를 해결했지만
일정한 크기가 아닌 상태로 할당과 해제를 반복하기에
외부 단편화가 발생함
- 가상 메모리 할당에 주로 사용
- 세그멘테이션(Segmentation) 기법?
두 기법의 비교표
주소 변환 과정과 데이터 로딩
이런식으로 ‘외부 단편화’를 예방하기 위해
각 프로세스는 실제 메인 메모리에 쪼개져 있거나
보조 기억 장치에서 로딩하지 않은 상황
이러한 경우에도 CPU가 문제없이 프로세스들을 동작시키기 위해
사용하는 개념들이 존재!
-
- MMU(Memory Management Unit)
- 가상 주소 <-> 물리 주소 변환을 담당하는 하드웨어 장치
- 내부에 TLB(Translation Lookaside buffer)라는 캐시를 두어
최근 변환한 주소를 저장하여, 캐시 히트시 빠른 처리를 가능하게 함 - 일일이 PageTable을 참고하는 것은
매번 메인 메모리까지 내려갔다 와야 하기에 꽤나 느린 작업이기에
이러한 캐시를 두어 성능을 향상 시킴
- MMU(Memory Management Unit)
-
- Page Table
- 메인 메모리에 존재하는, ‘프로세스’마다 있는 ‘가상 주소’와 ‘물리 주소’의
매핑 정보를 담고 있는 테이블
- 가상 주소의 ‘페이지 번호’를 물리 메모리의 ‘프레임 번호’로 연결
- 페이지 : 가상 메모리 공간을 나눈 고정된 크기의 블록
- 프레임 : 물리 메모리(Ram)을 나눈 고정된 크기 블록
- 일반적으로 두 블록의 크기는 같음
- 약 4kb 정도를 가짐
- 너무 크기가 작으면 PageTable의 크기가 늘어남
- 너무 크기가 크면 ‘내부 단편화’ 문제가 발생 가능
- 너무 크기가 작으면 PageTable의 크기가 늘어남
- 일반적으로 두 블록의 크기는 같음
- 페이지 : 가상 메모리 공간을 나눈 고정된 크기의 블록
- Page Table
-
- Page Table Entry
- 페이지 테이블을 구성하는 각 행
- 구성 요소?
- 유효 비트 : 해당 페이지가 메인 메모리에 존재하는지
- 프레임 번호 : 메인 메모리의 어디에 존재하는지를 알려줌
- 참조 비트 : CPU가 읽거나 쓴지를 파악하는 비트
- 수정 비트 : 내용이 수정되었는지를 파악(단순 읽는 용도인지 저장할 필요가 있는지 파악)
등이 존재
- 유효 비트 : 해당 페이지가 메인 메모리에 존재하는지
- Page Table Entry
-
- Page Fault
- CPU가(정확히는 MMU가) 액세스하려하는 페이지가 ‘메인 메모리’에 없는 상황 (인터럽트!)
-
- 인터럽트?
- CPU를 호출하는 신호 -> CPU는 현재 작업을 중단하고 관련된 처리 로직 실행
- Timer , 키보드 입력 : 하드웨어 인터럽트
- Page Fault : 소프트웨어 인터럽트
- 인터럽트?
- Page Fault가 자주 발생 시
CPU가 페이지 교체를 자주해야 하여 성능 저하
(‘스레싱’ 현상)
- Page Fault
- Page Fault 발생 후의 일들
- MMU가 인터럽트 발생 후, OS가 제어권을 얻음(Context-Switching 발생)
- 보조 기억 장치를 탐색해, 해당 페이지 찾음
- 메인 메모리를 탐색하여 ‘빈 물리 메모리 프레임’을 찾아봄
- 있으면, 그 곳에 데이터를 올림
- 없다면, 페이지 교체 알고리즘을 통해 ‘교체’할 영역을 선정하고
그곳과 교체(Swap)
- 있으면, 그 곳에 데이터를 올림
- 이후 PageTable 갱신하고 제어권을 다시 프로세스에게 돌려줌
(이후 명령 재개)
- MMU가 인터럽트 발생 후, OS가 제어권을 얻음(Context-Switching 발생)
-
- 페이지 교체 알고리즘의 종류?
- 보통 LRU를 사용하는 편
다만 실제로는 매번 참조 시간을 기록&체크 하는 방식이
오버헤드가 큰 편이기에 ‘Clock’ 알고리즘 같은 유사 알고리즘을 사용
- 페이지 교체 알고리즘의 종류?
댓글남기기