[CS:APP] 9.0 - 9.2 : 가상 메모리 질문 털이
2025.04.23 - [컴퓨터 이론] - [CS:APP] 9 : Virtual Memory [- 9.8]
[CS:APP] 9 : Virtual Memory [- 9.8]
전부 작성된 내용이 아님. 이 부분은 가능한 빨리 작성하겠다.가상 메모리가 사용된 뒷 배경을 먼저 보자. 주된 내용은 메모리 공유에 있어 어려움을 겪었다는 것이다.여러 프로세스가 CPU와 메
hyeonistic.tistory.com
9장 가상 메모리에 대한 깊이 파는 과정
뭐가 가상이라서 이름을 가상이라고 부르냐?
주소의 가상성 : 프로세스가 접근하는 주소는 실제 물리 주소가 아니다.
- CPU가 프로그램을 실행 할 때 사용하는 주소는 가상 주소이다.
- 이 가상 주소는 MMU라는 것을 통해 물리주소로 변환되는 것이다.
연속성의 "가상성"
- 프로세스는 자신에게 할당된 메모리가 연속적이라고 생각하지만, 실제로는 비연속적인 물리 메모리 블록들로 구성된다.
- 이 연속성은 페이지 테이블이 보장해주는 논리적 환상이다.
접근 가능성의 "가상성"
- 어떤 주소에 실제 데이터가 존재하지 않아도, 프로세스는 그 주소에 접근 할 수 있다고 생각한다.
- 운영체제가 페이지 폴트를 총해 필요한 시점을 확인하고 메모리를 로드해주게 된다.
보안과 독립성의 "가상성"
- 각 프로세스는 자기만의 가상 주소 공간을 갖는다.
- 다른 프로세스의 메모리를 직접 참조하거나 훼손 할 수 없다. 이는 일종의 격리된 가상의 공간이다.
가상 메모리란, 실제 존재하지 않거나 연속되지 않은 메모리 공간을, 존재하며 연속된 공간처럼 "가상으로" 제공하는 추상화이다.
물리적으로 주어진 용량보다 더 많은 메모리를 가상 메모리라는 개념을 통해 사용 할 수 있다. 가상 메모리를 통해 운영체제는 적은 물리 메모리로도 매우 큰 프로그램의 실행을 가능하게 한다.
그럼 물리 메모리는 극단적으로 적어도 되는 것 아닙니까?
아니오.. 그런건 또 아닙니다. 필요하긴 합니다.
- 가상 주소가 물리 주소로 변환되어야 한다.
- CPU는 가상 주소만 사용하지만, 실제 데이터를 읽고 쓰는 장치는 RAM이다.
- 가상 주소는 MMU가 물리 주소로 변환한 후, 이 물리 주소를 통해 실제 메모리 접근이 이루어진다.
- 즉, 물리 메모리 없이 가상 주소는 실체가 없는 껍데기만 있는 것이다.
- 그니까, 1KB로는 안된다는거죠?
- 프로그램의 동시 실행량과 성능 문제
- 이 정도로 용량이 적으면 동시에 실행 가능한 프로그램 수가 극도로 제한된다.
- 이러면 메인 메모리에 올릴게 없으니 페이지 폴트가 자주 발생한다. 램보다 훨씬 느린 디스크에 대한 접근이 많아지면서, 시스템은 계속 디스크의 속도에 의해 발목잡히게 된다.
- RAM이 넉넉하면 페이지 폴트의 발생률이 낮아지고, 디스크에 의존하지 않아도 된다.
- 프로그램의 동시 실행량과 성능 문제
가상 메모리 사용을 하는 주된 내용까지만 보자.
거의 모든 프로그램은 가상 메모리를 사용할까?
네. 대부분의 프로그램이 해당됩니다.
- 운영체제가 기본적으로 가상 메모리 기반의 메모리 관리를 채택하기 때문이다. 즉, 모든 프로그램에 강제 적용된다.
- 상용화된 OS 모두 프로세스마다 독립된 가상 주소 공간을 제공한다.
- 개발자가 의식하지 않더라도 모든 사용자 프로그램은 가상 메모리 위에서 실행된다.
가상 메모리를 사용하지 않는 경우가 있을까?
이런 경우가 있다.
- 임베디드 시스템, 마이크로컨트롤러 기반 프로그램, 특수 목적 OS
- 얘네는 MMU 자체가 없거나 비활성화 되어있어 물리 주소를 직접 사용하는 구조이다.
- 어떤 초고속 시스템에서는 오버헤드 감소를 위해 가상 메모리를 일부러 꺼버리기도 한다.
- 운영체제 커널 일부 또는 부트로더 단계
- 초기 커널 로딩 단계. 즉 가상 메모리 시스템이 준비되지 않아서 이 동안 물리 주소를 직접 다루기도 한다.
가상 메모리는 프로그램의 요청으로 동작하는가?
기본적으로는 아니다. 운영체제가 부팅 시점에 가상 메모리 시스템을 설정하고, 이후에 저절로 이 구조 위에서 실행된다.
- 프로그램이 malloc()을 호출하거나 메모리를 접근 할 때는 가상 주소를 사용한다.
- 이 주소가 물리 메모리에 존재하는지 여부는 OS가 판단하고, 필요할 때만 페이지를 적재한다.
- 즉, 프로그램은 가상 메모리를 직접 요청하는게 아니어도 운영체제가 항상 개입시키는 것이다. 강제라는 것!
[논외] : 게이밍 콘솔에도 OS는 들어가있는데, 특수 목적 OS로 봐야하나? 아니면 어떻게 생각하면 좋나?
- 뭐, 플스, 스위치 다 가상 메모리 구현을 위한 MMU가 들어가있다. 근데 막 현우의 퍼니박스 같은 구데기 게임기에는 해당 없다.
9.1 Physical and Virtual Addressing
CPU가 메인 메모리에 접근 할 떄 가상 주소를 생성하고, 이 주소는 메인 메모리에 전달되기 전에 적절한 물리 주소로 변환된다.
- 프로그램 코드 안의 포인터, 배열 주소, 변수의 위치는 모두 가상 주소이다.
- 개발자나 프로세스는 물리 메모리의 실제 위치를 알 수 없다. CPU의 메모리 접근은 반드시 가상 주소에서 이뤄진다.
- CPU가 내놓은 주소가 바로 RAM에 접근되는 것이 아니다.
- 이 가상 주소는 먼저 주소 변환 과정을 거친다. 가상 주소는 바로 메모리에 전달되지 않는다.
- 가상 주소에서 물리 주소로 주소 변환을 하는데 있어 작업을 담당하는 것은 MMU라는 하드웨어 장치이다.
- 변환 방식
- CPU가 내놓은 가상 주소를 MMU가 페이지 테이블을 참조하여 해당하는 물리 주소로 변환한다.
- 이후 이 물리 주소가 RAM으로 전달되어 실제 데이터를 읽거나 쓰는 과정을 하게 된다.
- 이 전체 과정이 OS와 MMU에 의해 투명하게 이루어지므로, 개발자는 이를 의식하지 않아도 된다!
- 변환 방식
MMU는 가상 메모리와 운명을 같이하는건가?
가상 메모리를 사용하려면 MMU가 반드시 필요합니다.
- Memory Management Unit은 주소 변환을 수행하는 장치이다.
- 즉, 가상 주소에서 물리 주소로 변환 작업, 접근 권한 검사, 페이지 테이블 해석을 담당한다.
- 그냥, 꼭 필요하다. 반드시 필요함.
- MMU가 없다는 것은 :
- 가상 주소를 물리 주소로 바꿔 줄 하드웨어가 없다는 것이다.
- 소프트웨어로 흉내를 낼 수 있을지언정, 진정한 의미의 주소 격리, 보호, 유연한 페이징은 불가능하다.
- 이런 경우 CPU는 메모리 접근 시 물리 주소를 직접 사용하게 된다.
- MMU가 없다는 것은 :
일부 소형 임베디드 시스템에는 MPU(Mem Protection Unit)만 있는 경우도 있다.
- 이건 가상 메모리 개념은 아니다. 그래서 예외이지도 않다. 단순 보호 기능만 제공한다.
MMU는 변환 테이블을 참조한다고 했다. 이것은 매핑 표 같은 것인가?
예. 한번 디테일하게 보고 갑시다.
변환 테이블의 역할
- 가상 주소를 물리 주소로 변환하는 데 필요한 정보를 테이블 형식으로 저장한다. 이를 페이지 테이블이라 하고, 각 항목은 가상 주소와 물리 주소 간의 매핑 정보를 담고 있다.
페이지 테이블의 구조
- 가상 주소를 페이지 번호와 오프셋으로 나눈다.
- 페이지 테이블은 페이지 테이블에서 찾아야 하는 정보이며, 페이지 테이블은 각 페이지가 물리 메모리에서 어디에 위치하는지 기록한다.
- 오프셋은 페이지 내에서 실제 데이터의 위치이다.
왜 이 테이블을 참조하는거지?
- 가상 주소를 물리 주소로 변환하는 작업에서, 가상 주소와 물리 주소간의 관계를 알아야한다.
- 이 관계를 매핑해두는게 바로 페이지 테이블이다. 이 매핑 표는 상대적 관계를 정의하고, 어디로 변환해야 할지 알려준다.
일종의 압축 파일같다. 압축 파일 그 자체는 아무것도 할 수 없고, 압축을 해제 한 뒤에 의미가 있는 파일이 나온다고 했다.
앞에서 설명한 내용 없는 껍데기라는 표현이 가상 주소에 대해서는 딱 알맞는 표현으로 간주 할 수 있다.
즉, 변환된 주소만이 유효한 주소가 된다.
9.2 Address Spaces
가상 메모리가 존재하는 시스템에서 가상 주소 공간으로부터 가상 주소를 생성한다는 언급이 있다. 그렇다면 가상 공간은 MMU인가?
아니오. 밀접하게 관련되어 있는건 맞는데 같다고 할 순 없습니다.
- 가상 주소 공간은 프로세스가 사용 할 수 있는 주소의 범위로, 논리적인 개념이다.
- MMU는 앞에서 언급했듯 변환을 수행하는 하드웨어이다.
이후에도 선형 공간이나 아니냐에 대해 논하지만, 책에서 선형 공간을 전제하고 설명한다고 했기 떄문에 실 개발과의 괴리감은 그런가보다 하고 지금은 논하지 않겠다.
주소 공간은 데이터 객체(byte)와 그것의 속성(address) 사이를 명확히 구분해주기 때문에 중요하다.
주소 공간은 두 부분을 구분된 구조 안에 분리시켜, 명확한 접근 제어와 관리를 가능하게 한다. 이 문장이 말하고자 하는 것은 :
- 분리와 보호
- 주소 공간은 객체와 속성을 물리적으로 섞이지 않게 분리해준다.
- 가상 주소 0x1000은 어떤 변수의 값이 저장된 위치일 수 있지만, 페이지 테이블 항목에는 그 주소의 속성 정보가 함께 기록된다.
- 정책과 메커니즘의 분리
- 데이터 값은 사용자가 정의하지만, 속성은 운영체제가 정의한다.
- 주소 공간이 이 둘을 나누어 줌으로써 사용자는 값만 생각하고, OS는 보호만 하면 된다.
- 안정성과 보안
- 사용자 프로그램이 실수로 커널 메모리를 덮어쓰지 않도록, 주소 공간은 명확한 경계와 권한을 저으이해준다.
- 이는 멀티 프로세스 환경에서 프로세스 간 간섭을 막는 핵심 메커니즘이기도 하다.
즉, 운영체제가 각 데이터 위치와 그 위치에 부여된 보호 속성을 별도로 관리함으로써,
안정성 있고 일관된 메모리 보호를 가능하게 만든다는 것이다.