저번글로서 이제 CPU의 가상화가 끝났고, 이제부터는 '메모리의 가상화'에 대해서 다룰 차례다.
한번 그 역사 흐름부터 살펴보자.
옛날에는 컴퓨터가 매우 비쌋기 때문에, 사람들은 컴퓨터를 더 효과적으로 공유하길 원했습니다. 이렇게 해서 다중 프로그래밍의 시대가 열리게 되었고, 여러개의 프로세스가 실행되기 시작합니다. 그래서 CPU의 가상화, 시분할(time sharing)의 시대가 도래하게 되었습니다.
예전에는 시분할을 하면서 Context switching을 할 때, 모든 state들을 디스크에 저장한 후, 다른 프로세스의 상태를 불러와서 실행하는 식으로 공유를 했었는데, 이 방법은 너무 느리다는 단점이 있습니다. 메모리 전체 내용을 디스크에 저장하는 것은 딱 봐도 성능이 너무 떨어집니다..따라서 프로세스들을 메모리에 남겨두고, 이들간 전환을 하여 운영체제가 시분할을 효율적으로 구현할 수 있도록 하는 아이디어가 등장합니다.
위 그림을 살펴보면, 세 개의 프로세스(A, B, C)가 있고, 각각 512KB 물리 메모리에서 작은 부분을 할당받고 있는 것을 볼 수 있습니다.
이제 이렇게 놓고 보니, 더욱 신경써야할 것들이 추가되기 시작합니다. 특히 여러 프로그램이 동시에 메모리에 상주하기 때문에 Protection(보호) 문제가 중요하게 대두됩니다. 한 프로세스가 다른 프로세스의 메모리를 읽거나 뭔가를 수정해버리면 큰일이 나기 때문이죠.
Address Space
그래서 이러한 상황을 막고, 물리 메모리를 사용하기 쉽게끔 메모리를 추상화합니다. 이 추상화를 바로 address space라고 부르고, 이는 실행 중인 프로그램 입장에서 바라보는 메모리의 모습입니다.
프로세스의 address space에는 실행 중인 프로그램의 모든 메모리 상태가 들어있습니다.
Code, Data, call stack, 지역변수, 함수 간에 매개변수와 반환 값을 주고받는데 사용하기 위한 stack, 동적으로 할당되는 사용자 관리 메모리인 Heap 등이 포함됩니다.
다시 돌아와서 address space는 운영체제가 실행 중인 프로그램에게 제공해주는 추상화를 의미합니다.
프로세스 입장에서는 자신만의 무제한인 메모리가 있다고 믿고 있는 것이니까요! 하지만 실제로는 하나의 메모리를 여러 프로세스가 공유하면서 사용하고 있습니다.
운영체제가 이렇게 할 때, 이를 메모리를 가상화한다고 합니다. 예를 들어, Figure 13.2 그림에서의 프로세스 A가 주소 0에서 load를 시도할 때(이 때 0은 virtual address, 가상 주소), 운영체제는 하드웨어(MMU)의 지원과 함께 이 load가 물리 주소 0이 아닌 메모리에 로드된 실제 물리 주소 320KB(프로세스 A가 로드된 위치)로 가도록 해야 합니다. 이것이 메모리 가상화의 핵심이라고 할 수 있습니다!
그렇다면 어떻게 메모리의 가상화, 이런 추상화를 구현할 수 있을까??
이건 앞으로 다음 글부터 살펴봅시다 !
그렇다면 메모리 가상화를 구현할 때 운영체제가 목표로해야할 Goal들은 또 어떤게 있을까요?
주요 목표는 총 3가지가 있습니다. 투명성(transparency), 효율성(efficiency), 보호(protection).
한가지씩 어떤 의미일지 간단하게 살펴보겠습니다.
Goal 1. 투명성 (Transparency)
컴퓨터에서 투명하다라는 개념은 복잡한 것들을 안보이게 하는 것이 투명하다는 뜻입니다. 프로세스는 메모리가 가상화되었다는 사실을 인식하지 않고, 자신만의 독립적인 메모리 공간이 있다고 믿게끔 하는 것입니다. 운영 체제와 하드웨어가 뒤에서 아무리 빡세게 일해도 추상화 덕분에 우리 개발자도 다른 프로세스가 미칠 영향 따위는 고려하지 않고 우리의 프로그램에만 신경을 쓰면서 개발을 할 수 있는 것입니다.
Goal 2. 효율성 (Efficiency)
운영체제는 가상화를 시간적 측면(프로그램이 느려지지 않도록)과 공간적 측면(가상화를 지원하는데 너무 많은 메모리를 사용하지 않도록) 모든 측면에서 가능한 한 효율적으로 구현해야합니다. 시간적 측면의 효율성을 위해서 TLB(Transfer Lookaside Buffer)와 빠른 주소 변환을 위한 MMU와 같은 하드웨어의 도움을 받게 됩니다! 공간적 측면에서는, 일부만 메모리에 loading하게끔 하거나, 필요할 때 loading하게끔 하는 demanding page같은 것들이 존재합니다.
Goal 3. 보호 (Protection)
메모리에 여러개의 프로세스가 상주하기 때문에, 서로가 서로에게 영향을 미쳐서는 안되고 완전히 독립되어야 합니다.
이를 위해서는 2가지 정도의 도움을 받게 됩니다.
1. cpu의 dual mode(user mode, kernel mode): 주소 변환 정보를 생성하거나 갱신, 수정할 때 사용되는 명령어, 그 때 접근되는 물리적인 주소가 있을 텐데 거기에 접근할 수 있는 것은 kernel mode일 때만 가능합니다. user mode일 때는 만들어진 것을 사용하는 것만 가능합니다.
2. 그리고 여러 가능성이 생기는 SW가 아닌 MMU와 같은 하드웨어를 통해서 주소변환을 이루어냅니다.
'CS > 운영 체제🖥️' 카테고리의 다른 글
[OS] Mechanism: Address Translation (1) | 2024.11.14 |
---|---|
[OS] Scheduling: Proportional Share (0) | 2023.12.16 |
[OS] Scheduling: Multi Level Feedback Queue (MLFQ) (0) | 2023.12.11 |
[OS] Scheduling: Introduction (Scheduling Policy들 정리) (0) | 2023.11.06 |
[OS] CPU 가상화 메커니즘 (Limited Direct Execution) - 2부 (1) | 2023.10.31 |
댓글