메모리가 처음 만들어졌을때 운영채제들이 한 프로그램을 유저가 실행시키면 main memory에 싹다 들고오는 문제점이 있었음
자주 사용하는 프로그램에 대해 데이터를 가져오는 것이 디스크에서 가져오는 것은 오래걸리기 때문에, 자주 사용하지 않는 데이터들을 디스크에 남겨두고, 자주 사용하는 데이터들을 가상 메모리에 둔다.
메모리와 디스크 사이에 직접 컨트롤하지 말고, 가상 메모리로 디스크를 대신하자라는 것이 취지
(비록 실제로 메모리 공간을 차지하지는 않아도)
하드웨어에서 메모리를 만들때 page 라는 단위를 씀
물리 메모리부터 특정 크기의 block 으로 나누었을 때 그를 page 라고 한다.
continuous(계속 연속되는) 공간을 주지않고, 물리적으로 떨어져있는 공간을 할당함으로써, processor 입장에서는 물리적으로 어떻게 쓰고 있는지는 모르곘지만, 내가 달라고 한거는 반드시 준다. 그래서 그걸 mapping(매핑) 해 주는게 paging 이다
요약 : 크키가 동일한 페이지로 가상 주소 공간과 이에 매칭하는 물리 주소 공간을 분리하는 기법
- 페이지 번호를 기반으로 가상주소/물리주소 매핑 정보를 기록/사용
페이징 기법은 컴퓨터가 메인 메모리에서 사용하기 위해 데이터를 저장하고 검색하는 메모리 관리 기법이다.
페이징 기법을 통해 컴퓨터의 물리적 메모리는 연속적으로 할당되어 존재할 필요가 없으며, 반대로 연속적으로 존재하지 않는 물리적 메모리라도 페이징 기법을 통해 연속적으로 존재하는 것처럼 이용될 수 있다.
페이징 방식에서는 가상 메모리 상의 주소 공간을 일정한 크기로 분할한다.
주소공간은 페이지 단위로 나뉘어져있으며 실제 기억공간은 페이지 크기와 같은 프레임으로 나누어 사용한다.
Frame : 물리 메모리를 일정된 한 크기로 나눈 블록
Page : 가상 메모리를 일정된 한 크기로 나눈 블록
이 때 Frame 과 Page 의 크기는 동일하게 관리된다.
페이지의 크기는 시스템에 따라 다르며 크기가 작으면 메모리를 단편화하기 쉬워지지만 페이지의 갯수가 많아지기 때문에 페이지 단위의 입출력이 자주 발생하게 된다.
페이지가 하나의 프레임을 할당받으면, 물리 메모리에 위치하게 된다.
프레임을 할당받지 못한 페이지들은 외부저장장치에 저장되며, 마찬가지로 프레임과 같은 크기 단위로 관리된다.
페이징 기법에서 페이지는 페이지테이블(Page Table) 이라는 자료구조 형태로 관리된다.
과정 요약
- 1) 데이터(프로그램)은 디스크에 저장됨
- 2) 디스크에 들어있는 데이터(프로그램) 파일들을 page table 에다 주소를 저장하고 가리킴 (매핑)
- 3) page table 에 저장된 디스크의 주소를 보고 접근함. 근데 디스크에는 직접적으로 데이터가 저장되지 않는 특성으로 있어서, DMA가 디스크에 있는 해당 데이터를 physical 메모리로 옮겨버림
4) page table 이 가리키는 주소를 업데이트함 (디스크가 아닌 phyiscal 메모리 주소값을 저장 및 가리키도록 최신화)
1) 초기에 CPU 에서 프로그램을 실행시키킨다면, 본인의 프로그램은 디스크에 들어가있는다.
2) 운영채제들와 파일 시스템들이 디스크에 들어가있는 이 파일들을 page table 이라는 곳에 등록을 해놓는다.
3) 그래서 운영채제가 저 program1 이라는 놈을 page table 에 넣어놓고, 아 얘는 디스크(또는 메모리) 에 들어가있어! 라고 매핑을 해놓는다.
4) 그래서 process 가 시작되면, page table 의 특정 부분을 보고서 아 처리할게 여기있네? 라고 깨닫는게 page fault 기법이다.
=> CPU 는 특정 데이터를 사용하고 싶다면, 데이터가 메모리에 있어야한다. 디스크나 CPU 는 절대로 direct 하게 작업을 하지 않는다. 그래서 CPU 가 연산할 때 필요한 데이터는 메모리에 있어야 하는데, 현재 process 에 대한 page table 을 찾아보니 내가 필요한 데이터가 디스크에 있다면 기대하지 않은 안 좋은 상황이 왔기 때문에 page fault 라고 인식을 한다. page fault 는 인식을 하는 순간 interrupt 라는 것을 발생시킨다.
5) page fault 가 발생하면, 디스크 controller 는 메모리에 있어야 할 데이터가 디스크 자신이 잘못 가지고 있기에, 왜 여깄지? 하고 데이터를 phyiscal 메모리에 어딘가에 올려놓는다.
(=> 이 역할은 DMA(Direct Memory Access) 가 수행)
6) page table 의 program1 이 가리키는 주소를 업데이트 한다. (디스크. 즉, 가상 메모리에서 물리적 메모리에 해당 데이터가 실제로 저장되어 있다고 최신화 해줌)
ex. 아래 그림에서 보듯 서로다른 process인 process1, process2 이 각자 다른 page table 을 보유하고 있어서, 각 page table 이 동일한 메모리 주소를 참조(저장)할 수도 있다.
(보듯이 physical 메모리의 page 2가 동시에 참조당하는 중임)
1) 메모리 공간 절약
2) Fragmentations (메모리 단편화) 문제점 해결
3) secure 문제점 해결
(물리적 메모리 공간이 모자라도, 가상 메모리 공간을 활용하면 더 큰 프로그램이나 데이터를 사용 가능)
(물리 메모리가 공간이 작아서, 공간이 넓은 디스크(가상 메모리)에서 데이터를 물리 메모리 공간에 알맞게 조금씩 가져온다)
물리적 메모리에 데이터를 할당할때 주소를 random 하게 주므로, 뒤죽박죽이 되버리고 메모리가 엉켜서 할당된 전체 메모리 공간을 제대로 활용 못할수도 있다.
그래서 가상 메모리가 각 물리 메모리를 매핑해서 순서대로 차곡차곡 연속적인 메모리 공간을 할당시켜서, 뒤죽박죽이고 메모리 공간을 활용못하던 문제점을 해결함
한 process 가 다른 process 의 page tables 에 접근할 수 없다.
여러 프로세스의 특정 페이지들이 동일한 물리적 메모리공간을 참조하고 있는경우, 각 프로세스들끼리 서로의 데이터를 침범할 수 없다.
(cf. OS 는 아래 3가지중 하나를 택해서 구현됨)
page 가 clean한 경우 : 그냥 제거하면 됨
page 가 dirty 한 경우 : 디스크에 수정된 내용을 write 하고 제거되어야 함
디스크 공간에서 데이터를 메모리로 가져올 때 direct 하게 가져오지 않고 주소를 매핑해서 큰 용량을 가지는 것 처럼 보이게 해주는 기술
방법1) static allocation
방법2) dynamic allocation
automatic 변수 : 명시적으로 선언하지 않아도 메모리가 필요한 변수 (ex. 함수 파라미터 변수)
manually allocated 변수 (중요!!!!)
BSS, Data, Text, Unmapped : 상수. 프로그램에 들어가있는 상수로, 불변의 특성
heap : BSS 위의 주소가 0x.. 과 같이 몇개가 있을것이다. 메모리를 요청해서 할당받을때마다 주소가 밑에서부터 위로 올라간다. brk 라는 포인터를 사용해서 구현함.
(brk : 힙 끝자락 주소를 가리키는 포인터)
리눅스 계열의 시스템은 아래의 2가지 함수를 제공
=> 유저가 mallloc 을 사용해서 힙을 이만큼 사용했다고 알려주는것 (힙의 끝자락 주소를 가리키므로)
free(p2) 를 한다고해도, brk 은 항상 힙의 끝을 가리키므로 brk 가 가리키는 위치가 변하지 않는다.
p4 = malloc(2) : free() 이후 빈자리에 새로운 동적 메몰 공간을 채워넣는다.
(앞서 배웠던 내용!)
메모리 중간중간에 꼬임이 발생해서 메모리 공간을 제대로 활용못하게 되는 현상
(해결법 : 연속적으로 virtual memory 가 각 물리 메모리를 매핑해서 순서대로 contiguous 하게 메모리 공간을 할당 및 가리키면 된다)
종류 : Internal/External fragmentation