[TIL] 12/1 목요일

da__ell·2022년 12월 1일
0

TIL

목록 보기
2/5

간만의 TIL..

PROJECT 3 : VIRTUAL MEMORY 시작

화요일 부로 Pintos Project3가 시작되었다... 새로운 조에서 새로운 팀원과 새로운 방식으로 학습을 시작한다.
이번 프로젝트는 일단 금요일까지 과제설명서를 읽고 공부한 뒤에 토요일부터 같이 구현을 하는 방식으로 진행할 계획이다.

이번 3주 간의 나의 학습 방향은 다음과 같다.
1. Kaist-Pintos 과제설명서를 최대한 열심히 읽고 내용을 파악한다.
2. 핀토스 과제를 수행하는 것을 우선으로 하고 그때마다 필요한 만큼 지식을 습득한다.
3. 점차 지식을 구체화시키는 방식으로 학습을 한다.

일단 이해할 수 있는 쉬운 형태로 개념을 받아들여보자. 과제 계획서를 읽으면서 몰랐던 개념들에 대해 간략하게 공부해보면서 정리했다.

스왑 파티션

Provides sector-based read and write access to block device. You will use this interface to access the swap partition as a block device.

블록 디바이스로의 섹터 기반 읽기/쓰기를 제공합니다. 이 인터페이스는 블록 디바이스로 스왑 파티션에 접근할 때 사용하게 될 겁니다.

라는 부분을 읽고 스왑 파티션에 대해 정리해 보았다.

  • 메모리가 가득 찰 때 활용하는 예비공간 메모리가 가득 차면 추가적으로 실행되는 프로그램은 스왑 파티션에서 실행된다.
  • 메모리를 효율적으로 이용하기 위해 사용, 접근 빈도가 낮은 항목을 위치시키는 공간 스왑 파티션이 위치하는 곳은 디스크이다. 즉 메모리에 비해 턱없이 느린 곳이다. 따라서 사용, 접근 빈도에 따라 스왑으로 이동할 지 결정할 필요가 있다. 이를 스왑활용도(Swappiness)라 한다. 높으면 스왑 파티션에 이동할 확률이 높아진다. 단, 스왑 파티션이 존재한다고 하여 꼭 메모리를 효율적으로 이용한다는 것을 보장하지 않는다, 메모리의 크기가 작고, 하드디스크의 속도가 턱없이 느릴 경우 병목현상이 발생할 수 있다.
    따라서 적절하게 스왑활용도를 설정하는 것이 필요하다.
  • 시스템이 절전모드로 들어갈 때 메모리의 내용을 저장하는 장소이다.
    이를 통해 리눅스에서 최대 절전 모드 활용이 가능해진다.

가상 메모리

이번 주차의 주제가 가상 메모리인 만큼 가상 메모리에 대해 간략하게 정리해 보았다.

각 프로그램에 실제 메모리의 주소가 아닌 가상의 메모리의 주소를 주는 방식이다.
가상메모리를 이용하여 실제 물리 메모리가 가진 크기보다 논리적으로 확장하여 사용할 수 있다.

가상메모리 시스템에서는 각 프로그램은 가상 메모리의 주소를 가지고 CPU가 메모리 참조를 시도할 때에는 MMU를 통해 해당 가상주소를 실제 물리주소로 변환시켜서 메모리 참조가 이루어진다.

그러면 가상 메모리를 사용하는 이유는 무엇일까?

  1. 메인 메모리를 효율적으로 활용할 수 있다.
    각 프로그램이 사용하는 가상 주소가 있을 것이다. 디스크에는 이 가상주소들을 모두 저장한다. 필요할 때만 메모리에 데이터를 올려 활용하고 사용하지 않을 때에는 디스크에 내림으로써 데이터를 효율적으로 활용할 수 있다.
    즉 디스크를 메인메모리의 캐시로 활용한다.

  2. 메모리 관리를 단순화한다.
    가상메모리 시스템에서는 모든 프로그램이 동일한 포맷의 가상주소를 가진다. 이는 MMU를 통해 가상주소를 물리주소로 변환시켜 주기 때문에 가능한 일이다.

    실제 물리주소는 주소를 할당하고 반복하면서 주소가 파편화 되게 된다. 하지만 가상 메모리를 활용하여 논리적으로 연속적인 주소공간을 가지는 것처럼 보이게 할 수 있다. 이는 MMU를 통해 가상주소로 변환될 것이기 때문에 가능하다.

    실제 메모리는 많은 데이터를 이용하고 삭제하는 과정을 거치면서 연속적으로 할당되던 데이터도 비연속적으로 데이터가 저장된다. 하지만 가상메모리 시스템을 통해 이러한 비연속적인 데이터를 논리적으로 연속적인 형태로 프로세스에 제공된다.

  3. 메모리 보호가 단순해진다.
    가상주소가 물리주소에 접근할 때 물리주소와 맵핑되는 맵핑 테이블이 존재한다. 테이블에 존재하는 엔트리 번호는 해당 가상주소의 물리주소에 대한 접근 권한을 명시적으로 표현한다. 따라서 각 프로세스에 부여된 가상주소 공간에만 신경쓰면 된다.

페이징

페이징에 대해서는 아직 개념 정도만 익혀서 이게 뭐구나 정도만 받아들일 수 있는 상태이다.
내일 조금 더 구체적으로 공부해봐야겠다.

운영체제에서 메모리 관리하는 방식 중 하나.

메모리의 가상 주소 공간을 가변 크기의 조각으로 분할하는 방식이 Segmentation이라고 한다면,
동일 크기의 조각으로 분할하는 것을 페이징이라고 한다.
가상 주소 공간을 고정된 크기로 나누는데 이 크기 단위를 page라고 한다. 이에 대응하는 실제 물리 메모리의 주소를 page frame이라고 한다.

이후 계획

1. 구현의 선택지 선택 - 배열 / 리스트 / 비트맵 / 해시
핀토스에서 보조페이지테이블, 프레임테이블, 스왑테이블을 구현해야한다.
이를 위해서 각각 다른 자료구조를 선택하여 구현해도 되고 같은 자료구조로 구현해도 된다.


일단 각 자료구조를 선택할 때 얻을 수 있는 장단점을 비교해보았다.

배열 : 단순한 구현이지만, 밀도가 희박한 배열은 오히려 메모리를 낭비시킨다. 예를 들어 실제로 크기는 1,000,000만큼 할당했지만 3만큼만 사용하는 경우 밀도가 희박하다고 하며 사용하는 크기에 비해 너무 큰 크기를 할당하여 메모리 낭비가 생길 수 있다.

리스트 :특정 위치를 찾기 위해 긴 리스트를 순회하면 시간이 오래 걸린다.. 선형 탐색이기 때문에... 그래도 중간 부분의 삽입과 삭제에서는 리스트가 효율적이다.

비트맵 : 동일한 자원 집합 내부의 사용현황을 확인할 수 있다. 자원 n이 사용중이라면 비트 n = true로 설정한다. Pintos의 비트맵은 크기가 고정적이다. 물론 가변적으로 추가적으로 구현할 수 있다.

해쉬맵 : 특정위치를 찾을 때 key를 활용하여 빠르게 탐색을 수행할 수 있다. 중간 부분의 삽입과 삭제가 가능하다. 또한 크기가 가변적이다.

이러한 특성들을 비교했을 때는 일단 해쉬맵이 적절한 판단으로 보여진다. 탐색, 삽입, 삭제 부분에서 key를 통해 빠르게 이뤄질 수 있다. 또한 이미 구현되어있는 해쉬맵 구조만으로도 가변적인 형태이기 때문에 비트맵보다 더 좋은 선택일 것으로 생각된다.

profile
daelkdev@gmail.com

0개의 댓글