티스토리 뷰

Linux

[Linux] Memory

덕쑤 2014. 1. 22. 17:15

01. 메모리 관리의 이행와 기법 소개 

테스크는 실행되기 위해 궁극적으로 주기억 장치인 메모리에 적재되어야 한다. 

커널은 테스크를 메모리의 어디에, 언제, 어떻게 적재할 것인지와 같은 관리가 필요하다. 

메모리를 다루기위해 고려해야 할 사항은 속도, 용량이다. 


1. 속도 

메모리의 속도는 CPU의 속도에 비해 상대적으로 느리다.

HDD의 속도는 메모리의 속도에 비래 상대적으로 느리다. 

이러한 상황에서 때문에 CPU에 캐시 메모리를 두고, 메모리에는 버퍼캐시를 H/W배치라여 속도의 차이를 해결한다.


2. 용량 

멀티테스킹 환경에서 다수의 테스크가 메모리에 적재되어 실행된다, 테스크 전체의 크기가 물리적 메모리보다 크다면 문제가 된다.이런 문제는, 실행될 프로그램 전부가 메모리에 적재되어야 할 필요가 없기 때문에 부분적재를 통하여 프로그램 수행이 가능하다는 해결이 가능하다. 그러므로 테스크의 가상메모리 공간에 있는 페이지들 가운데 현재 수행에 필요한 부분만 올려 수행한다. 이후 수행에 필요한 부분이 있으면 그때 메모리에 로드하고, 메모리가 부족하면 부분을 다시 하드디스크로 언로드한다. 


기본 핵심

여러 테스크들이 동시에 실행하면서 각기 다흔 테스크가 사용하는 메모리의 영역에 침범하지 않고 실제 시스템에 장착된 작은 크기의 물리 메모리의 한계를 극복하는 것이다, 

이를 위해, 리눅스는 가상메모리, 페이징 기법 들을 적용해 문제를 해결한다. 


02. 가상메모리 and 물리메모리 

가상메모리는 물리메모리 극복하기 위한 방법이다. (물리메모리의 크기의 한계를 극복하고 메모리 영역의 보호가 가능하다.)

메모리 영역은 주고로 구분된다. 

물리메모리 >> 물리주소 : 물리적 메모리의 직접적인 위치

가상메모리 >> 가상주소 : 각 테스크마다 할당되는 논리적인 주소  

리눅스는 한개의 테스크당 4GB의 주소공간으 할당한다. (3GB 실제공간 | 1GB는 커널공간(모든 테스크의 공동영역)

가상 메모리는 내부적으로 메모리 관리기능을 통해 물리주소로 변환되어 실제 물리메모리에 매칭된다,

가상메모리에서 물리메모리로 변환하는 기법을 페이징기법 이라고 한다. 

이러한 변환과정(소프트웨어적)은 당연히 프로그램의 수행을 지연시키는 오버헤드를 발생시킨다. 

그래서 일반적인 CPU들은 MMU(Memory Management Unit)같은 하드웨어 모듈로 보완한다. 


03. 메모리관리를 위한 자료구조 

테스크는 메모리 관리를 사용하는 주체다. 

그러므로, 테스크가 사용하는 Memory에 대한 정보를 유지하기위한 자료구조가 필요하다. 

task_struct의 구조체안에 struct mm_struct *mm 으로 선언되어 있다. 

mm_struct를 메모리 디스크립터라 한다. 


주요 멤버 

1. struct vm_area_struct *mmap : 가상메모리영역을 관리하기 위해 사용

vm_area_struct들은 리스트로 연결되어 있고, mmap 변수는 리스트의 시작이다. 

vm_area_struct의 맴버 

struct mm_struct *vm_mm

unsigned long vm_start

unsigned long vm_end

struct vm_area_struct *vm_next 다음 가상 메모리블록을 가리킨다, 마지막 블록은 NULL을 가리킴

unsigned long vm_flags 접근 제어들을 담는 플래그  


04. 페이징기법과 주소변환의 의미 

하나의 테스크마다 4GB의 가상메모리를 사용한다고 하지만 궁극적으로 테스크는 물리메모리에 저장된다. 

그러기 위해서는 우리는 가상주소를 물리주소로 변환하고[즈소 변환] 실제 물리 메모리의 어디에 적제되었는지 알아야한다.

리눅스는 페이징기법을 사용하여 가상메모리의 페이지를 물리메모리의 빈 페이지 프레임에 적재한다. 

페이지 : 가상메모리를 일정한 고정크기로 분할하는 단위 (4KB)

페이지 프레임 : 물리메모리를 일정한 고정크기로 분할한 단위 

적제기, 가상메모리의 페이지들가운데 수행에 필요한 페이지만 물리메모리에 적재시킨다. 

테스크가 n개의 페이지 프레임 만큼의 메모리 공간이 필요하다면, 물리메모리의 비어있는 m개의 프레임 가운데 n개를 할당하고 가상메모리의 n개 페이지가 적재한다. 

비어있는 페이지프레임이 존재하지 않는다면 슷템의 정책에 따라 할당된 페이지 프레임을 비운후 적재한다. 

하나의 페이지는 어느위치의 페이지프레임이든 적재할 수 있다. 

실제 물리메모리상의 임의의 페이지 프레임에 적재되므로 페이지가 적재된 페이지프레임의 위치와 임의의 물리메모리 공간에 저장되어 있는 데이터의 위치를 알 수 있는 방법이 필요하다. >> 페이지 테이블 사용 


하나의 페이지 테이블을 사용하는 경우 

페이지 테이블 개수만금 엔트리로 분할 하고, 각엔트이레는 각 페이지가 적제된 페이지 프레임의 위치정보를 담도록한다. 

여기서 페이지 프레임 위치정보는 페이지 프레임의 시작위치이다.

실제 물리주고를 알아내는 법

가상 주소는 CPU에서 생성되는 주소 

페이지 테이블의 엔트리를 찾기 위한 페이지 번호와 offset으로 나뉜다. 

32bit중 상위 20bit는 페이지 번호이고 하위 12bit가 offset이다. 


Demand paging 

프로세서가 요청한 페이지만 접근하는 메모리 고나리 방법

한페이지 테이블 사용시 변환 방법은 간단하나 메모리 공간이 많이 필요하다. 

페이지 테이블도 메모리에 위치한다. 

1개의 엔트리에 1개의 페이지가 필요한다.(하나의페이지프레임을 위해 한개의 페이지 필요) 낭비 

그래서 여러단계의 페이징을 사용한다. 







'Linux' 카테고리의 다른 글

clock_gettime  (0) 2014.08.11
[Linux] setrlimit, getrlimit  (0) 2014.01.24
[Linux] Process  (0) 2014.01.22
[Linux] fork, vfork 그리고 posix_spawn 이야기  (0) 2014.01.22
[Linux] System call 동작 구조 & System call 등록 순서  (0) 2014.01.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함