컴퓨터 & 코딩/CS

[혼공학습단 10기][혼공컴운] 가상 메모리 - 연속 메모리 할당 / 페이징을 통한 가상 메모리 관리

구로그 2023. 7. 21. 14:27
728x90

✓ 연속 메모리 할당

✏️ 연속 메모리 할당: 프로세스에 연속적인 메모리 공간을 할당하는 방식

 

 

1️⃣ 스와핑 swapping

현재 실행되지 않는 프로세스들을 임시로 보조기억장치 일부 영역으로 쫓아내고 그 빈 공간에 또 다른 프로세스를 적재하여 실행하는 방식

 

- 스왑 영역 swap space: 프로세스들이 쫓겨나는 보조기억장치의 일부 영역

- 스왑 아웃 swap out: 현재 실행되지 않는 프로세스가 스왑 영역으로 옮겨지는 것

- 스왑 인 swap in: 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것 

 

 

 

2️⃣ 메모리 할당 

비어있는 메모리 공간에 프로세스를 연속적으로 할당하는 방식

 

1) 최초 적합 first fit

최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식. 

 

2) 최적 적합 best fit

프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식. 

 

3) 최악 적합 worst fit

프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식. 

 

 

 

3️⃣ 외부 단편화 external fragmentation 

❗️ 연속 메모리 할당의 문제점
프로세스들이 실행되고 종료되기를 반복하며 생긴 메모리 사이 빈공간이 프로세스를 할당하기 어려울 만큼 작아서 메모리가 낭비될 수 있다. → 외부 단편화

 

메모리 압축 compaction (메모리 조각 모음)

- 메모리 내 저장된 프로세스를 적당히 재배치 시켜 여기저기 흩어져 있는 빈 공간을 하나로 모으는 방식. 

- 단점:

  • 압축하는 동안 시스템은 하던 일을 중지해야한다
  • 메모리에 있는 내용을 옮기는 작업은 많은 오버헤드를 야기시킨다.

 

 


 

 

✓ 페이징을 통한 가상 메모리 관리

❗️메모리 연속 할당의 문제점: 외부 단편화 / 물리 메모리보다 큰 프로세스를 실행할 수 없다 

 

페이징: 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 자르고, 메모리 물리 주소 공간을 프레임이라는 페이지와 동일한 크기의 일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법. 불연속적으로 할당되며 스와핑도 가능하다. 

 

💡 가상메모리virtual memory
실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술 

 

 

✏️ 페이지 테이블

페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표. 현재 어떤 페이지가 어떤 프레임에 할당되었는지 알려준다. 

프로세스가 비록 물리 주소에 불연속적으로 배치 되더라도 논리 주소에는 연속적으로 배치되도록 페이지 테이블을 이용한다.

 

 

✏️ 내부 단편화 Internal tragmentation
모든 프로세스가 페이지 크기에 딱 맞게 잘리는 게 아니라 생기는 메모리 낭비. 
하나의 페이지 크기 보다 작은 크기로 발생. 페이지 크기를 그렇다고 너무 작게 하면 그만큼 페이지 테이블의 크기가 커져서 페이지 테이블이 차지하는 공간이 낭비된다. 

 

 

 - 페이지 테이블 베이스 레지스터 PTBR: 각 프로세스의 페이지 테이블이 적재된 주소를 가리키는 레지스터. 

 

- TLB (Translation Lookaside Buffer)

  • CPU가 메모리에 있는 페이지 테이블을 보기 위해 한 번, 그렇게 알게 된 프레임에 접근하기 위해 한 번 이렇게 두 번 메모리 접근을 할 필요 없게끔 하기 위한 페이지 테이블의 캐시 메모리. CPU곁에, 주로 MMU 내에 있다. 
  • 페이지 테이블의 일부 내용이 저장된다. 참조 지역성에 근거해 주로 최근에 사용된 페이지 위주로 가져와 저장한다. 
  • TLB 히트: CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우 (↔︎ TLB 미스

 

 

 

✏️ 페이징에서의 주소 변환

특정 주소 접근 하려면 두 정보가 필요하다. 

1) 페이지 번호 page number:  접근하고자 하는 페이지 번호 

2) 변위 offset: 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지 

 

→ 논리 주소 <페이지 번호, 변위> 는 페이지 테이블을 통해 물리 주소 <프레임 번호, 변위>로 변환된다. 

 

 


❓CPU가 논리 주소 <5, 2>에 접근하고 싶어할 경우 CPU가 실제로 접근하는 물리주소는 몇 번지인가?

✅ 페이지 테이블에서 5번 페이지가 1번 프레임에 있으며, 물리 주소 공간에서 1번 프레임이 8번지부터 시작하기 때문에 8 + 2 (변위) = 10. 즉, CPU가 접근하는 물리 주소는 10번지 


 

 

 

✏️ 페이지 테이블 엔트리 PTE

페이지 테이블의 각각의 엔트리, 각각의 행들. 

 

- 유효 비트 valid bit

  • 현재 해당 페이지에 접근 가능한지 여부.
  • 현재 페이지가 메모리에 적재되어 있는지(1) 보조기억장치에 있는지(0) 알려준다.
  • 만약 유효 비트가 0인 페이지에 접근하려고 하면 페이지 폴트 page fault라는 예외가 발생한다

 

 

- 보호 비트 protection bit

  • 페이지 보호 기능을 위해 존재하는 비트.
  • 해당 페이지가 읽고 쓰기가 모두 가능한 페이지인지(1) 읽기만 가능한지(0) 나타낸다.
  • r(Read), w(Write), x(eXecute) 이 세 개의 비트로 조금 더 복잡하게 구현할 수도 있다.
  • 가령 100이라면 읽기만 가능. 111은 읽기, 쓰기, 실행 모두 가능 

 

 

- 참조 비트 reference bit

  • CPU가 이 페이지에 접근한 적이 있는지 여부.
  • 적재 이후 읽거나 쓴 페이지는 1, 적재 이후 한 번도 읽거나 쓴 적이 없는 페이지는 0 (접근 비트)

 

 

- 수정 비트 modified bit (더티 비트 dirty bit)

  • 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부
  • 변경된 적이 있다면 1, 없다면 0 (한번도 접근한 적이 없거나 읽기만 했던 페이지).
  • 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야하는지 할 필요가 없는지 판단하기 위해 존재한다.

 

 

쓰기 시 복사 copy on write 

❗️ 유닉스, 리눅스와 같은 운영체제에서 fork 시스템 호출을 하면 자식 프로세스는 부모 프로세스와는 다른 메모리 영역에 복제되어 프로세스 생성 시간을 늦추고 불필요한 메모리 낭비를 야기한다.  

쓰기 시 복사는 자식 프로세스로 하여금 부모 프로세스와 동일한 프레임을 가리킨다.

읽기 작업만 한다면 이 상태가 지속되고 만약 부모나 자식 둘 중 하나가 페이지에 쓰기 작업을 하면 해당 페이지가 별도의 공간으로 복제된다(쓰기 시 복사). 이를 통해 프로세스 생성 시간을 줄이고 메모리 공간 절약도 가능하다

 

 

 

 

✏️ 계층적 페이징

페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식 (다단계 페이지 테이블 multilevel page table)

이렇게 하면 모든 페이지 테이블을 항상 메모리에 유지할 필요가 없지만, CPU가 발생하는 논리 주소가 달라진다. 

페이지 번호 + 변위 → 바깥 페이지 번호 + 안쪽 페이지 번호 + 변위

❗️ 단점: 페이지 테이블의 계층이 늘어날 수록 페이지 폴트가 발생했을 경우 메모리 참조 횟수가 많아진다. 

 

 

 

 

 

반응형