일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 완전탐색
- 재귀
- Loss
- two pointer
- Github
- 신나는함수실행
- sort
- 코딩테스트
- 투포인터
- 브루트포스
- 알고리즘
- Virtual Memory
- 파이썬
- 코테
- 백트래킹
- BF
- 정렬
- Algorithm
- 프로그래머스
- ML
- python3
- 재귀함수
- OS
- 머신러닝
- backtracking
- CS
- Python
- dfs
- 백준
- 1일1솔
- Today
- Total
이것저것 공부 기록하기
[OS] 가상 메모리 기본 개념 본문
가상 메모리(Virtual Memory System) 배경
실제 각 프로세스마다 충분한 메모리를 할당하기에는 메모리 크기가 한계가 있다.
- 예를 들어, 리눅스는 하나의 프로세스가 무조건 4GB의 영역을 갖는다.
- 통상 메모리는 8GB? 16GB? 32GB 정도 되니까 프로세스가 통째로 다 올라가게 되면 프로세스를 각각 2개,3개,4개 정도밖에 실행하지 못하게 된다.
폰노이만 구조 기반이므로, 모든 코드는 메모리에 반드시 있어야 한다. 그 메모리에서 코드를 한 줄, 한 줄 가져와서 CPU가 실행을 한다. 따라서 메모리와 프로세스의 dependency가 크다. 그런데 멀티프로세싱이나 멀티태스킹의 장점은 프로세스를 여러 개 실행시킬 수 있다는 건데... 어떻게 하면 적은 메모리에서 많은 프로세스를 실행시킬 수 있을까 해서 나온 개념이 가상 메모리 개념이다.
실제로 어느 시점에 CPU가 참조하는 영역은 제한적이다. 특정 시간 동안, 특정 프로세스에서 참조하는 코드는 제한적이라는 뜻이다.
따라서 각 프로세스를 4GB로 잡아주되, 지금 당장 현재 쓰고 있는 메모리만 Physical Memory인 RAM에 넣어준다. 그 작업이 끝나면 또 다른 메모리를 RAM에 넣어주고 그런 식으로 동작을 한다.
또한, CPU가 특정 프로세스의 공간을 참조할 때는 그 공간에 해당하는 물리 메모리공간에서의 그 데이터가 어디 있는지만 알면 되겠다. 즉, 실제로 프로세스에서의 공간의 주소가 물리 메모리에서 어떻게 바뀌어 있는지만 알면, 딱 필요한 공간만 메모리에 놓고 CPU가 그 부분을 실행하면 된다. 그 공간을 안 쓰게 되면 메모리에서 없애고 프로세스의 새롭게 사용하는 공간을 물리 메모리에 넣어주는 방식으로 진행한다.
가상 메모리가 필요한 이유?
가상 메모리는 기본적으로 배치 처리 시스템처럼 하나의 프로세스만 실행 가능한 시스템에서는 쓸 이유가 없다.
하나의 프로세스만 실행 가능한 시스템은
1. 프로그램을 메모리로 로드(load)
2. 프로세스 실행
3. 프로세스 종료 (메모리 해제)
이런 과정으로 진행이 되기 때문에 이슈가 발생하지 않기 때문이다.
반면, 여러 프로세스가 동시에 실행되는 시스템에서 가상 메모리는 필수적이다.
여러 프로세스 동시 실행 시스템에서는
1. 메모리 용량 부족 이슈
2. 프로세스 메모리 영역 간에 침범 이슈
가 발생할 수 있기 때문에 가상 메모리가 필요하다.
이제 진짜로 가상 메모리가 뭔지 알아보자.
가상 메모리(Virtual Memory)
- 가상 메모리 : 메모리가 실제 메모리보다 많아 보이게 하는 기술
- 실제 사용하는 메모리는 작다는 점에 착안해서 고안된 기술
- 프로세스 간 공간 분리로, 프로세스 이슈가 전체 시스템에 영향을 주지 않을 수 있다.
위의 그림은 리눅스에서의 예시다. 리눅스에서는 일단 무조건 프로세스마다 4GB를 할당을 한다.
또한, 리눅스에서는 사용자 영역(User Space)과 커널 영역(Kernel Space)를 분리를 해서 3GB~4GB는 커널 영역, 0~3GB는 사용자 영역으로 구분된다.
사용자 영역에는 코드(program text), 데이터(Initialized data), 힙 영역(runtime heap), 스택 영역(user stack)이 들어간다.
따라서 이러한 4GB가 통째로 한 번에 사용되지는 않는다는 것이다. 저 부분들 중 일부분만 메모리에 올려놓는다는 것!
그러면 주소가 2개 필요하게 된다.
일단 가상 주소는 리눅스의 경우로 보면, 모든 프로세스는 0~4GB까지로 지칭할 수 있는 가상 주소를 갖는 셈이다.
그 중 일부분만 메모리에 올라가는 것인데, 그 메모리가 실제로 어디에 올라가있는지 알아야 할 것이고, 그게 바로 물리 주소이다.
CPU가 어떤 프로세스의 공간을 참조할 때는 가상주소를 먼저 찾게 되며, 이 가상주소가 실제 어느 물리주소에 들어와있는지 알아야하므로, 가상주소와 물리주소를 변환시켜주는 메커니즘이 가상 메모리 안에 들어가있다.
그런데 이걸 매번 주소를 변환시켜주면 시간이 많이 걸리지 않을까?
그래서 이러한 시간을 단축하기 위해 MMU(Memory Management Unit) 라는 하드웨어 칩을 하나 넣어놓는다.
이 MMU는 CPU에 코드 실행 시, 가상 주소 메모리 접근이 필요할 때 해당 주소를 물리 주소값으로 빠르게 변환해주는 역할을 한다.
[가상 메모리 기본 아이디어 정리]
프로세스는 가상 주소를 사용하고, 실제 해당 주소에서 데이터를 읽고, 쓸 때만 물리 주소로 바꿔주면 된다.
virtual address(가상 주소) : 프로세스가 참조하는 주소
physical address(물리 주소) : 실제 메모리 주소
이러한 변환 시간을 단축하기 위해 가상 메모리는 하드웨어(MMU) 지원도 필요하다.
다음 포스트에서는 가상 메모리 메커니즘의 대표적인 예인 Paging System에 대해서 다루겠습니다.
Reference
패스트캠퍼스 컴퓨터공학 올인원 패키지 강의자료
쉽게 배우는 운영체제
'CS > OS' 카테고리의 다른 글
[OS] 세그멘테이션(Segmentation) (0) | 2021.05.22 |
---|---|
[OS] 페이징 시스템(Paging System) (0) | 2021.05.19 |
[OS] 프로세스와 기본 스케쥴링 알고리즘 (0) | 2021.05.09 |