일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 치지직
- SWIFT
- react
- OS
- useReducer
- 소프트웨어분석및설계
- 애플 아카데미 후기
- 네이버 부스트캠프
- StateObject
- 애플 디벨로퍼 아카데미 21주차 회고
- Swift 디자인패턴
- apple developer academy 후기
- Swift 문법
- 데이터베이스 공부
- 숭실대
- iOS 개발 오류
- Apple Developer Academy @ POSTECH
- 데이터베이스
- 네이버 치지직
- 운영체제
- sqoop
- 앱 비교 프로젝트
- ObservableObject
- 애플 디벨로퍼 아카데미 후기
- Swift 기능
- swift문법
- global soop
- 애플 디벨로퍼 아카데미
- 제앱소
- ObservedObject
- Today
- Total
사과하는 제라스
[CS 지식 공부] Virtual Memory란? 본문
목차
서론
야삐~~ 오랜만에 돌아온 개발자 제라스입니다! 👋🏻🤖👋🏻
오늘은 Virtual Memory 줄여서 VM이라고 하죠? 가상메모리에 대해서 한번 얘기해보려고 합니다!
아 솔직히 저 이거 학부 OS 수업 때 공부하고 정리도 했었거든요?
근데... 제 뇌는 이걸 저장하고 있지 못하다는 사실...
이게 바로 가상 공부법인가...
그래서 오늘은 가상 메모리(Virtual Memory)가 무엇인지, 그리고 이 동작 과정은 어떻게 되는지 한번 알아보도록 하겠습니다!
그럼 오늘도 시작해봅시다~~
가상 메모리(Virtual Memory)가 뭔데?
정의로는 프로그램이 혼자 메모리를 사용하는 것처럼 메모리를 가상화한 것입니다.
너무 허무맹랑한 소리죠??
그럼 이 개념이 왜 나왔는지부터 얘기해볼게요.
먼저 우리는 OS(운영체제)라는 것을 항상 갖고 있는데 이 친구는 CPU의 활용률을 극대화시키고, 사용자에게 빠른 응답을 제공하는 것이 목적이에요.
그렇다보니
'여러 프로그램이 동시에 메모리에 적재되어 실행되어야 하는데...?'
->
'메모리에 모두 올릴 수 없으니 관리가 필요하겠구나..? +동시에 같은 메모리를 사용할 수 있으니 메모리를 공유하면 좋겠구나..?'
이렇게 된 것이죠.
자..!! 이때 말하는 메모리는 물리 메모리(Physical Memory)이고, 이 물리 메모리는 우리가 흔히 아는 RAM입니다.
즉, 물리 메모리를 써야 하는데 그러기 시작하면 공간이 부족하다는거죠.
(예를 들면, RAM이 8GB인 노트북에서 게임 1-2개만 돌려도 8GB를 훌쩍 넘음에도 불구하고 잘 돌아가는 것을 생각해보시면 됩니다.)
그래서 우리는 직접 이 물리 메모리에 접근하는게 아니라 필요한 데이터의 주소만 알고 있고 이 주소를 통해 접근해서 가져오는 방식을 취하는 겁니다.
이 때문에 우리는 실제 주소가 아닌 가상의 주소를 통해 실제 메모리에 접근하는 방식을 취하게 된 것이고 이렇게 생겨난 개념이 가상 메모리입니다.
그럼 가상 메모리로 물리메모리 접근 방식이 어떻게 되는데?
일단 물리메모리(RAM) 내의 주소 레지스터에 물리 주소들이 적재되어 있어요.
RAM은 보조 기억장치(HDD, SSD 등) 다른 말로는 디스크로부터 필요한 데이터를 적재하고 있다가 프로세스에서 필요로 하면 갖다주고 자신한테 없으면 디스크를 뒤져서 가져옵니다.
아하, RAM은 프로세스라는 두목한테 돈(데이터)을 갖다바치는 아이인데 없으면 부하들(HDD, SSD)한테 수금해서 갖다주는 아이구나?
이때 RAM의 어떤 데이터를 가져올지 그 주소를 프로세스가 알아야 가져오잖아요?
그래서 우리는 두가지 방식을 알아볼 겁니다.
1) CPU에서 상대적인 물리 주소를 사용하는 경우
그림을 예시로 봅시다.
먼저, CPU가 프로세스의 명령을 실행시킬 겁니다.
이때 프로세스는 가상 메모리(= Virtual Address = Logical Address)의 주소인 346번지를 통해 데이터를 가져올 겁니다.
근데...이 346번지는 가짜 주소잖아요??
그래서 346번지를 CPU가 갖고 있는(별도로 있기도 함) MMU(Memory Management Unit)라는 하드웨어 장치에 이 주소를 보냅니다.
그럼 이 MMU라는 아이가 이 가짜주소에 특정 숫자(14000, 상대주소, 상대적인 offset이라고 함.)를 붙여서 실제 주소(절대 주소) 14346번지를 만들어냅니다.
그럼 이 주소로 물리메로리에서 데이터를 찾아올 수 있는 것이죠.
정말 간단합니다. 가상 주소에 / 상대주소를 더해서 / 물리 주소(실제 주소)를 찾아내는 겁니다.
아니 근데 이거 문제가 있음...!!!
이렇게 하면 항상 Physical Address값이 고정되어야 하잖아요? 근데 요즘은 메모리를 효율적으로 쓰기 위해서 물리 주소가 변경될 수 있게 만들어야 하거든요...ㅎㅎ
그래서 다음과 같은 방식이 있습니다.
2) CPU에서 Virtual Address를 사용하는 경우
이 방식도 당연히 똑같이 가상 주소를 물리 주소로 변환하긴 합니다.
하지만 어떤 정해진 상대주소를 더하는게 아니라 MMU에서 Translation(변환 과정)을 거치는 방식입니다.
그럼 이 Translation이 뭐냐...?
가상 주소가 MMU로 들어오면 그 값을 맵핑을 하게 됩니다.
이 맵핑은 Page Table을 거친다는 건데 한번 이걸 자세히 설명해보겠습니다.
Page Table을 통한 맵핑( = Mapping = Paging) 과정
우선 이 Page Table은 물리 메모리에 저장되어 있고 이 테이블을 가리키는 CPU의 Core에 있는 PTBR(Page Table Base Register)을 가지고 접근합니다.
조금 얽히고 섥혔죠...?😅😅
우선 Page Table은 다음과 같이 생겼습니다.
이렇게 Logical Page가 Physical Page와 각각 맵핑이 되어있습니다.
아...! 잠시만요! 그럼 Page가 뭐냐? 쪽이냐? 💋이냐?
Page의 정의부터 보면 이렇습니다.
- Page: 가상 메모리를 고정된 크기로 나누었을 때, 하나의 Block 단위
- Frame: 물리 메모리를 고정된 크기로 나누었을 때, 하나의 Block 단위
여기서 1Page는 보통 1KB의 크기구요. Page와 Frame은 크기는 동일하고 명칭만 다른 정도입니다.
그럼 이 Page를 가지고 Paging을 얘기해보겠습니다.
우리가 앞서 맵핑이라고 하던 거요. 사실 다른 이름으로는 Paging이라고 많이들 얘기합니다...우하하하
뭔 놈의 겹치는 이름이 많으야...
이 Paging은 주소 공간을 동일한 크기인 Page로 나누어 관리하는 방법이라고 하는데요.
자, 우리 진짜 천천히 봐봅시다.
아까 우리 가상 주소가 물리 주소로 Paging된다고 했잖아요?
그리고 가상 주소의 단위가 Page잖아요? 이때 가상 주소의 각 부분(Page)는 두 부분으로 나뉘어요.
1. Page 번호: 각 프로세스가 가진 Page 각각에 부여된 번호
2. Page 주소: 각 Page의 내부 주소 ex)1번 프로세스 12번 페이지의 34번째 Data
위 그림을 예시로 보시죠.
가상 메모리의 하나의 주소 Page가 p 라는 Page 번호와 d라는 Page 주소로 나뉘는데,
p는 Page Table을 거쳐서 f라는 물리메모리의 시작 주소가 됩니다.
그럼 f라는 물리메모리 시작 주소와 d라는 Page 내부 주소(ex.1번 프로세스 12번 페이지의 34번째 Data)를 가지고,
물리 메모리의 f번째 주소를 가서, d위치에 있는 Data를 가지고 오는 것이죠.
이렇게 Paging 이라는 Translation 방식을 쓰면 되지만 이것도 문제점이 있습니다.
바로 두번의 접근이 필요하다는 것입니다.
처음엔 Page Table에, 그 다음에서야 물리 메모리에 접근하니까요!
한계를 극복한 TLB(Translation Look-aside Buffer)
그럼 이거 어떻게 극복하냐구요...?
항상은 아니겠지만 한번 주소를 찾았었다면 미리 캐싱을 해두고 나중에 똑같은 가상주소가 오면 Page Table을 거치지 않고 바로 물리 주소를 주는 방식입니다!
이걸 TLB라고 해요!
그림을 사랑하니 그림을 봅시다!
이렇게 TLB에 있으면(TLB hit) 바로 물리주소를 받고, 없으면(TLB miss) 평상 시대로 Page Table 방문을 하는 겁니다.
이렇게 여러 방식이 있는데...그래도 Virtual Memory 사랑하시죠?
마무리
이렇게 오늘은 Virtual Memory, 가상 메모리에 대해서 알아봤습니다!
사실 마지막에 본 TLB 다음에는 2Level Page Table 방식, Demand Paging 등 방식이 있는데 이거까지 가긴 너무 깊은 거 같아서 제가 이전에 학부 수업 때 정리한 포스팅을 홍보할게요 ㅋㅋㅋㅋㅋㅋㅋ
오늘도 부족한 글 읽어주셔서 감사드립니다🙇🏻♂️🙇🏻♂️
그럼 다음에도 좋은 포스팅을 들고 돌아오겠습니다!
참고
https://namu.wiki/w/%EA%B0%80%EC%83%81%20%EB%A9%94%EB%AA%A8%EB%A6%AC
https://m.blog.naver.com/bycho211/221028200599
https://brightmango.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C
https://ddongwon.tistory.com/49
https://hojunking.tistory.com/119
아직 꼬꼬마 개발자입니다.
더 나은 설명이나 코드가 있다면 언제든 환영입니다.
적극적인 조언과 피드백 부탁드립니다!
그럼 오늘도 개발 가득한 하루되세요!
- Xerath -
🤖🤖🤖🤖🤖🤖🤖
'CS 지식 공부' 카테고리의 다른 글
[CS 지식 공부] POP와 OOP의 차이에 관하여 (1) | 2024.04.01 |
---|---|
[CS 지식 공부] 공유기의 원리(feat. NAT(Network Address Translation)) (0) | 2024.02.20 |
[CS 지식 공부] PNG와 JPG의 차이는 무엇일까?(feat. JPEG) (0) | 2024.01.18 |
[CS 지식 공부] 그쪽도 라이브러리와 프레임워크의 차이를 아세요?(feat. API) (1) | 2023.12.26 |