CS/Operating System

19. Memory Management Mechanism

공부중인학생 2024. 1. 25. 17:49

페이징 메커니즘은 현대 OS의 메모리 관리 기법을 구현하기 위한 핵심적인 메커니즘입니다. 이번에는 페이징 기법을 통해서 프로세스의 메모리를 효율적으로 관리하는 정책에 대해 알아보겠습니다.

 

 

프로세스 스케줄러를 설계할 때 정책과 메커니즘을 구별해서 설계해야 합니다. 어플리케이션 마다 사용하는 스케줄러 정책이 다를 수는 있지만 context switching 메커니즘은 동일하게 동작해야 합니다. OS의 메모리 관리 부분도 동일하게 적용되는데 이때 페이징 기법이 바로 메커니즘이 됩니다.

 

페이징 기법은 MMU라는 매핑 하드웨어로 페이지 테이블이라는 매핑 정보를 통해 CPU가 이슈한 로지컬 어드레스를 실제 피지컬 메모리 주소인 피지컬 어드레스로 변환을 해줍니다. 이렇게 매핑 하드웨어와 매핑 테이블 전체를 매핑 메커니즘이라고 부릅니다. (페이징 메커니즘은 매핑 메커니즘 중 하나)

 

이 페이징 메커니즘은 페이지가 피지컬 메모리에 어떻게 할당되어 있는지 전혀 모르는 상태로 간편하게 코딩을 할 수 있게 도와준다는 이점이 있습니다. 페이징 기법을 사용할 때는 로지컬 어드레스 스페이스 상의 모든 페이지들이 다 사용되며 모든 페이지는 메인 메모리에 적재되어 있다는 가정을 합니다.

 

하지만 프로그램이 수행될 때 사용하는 페이지들은 실제로 많지 않기 때문에 오랫동안 사용하지 않는 페이지의 경우 비싼 메인 메모리를 낭비하므로 적재하지 않습니다. (메인 메모리는 스토리지와 다르게 프로세스들이 공유할 수 있고 사이즈도 작기 때문에 아껴야 함)

 

그래서 값싼 스토리지에 이런 페이지들을 보관하게 되는데 그 장소를 swap area/device라고 부릅니다. 이 swap device는 스토리지 위의 파일 시스템이 아닌 low level로 빠른 액세스가 가능한 특별한 디바이스 드라이버로 구현합니다. 이렇게 로지컬 어드레스 스페이스에 있는 페이지들이 메인 메모리에 꼭 있어야 된다는 제한을 풀게 되면 이런 메모리 관리 기법을 virtual memory management system이라고 부릅니다.

 

 

 

로지컬 어드레스 스페이스 상에서 존재하는 페이지는 3가지로 나뉩니다. vaild page는 메인 메모리에 존재하는 페이지, invalid page는 swap area에 존재하는 페이지, 매핑이 안 돼있고 사용하지 않는 페이지는 unused 페이지라고 부릅니다. virtual memory management system에서 MMU는 로지컬 어드레스 스페이스를 피지컬 어드레스 스페이스로 매핑하는 것이 아니라 버츄얼 어드레스 스페이스를 매핑하는 일을 합니다.

 

버츄얼 메모리를 관리하려면 저번까지 배웠던 페이징 개념만으로는 부족합니다. page fault handling이라는 추가적인 메커니즘이 필요합니다. 

 

 

 

버츄얼 어드레스 스페이스는 유저 프로세스마다 독자적으로 존재합니다. 버츄얼 어드레스 스페이스 상의 페이지는 메인 메모리에 존재하거나 swap area에 존재하거나 사용하지 않거나 이렇게 3가지 상태로 존재합니다. 

 

 

 

페이지들에 대해서 사용되지 않을 때는 swap area로 보내지고 사용될 가능성이 있는 경우 메인 메모리로 불러들일 수 있다면 모든 페이지가 메인 메모리에 적재된 것과 차이가 없을 것입니다. 이를 통해서 값비싸고 사이즈가 굉장히 작지만 빠른 피지컬 메모리가 값싼 스토리지 디바이스로 확장되는 느낌을 사용자에게 줄 수 있습니다.

 

 

 

사용될 가능성이 있는 페이지는 메인 메모리로, 가능성이 낮은 페이지는 swap area로 미리 보내야 합니다.  프로세스가 실행될 때 짧은 타임 인터벌 상에서 사용하는 페이지들의 개수가 그렇게 많지 않습니다. 이걸 locality나 locality of referency라고 하는데 locality는 다시 spatial locality와 temporal locality로 나뉩니다.

 

temporal locality는 한 instruction이 현재 수행되었다면 가까운 미래에 그 instruction이 다시 수행될 가능성이 높다는 것입니다. 이는 loop 때문에 생기는 현상으로 바디안에 instruction이 다음 iteration에서도 실행될 가능성이 높기 때문입니다.

 

spatial locality는 한 instruction이 실행되면 그 instruction 주위의 instruction이 가까운 미래에 수행될 가능성이 높다는 것을 의미합니다. 이 또한 loop 때문에 발생하는 현상으로 다음 iteration 때 내 앞에 있던 instruction이 수행되는 것을 생각하면 됩니다. 

 

이 로컬리티라는 개념은 프로그램의 수행을 프로파일링 했을 때 10%의 loop가 실행 시간의 90%를 차지한다는 점을 통해서 밝혀졌습니다. (10%의 코드를 담고 있는 페이지가 주로 access 되고 나머지 90%의 페이지는 사용되지 않는다.), 캐시가 최근에 사용한 것들을 보관하는 이유는 access 된 페이지가 다음번에 또 사용될 확률이 높기 때문

 

 

 

페이지 폴트는 페이징 기법에서 address translation을 할 때 피지컬 메모리에 없는 페이지가 필요한 경우를 해결해 줍니다. (버츄얼 메모리이기 때문에 생기는 문제),  피지컬 메모리에 없는 페이지의 경우 swap area에서 읽어오는 과정을 페이지 폴트라고 부릅니다. 페이지 폴트는 일종의 software interrupt나 이벤트로 볼 수 있습니다.

 

OS의 페이지 폴트 핸들링의 경우 OS가 페이지 폴트가 발생했다는 것을 인지하고 swpa area에 있는 페이지를 메인 메모리로 읽어 온다음 interrupt로 인해 중지된 프로세스들을 깨워서 마저 수행시키는 처리를 해야 합니다. OS가 페이지 폴트 핸들링을 잘하려면 페이지 폴트 이벤트를 잘 찾아야 합니다.

 

이를 확인하는 방법은 page table entry에 한 bit를 할애해서 그 페이지가 메인 메모리에 있는지 없는지를 표시하면 됩니다. 이런 bit를 present bit, valid bit이라고 부릅니다. 수행 중에 버츄얼 어드레스가 이슈 되고 MMU가 해당 page table entry를 확인했는데 valid bit가 0인 경우 MMU가 CPU에게 interrupt를 발생시킵니다.

 

 

 

페이지 폴트 핸들링은 인터럽트 서비스 루틴과 유사하지만 차이점이 존재합니다. 인터럽트 서비스 루틴의 경우 하드웨어적으로 인터럽트 시그널이 이슈가 되고 현재 수행 중인 instruction이 완료되고 나서 insterrupt가 발생했음을 인지합니다. 그다음 프로그램 카운터에 있는 값을 스택에 대피시킵니다. 이 값은 코드가 resume 해야 될 resume 주소가 됩니다.

 

이후 하드웨어적으로 인터럽트 소스에 대한 인터럽트 리퀘스트 넘버를 획득한 후 인터럽트 벡터 테이블에서 찾고 인터럽트 서비스 루틴의 주소를 얻어서 점프하는 과정이 인터럽트 핸들링이 됩니다. 

 

페이지 폴트 핸들링에서는 페이지 폴트가 발생했을 때의 instruction을 완료할 수 없는 문제가 생길 수 있습니다. instruction에서 사용하는 operand에서 페이지 폴트가 발생한 경우 이 instruction을 완료시킬 수 없으니 이전 instruction으로 undo 하게 됩니다. 이후 필요한 operand를 가진 페이지를 메모리에 적재하고 다시 instruction을 수행하게 됩니다.

 

이 때문에 undo가 되지 않는 마이크로 프로세서의 경우 가상화가 지원이 불가능합니다. 과거 CISC instruction 중에서 종종 발생하는 문제였지만 현재는 없어졌습니다.

 

 

 

페이지 폴트에 대해서 신경 써야 할 또 다른 토픽이 있는데 TLB와의 관계입니다. TLB를 사용할 경우 동일한 page table entry 정보가 카피가 되어 TLB에도 있고 메인 메모리에 존재하는 page table에도 존재하는 문제가 생깁니다. 이를 위해서 메모리 레퍼런스가 발생했을 때 페이지와 관련되어 만들 수 있는 폴트가 2가지가 존재합니다.

 

TLB fault의 경우 MMU가 버츄얼 어드레스를 얻어와서 TLB를 통해 translation을 하려고 했지만 entry가 TLB에 들어있지 않은 상황입니다. 페이지 테이블에서 해당 entry를 가져오는 것으로 해결이 가능합니다.

 

Page fault는 원하는 페이지가 메인 메모리에 있지 않은 경우를 말합니다. TLB fault가 발생하면 메인 메모리에 있는 page table의 변화는 없지만 page fault가 발생하면 메인 메모리 page table에 swap area에 있던 entry가 추가되게 됩니다. 그리고 이 entry는 TLB에도 기록이 됩니다.

 

 

 

페이지 폴트 핸들러는 소프트웨어 루틴입니다. OS의 일부로 일반 커널 함수가 아닌 인터럽트 서비스 루틴입니다. 위 사진에서는 페이지 폴트 핸들링의 전체 동작에 대해 설명합니다.

 

 

 

페이지를 읽어와야 하는데 페이지 프레임이 없는 경우 idle 한 프로세스를 찾아서 해당 프로세스가 점유하고 있는 페이지 프레임을 swap out 시켜 비우게 해야 합니다. 만약 clean page라면 그냥 버리면 되지만 modify 된 내용이 있다면 해당 페이지에 대한 swap area 위치를 찾아 기록해줘야 합니다. 이후 페이지 테이블에 해당 entry를 업데이트해주면 됩니다.

'CS > Operating System' 카테고리의 다른 글

21. Trashing and Working set  (1) 2024.01.27
20. Demand Paging  (2) 2024.01.26
18. Enhancing Mechanisms  (1) 2024.01.24
17. Paged segmentation  (0) 2024.01.23
16. Segmentation  (1) 2024.01.10