170 likes | 421 Views
Linux System & Kernel Study_04. 도성준 , 차재우. 1. 메모리 관리의 이해와 기법 소개. 커널이 메모리를 관리한다 . 태스크를 메모리의 어디에 , 언제 , 어떻게 적재할 것인가 ? 메모리는 CPU 에 비해 상재적으로 속도가 느리다 . 명령어나 데이터를 액세스하는 과정에서 많은 시간을 CPU 가 대기 -> 전체적인 시스템의 속도를 떨어뜨리는 요인 해결방법 : 하드웨어적으로 캐시 메모리를 둠으로써 보완
E N D
Linux System & Kernel Study_04 도성준, 차재우
1. 메모리 관리의 이해와 기법 소개 • 커널이 메모리를 관리한다. • 태스크를 메모리의 어디에, 언제, 어떻게 적재할 것인가? • 메모리는 CPU에 비해 상재적으로 속도가 느리다. • 명령어나 데이터를 액세스하는 과정에서 많은 시간을 CPU가 대기 -> 전체적인 시스템의 속도를 떨어뜨리는 요인 • 해결방법 : 하드웨어적으로 캐시 메모리를 둠으로써 보완 • 리눅스는 하나의 태스크에 4GB 크기의 가상 메모리 주소 공간을 할당 • 태스크의 가상 메모리 공간에 있는 페이지들 가운데 현재 수행에 필요한 부분만 물리 메모리에 올려 수행, 물리 메모리가 부족해지면 일정 부분의 페이지들을 다시 하드디스크로 이동 • 메모리 관리의 핵심 • 여러 태스크들이 동시에 실행 • 다른 태스크가 사용하는 메모리 영역을 침범하면 안됨 • 물리 메모리의 한계를 극복 -> 가상메모리, 페이징 기법 등을 적용
2. 가상 메모리와 물리 메모리 • 물리 주소 : 시스템에 장착된 물리적인 메모리의 직접적인 위치 주소 • 가상 주소 • 물리 주소와 상관없이 각 태스크마다 할당하는 논리적인 주소 • CPU가 생성하는 주소 • 각 태스크에게 3GB를 할당, 나머지 1GB는 모든 태스크들의 공통 영역으로서 커널 공간으로 사용 • 가상 주소를 물리 주소로 변환하는 기법 • 리눅스에서는페이징(paging) 기법을 사용 • 주소 변환 과정에서 오버헤드가 발생 • 보완방법 : CPU내에 MMU(Memory Management Unit)와같은 하드웨어 모듈을 포함(인텔 프로세서)
3. 메모리 관리를 위한 자료구조 • 가상 메모리 관리 Virtual memory 4GB vm_area_struct task_struct mm_struct vm_area_struct Kernel space 3GB structmm_struct *mm unsigned long vm_end unsigned long vm_end structvm_area_struct *mmap unsigned long env_end . . Unsigned long start_code unsigned long vm_start unsigned long vm_start structvm_area_struct *vm_next structvm_area_struct *vm_next Area 2 Area 1 0x08048000 0
3. 메모리 관리를 위한 자료구조 • 가상 메모리 구조 4GB Kernel space 3GB end_env env env_start arg_end arg arg_start stack_start stack Shared library 0x40000000 heap brk start_brk BSS end_data DATA start_data end_code TEXT start_code 0x08048000 0
4. 페이징 기법과 주소 변환의 이해 • 가상 주소를 사용하는 태스크를 적절히 물리 메모리에 배치할 수 있어야 하며, 물리 주소도 알 수 있는 방법이 필요 -> 주소 변환이 필요 • 페이지 : 가상 메모리를 일정한 고정 크기로 분할하는 단위(4kb) • 페이지 프레임 : 물리 메모리를 일정한 고정 크기로 분할한 단위 (인텔 : 4kb) • 가상 메모리의 페이지들 가운데 현재 수행에 필요한 페이지만 물리 메모리에 적재하는 방식을 사용 • 페이지를 적재할 때 연속적인 페이지 프레임을 할당할 필요는 없음 • 페이지가 적재된 페이지 프레임의 위치를 알 수 있는 방법이 필요 • 페이지 테이블(page table) 사용 : 태스크의 페이지가 적재된 페이지 프레임 정보를 저장 • 각 태스크당 하나의 페이지 테이블을 사용하면 많은 메모리 공간이 소비 • kernel 2.4 : 3단계 페이징(paging) • kernel 2.6 : 4단계 페이징(paging)
5. 인텔 프로세스의 주소 변환 • 인텔 프로세서는 CPU내에 MMU를 포함. • 주소변환에 따른 시간지연을 줄이고 2단계 페이징 기법을 사용. • 8086 • 보호모드가 별도로 존재하지 않는다. • 20bit(1MB)의 주소공간 제공. • 80286 • 보호모드 도입. • 24bit(16MB)의 주소공간 제공. • 셀렉터를 사용하며 디스크립터 테이블 사용. • 8086과 동일한 16bit 프로세서이므로 세그먼트의 크기가 64KB로 제한됨.
5. 인텔 프로세스의 주소 변환 • 80386 • 페이징 메커니즘이 추가됨. • 32bit(4GB)의 주소공간 제공. • MMU(Memory Management Unit)이 추가됨.
5. 인텔 프로세스의 주소 변환 • 주소 변환 과정 • 인텔 i386에서는 물리주소를 생성하기 위해 MMU의 세그멘테이션 유닛과페이징유닛을 각각 거친다. • 논리주소 -> 선형주소 • 16bit의 셀렉터와 32bit의 오프셋을 사용한다. • 셀렉터는디스크립터 테이블의 인덱스와 디스크립터 테이블을 가리키는 TI 항목,RPL(접근권한)로 구성되며 세그먼트 레지스터에 로드된다. • 디스크립터 테이블은 각 세그먼트의 정보를 기술한 세그먼트 디스크립터들로 구성. • 각 디스크립터들은64bit의 크기를 갖고 32bit의 기준주소와 20bit의 범위, 세그먼트속성으로 구성됨.
5. 인텔 프로세스의 주소 변환 • 디스크립터 테이블은 GDT와 LDT로 구분. • 세그먼트 속성 중 2bit의 DPL(Descriptor Privilege Level)을 포함. • 특권레벨 – 어떤 명령을 실행할 수 있는 권한이나 메모리의 어떤 영역에 접근할 수 있는권한의 레벨을 의미. 0~3단계까지 4단계로 구분. • 리눅스에서는0과 3을 사용하여 커널모드와 사용자 모드로 구분.
5. 인텔 프로세스의 주소 변환 • 선형주소 -> 물리주소
5. 인텔 프로세스의 주소 변환 • CR3 레지스터 : 물리 메모리에 위치한 태스크의 페이지 디렉토리의 시작점 주소를 가리킴. • 페이지 디렉토리 • 각 태스크마다 하나씩 할당. • 10bit를 가지므로 1024개의 엔트리를 갖는다. • 각 엔트리는 하나의 페이지 테이블을 가리킴. • 페이지 테이블 • 페이지 디렉토리와 동일하게 10bit이므로 1024개의 엔트리를 갖는다. • 각 엔트리는 물리 메모리의 페이지 프레임 주소 정보를 갖는다. • 물리 메모리 • 페이지 프레임 크기가 4KB이므로 범위 내 임의의 위치를 찾기 위해 12bit를 사용. • 2단계 페이징을 통해 접근 할 수 있는 메모리의 크기- 페이지 디렉토리(1024) * 페이지 테이블 수(1024) * 페이지 프레임 크기(4KB) = 4GB • MMU내에 TLB(Translation Lookaside Buffer)라는 캐시를 포함 시켜 페이지 디렉토리/테이블을 찾기 위한 부가적인 물리 메모리 공간 접근에 의한 성능 저하를 최소화함.
6. 리눅스의3단계 페이징 기법 • 리눅스의커널을 다양한 시스템에 포팅하여 사용할 수 있음. • Alpha CPU의 경우 64bit 주소 공간을 사용하는 아키텍처. • 다양한 아키텍처를 지원하기 위해 리눅스는3단계 페이징 기법을 사용. • 커널2.6 후반대 버전에서는 4단계 페이징 지원.
6. 리눅스의3단계 페이징 기법 • 64bit의 선형 주소를 사용하는 경우 32bit 선형 주소보다 주소 공간이 훨씬커지므로 페이지 테이블이 차지하는 용량을 줄이기 위하여 사용. • 물리 주소를 얻는 과정 • CR3 레지스터에서 글로벌 디렉토리의 시작 주소를 얻는다. • pgd_offset() 함수로 글로벌 디렉토리에서 페이지 미들 디렉토리의 위치를 알 수 있는엔트리의 위치를 알아낸다. • pmd_offset() 함수를 사용하여 미들 디렉토리에서 페이지 테이블의 위치를 얻는다. • pte_offset() 함수를 사용하여 페이지 테이블에서 물리 페이지의 위치를 얻는다.
7. 메모리 할당과 해제 • 커널의 메모리 할당 • 버디 시스템 알고리즘 • 연속된 빈 페이지 프레임을 그룹으로 관리하여 요청된 페이지 크기에 가장 근접한연속된 페이지 프레임들을 페이지 단위로 할당함. • 슬랩할당장 • 미리 개체별로 모아 캐시로 관리하며 객체들이 메모리를 요구할 때 할당함. • cat/proc/slabinfo명령으로 시스템에서 관리되고 있는 슬랩 목록 확인 가능.
8. 페이지 교체 • 페이지 교체 • 태스크가 요구하는 페이지를 원활히 할당할 수 있도록 물리 메모리의 페이지 프레임 가운데 일부를 제거하여 빈 페이지 프레임을 확보하는 방법. • 페이지 교체 정책 • 어떤 페이지를 제거할지를 결정하는 것. • FIFO, OPT, LRU, LFU, MFU등의 알고리즘 사용. • 다른 알고리즘들은 비용과 성능상의 문제가 있어 리눅스에서는LRU 방식을 사용. • LRU(Least Recently Used) • 가장 오랫동안 참조되지 않은 페이지를 교체하는 방식. • 기본 알고리즘대로 구현시 오버헤드 문제나 코드가 복잡해짐. • 리눅스에서는LRU 근사 페이지 교체 기법을 사용. • 페이지를 참조할 때나 내용이 변경될 때 설정되는 Accessed 플래그와Dirty 플래그를 이요하여스왑아웃시킬 후보를 결정한다.
8. 페이지 교체 • 리눅스에서는kswapd데몬이 돌면서 불필요하다고 판단되는 페이지들을 주기적으로 스왑아웃시켜서 메모리 내에 빈 프레임을 충분히 유지한다.