Linux 메모리 관리를 이해하지 못한다고 말하지 마세요. 10장의 사진을 통해 이해하실 수 있습니다!
오늘은 Linux
의 메모리 관리에 대해 공부하겠습니다.
CURD
에 능숙한 경영학과 학생들에게 메모리 관리는 우리와는 거리가 멀게 느껴집니다. 하지만 이 지식 포인트는 대중적이지는 않지만(많은 사람들이 배우고 나면 전혀 사용하지 않을 것으로 추정됨), 확실히 기초의 기초입니다.
이것은 무술 소설에 나오는 내면의 근력 단련과 같습니다. 배우고 나면 당장 결과가 나오지는 않지만, 키가 더 커질 것이기 때문에 앞으로의 발전에 큰 도움이 될 것입니다.
기사에 나오는 예시 사진은 모두 제가 그린 것입니다. 그림을 그리는 것보다 코딩하는 것보다 시간이 더 걸리지만, 글보다 그림을 보면 다들 직관적으로 이해하기 때문에 계속 그림을 그립니다. 고화질 샘플 사진이 필요한 학생들을 위해 기사 마지막 부분에 사진을 얻을 수 있는 방법이 있습니다.
좀 더 실용적으로 말하자면, 면접에서 자신이 이러한 지식을 알고 있다는 사실을 무심코 드러내고 자세히 말할 수 있다면 면접관이 당신에게 더 관심을 갖게 될 수도 있고 승진, 연봉 인상, 취업을 할 수도 있습니다. 인생의 정점이 한걸음 더 다가왔습니다.
전제 합의: 이 문서에서 논의된 기술 내용의 전제는 운영 체제 환경이 x86
32비트 x86
架构的 32 位 Linux
시스템.
가상 주소
최신 운영 체제에서도 메모리는 여전히 컴퓨터에서 매우 귀중한 리소스입니다. 컴퓨터에 몇 테라바이트의 솔리드 스테이트 드라이브가 있는지 살펴보고 메모리 크기도 살펴보세요.
시스템 메모리 자원을 최대한 활용하고 관리하기 위해 Linux는 가상 메모리 관리 기술을 사용합니다. 가상 메모리 기술을 사용하여 각 프로세스는 서로 간섭하지 않는 4GB 가상 주소 공간을 갖습니다.
프로세스 초기화 할당 및 작업은 이 "가상 주소"를 기반으로 합니다. 프로세스가 실제로 메모리 자원에 액세스해야 하는 경우에만 가상 주소와 물리적 주소 간의 매핑이 설정되고 물리적 메모리 페이지가 전송됩니다.
부적절한 비유를 하자면, 사실 이 원리는 현재의 XX 네트워크 디스크와 동일합니다. 네트워크 디스크 공간이 1TB라면 정말 이렇게 큰 공간이 단번에 주어질 수 있다고 생각하시나요? 아직 너무 어리잖아요. 물건을 넣어야 공간이 할당됩니다. 실제 넣은 만큼의 공간이 할당됩니다. 하지만 귀하와 귀하의 친구 모두에게 1TB의 공간이 있는 것 같습니다.
가상 주소의 이점
- 사용자가 물리적 메모리 주소에 직접 접근하는 것을 방지하고 파괴적인 작업을 방지하며 운영 체제를 보호합니다.
- 각 프로세스에는 4GB의 가상 메모리가 할당되어 사용자 프로그램이 실제 물리적 메모리보다 더 큰 주소 공간을 사용할 수 있습니다.
4GB 프로세스 가상 주소 공간은 "사용자 공간"과 "커널 공간"의 두 부분으로 나뉩니다.

사용자 공간 커널 공간
실제 주소
위 장에서 우리는 이미 사용자 공간이든 커널 공간이든 사용되는 주소가 가상 주소라는 것을 알고 있습니다. 프로세스가 실제로 메모리에 액세스해야 할 때 커널의 "요청"에 의해 "페이지 오류 예외"가 생성됩니다. 페이징 메커니즘"을 물리적 주소로 전송합니다. 메모리 페이지.
가상 주소를 메모리의 물리적 주소로 변환합니다. 여기에는 MMU
메모리 관리 장치를 사용하여 가상 주소(세그먼트 페이지 유형) 주소 변환을 분할하고 페이징하는 과정이 포함됩니다. 자세한 내용은 컴퓨터 구성 원리 교과서를 참조하세요.

세그먼트 페이지 메모리 관리 주소 변환
Linux
커널은 물리적 메모리를 다음과 같은 3가지 관리 영역으로 나눕니다.
ZONE_DMA
DMA
内存区域。包含0MB~16MB之间的内存页框,可以由老式基于ISA
的设备通过DMA
사용되며 커널의 주소 공간에 직접 매핑됩니다.
ZONE_NORMAL
일반 메모리 영역. 커널의 주소 공간에 직접 매핑되는 16MB~896MB 사이의 메모리 페이지 프레임, 일반 페이지 프레임을 포함합니다.
ZONE_HIGHMEM
고급 메모리 영역. 직접 매핑되지 않은 896MB 이상의 메모리 페이지 프레임을 포함합니다. 메모리 페이지 프레임의 이 부분은 영구 매핑과 임시 매핑을 통해 액세스할 수 있습니다.

물리적 메모리 영역 분할
사용자 공간
사용자 프로세스가 접근할 수 있는 것은 "사용자 공간"입니다. 각 프로세스는 자신만의 독립적인 사용자 공간을 가지며, 가상 주소 범위는 0x00000000
至 0xBFFFFFFF
총 용량은 3G입니다.
사용자 프로세스는 일반적으로 사용자 공간의 가상 주소에만 액세스할 수 있으며 인라인 작업이나 시스템 호출을 실행할 때만 커널 공간에 액세스할 수 있습니다.
프로세스 및 메모리
프로세스(실행된 프로그램)가 차지하는 사용자 공간은 "일관된 액세스 속성을 가진 주소 공간이 함께 저장된다"는 원칙에 따라 5
서로 다른 메모리 영역으로 구분됩니다. 액세스 속성은 "읽기 가능, 쓰기 가능, 실행 가능 등"을 참조합니다.
-
코드 조각
코드 세그먼트는 실행 파일의 동작 명령과 실행 프로그램의 이미지를 메모리에 저장하는 데 사용됩니다. 코드 세그먼트는 런타임 시 불법 수정으로부터 보호되어야 하므로 읽기 작업만 허용되고 쓰기는 불가능합니다.
-
데이터 세그먼트
데이터 세그먼트는 초기화된 전역 변수를 실행 파일에 저장하는 데 사용됩니다. 즉, 프로그램에서 정적으로 할당한 변수 및 전역 변수를 저장합니다.
-
BSS 섹션
BSS
段包含了程序中未初始化的全局变量,在内存中bss
모든 세그먼트를 0으로 설정하세요. -
힙
heap
힙은 프로세스가 실행되는 동안 동적으로 할당되는 메모리 세그먼트를 저장하는 데 사용되며 크기는 고정되지 않으며 동적으로 확장되거나 축소될 수 있습니다. 프로세스가 메모리를 할당하기 위해 malloc과 같은 함수를 호출하면 새로 할당된 메모리가 힙에 동적으로 추가됩니다(힙이 확장됨). free와 같은 함수를 사용하여 메모리를 해제하면 해제된 메모리가 힙에서 제거됩니다. (힙이 줄어듭니다).
- 스택
스택은 프로그램을 저장하기 위해 사용자가 임시로 생성한 로컬 변수, 즉 함수에 정의된 변수입니다(그러나stack
에서 선언한 변수는 포함되지 않으며, 정적이란 변수를 데이터 세그먼트에 저장하는 것을 의미합니다). 또한, 함수가 호출되면 해당 매개변수도 호출을 시작한 프로세스의 스택에 푸시되고, 호출이 완료된 후 함수의 반환 값도 스택에 다시 저장됩니다. 스택의 선입후출 기능으로 인해 스택은 통화 장면을 저장/복원하는 데 특히 편리합니다. 이런 의미에서 스택은 임시 데이터를 저장하고 교환하는 메모리 영역으로 생각할 수 있습니다.
static
아키텍처에서는 스택이 아래쪽으로 확장되고 힙이 위쪽으로 확장되는데, 이는 서로 상대적입니다. BSS
段、堆通常是被连续存储在内存中,在位置上是连续的,而代码段和栈往往会被独立存放。堆和栈两个区域在 i386
명령을 사용하여 컴파일된 프로그램의 각 메모리 영역 크기를 확인할 수도 있습니다. size
으아악
커널 공간
용량에는 커널 공간에서 실행되는 커널 이미지, 물리적 페이지 테이블, 드라이버 등이 포함됩니다. x86 32
位系统里,Linux 内核地址空间是指虚拟地址从 0xC0000000
开始到 0xFFFFFFFF
为止的高端内存地址空间,总计 1G

직접 매핑 영역
직접 매핑 영역의 커널 공간 주소 범위는 직접 메모리 매핑 영역입니다. Direct Memory Region
:从内核空间起始地址开始,最大896M
직접 매핑 영역의 896MB의 "선형 주소"가 "물리적 주소"의 앞부분에 직접 연결됩니다 896MB
进行映射,也就是说线性地址和分配的物理地址都是连续的。内核地址空间的线性地址0xC0000001
所对应的物理地址为0x00000001
,它们之间相差一个偏移量PAGE_OFFSET = 0xC0000000
이 영역에는 선형 주소와 물리 주소 사이에 선형 변환 관계가 있습니다. "선형 주소 = PAGE_OFFSET
+ 物理地址」也可以用 virt_to_phys()
커널 가상 공간의 선형 주소를 물리 주소로 변환하는 함수입니다.
고급 메모리 선형 주소 공간
커널 공간 선형 주소 범위는 896M부터 1G까지이며, 128MB 용량의 주소 범위는 고급 메모리 선형 주소 공간이라고 불리는 이유는 무엇입니까? 아래에서 설명해 드리겠습니다.
앞서 언급했듯이 커널 공간의 전체 크기는 1GB이며, 커널 공간의 시작 주소에서 시작하는 896MB의 선형 주소를 물리적 주소 크기 896MB의 주소 범위에 직접 매핑할 수 있습니다.
한발 물러서서 커널 공간의 1GB 선형 주소가 물리적 주소로 매핑되더라도 물리적 메모리 주소 범위 중 최대 1GB까지만 주소를 지정할 수 있습니다.
지금 가지고 있는 메모리스틱의 크기는 얼마나 되나요? 일어나세요, 이제 거의 2023년이 되었습니다. 대부분의 PC 메모리는 1GB보다 큽니다!
그래서 커널 공간은 마지막 128M 주소 범위를 꺼내어 다음과 같은 3개의 고급 메모리 매핑 영역으로 나누어 전체 물리적 주소 범위를 주소 지정했습니다. 사용 가능한 선형 주소 공간이 설치 가능한 메모리보다 훨씬 크기 때문에 64비트 시스템에서는 이 문제가 발생하지 않습니다.
동적 메모리 매핑 영역
vmalloc Region
该区域由内核函数vmalloc
来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc
할당된 선형 주소에 해당하는 물리적 페이지는 low-end 메모리에 있을 수도 있고 high-end 메모리에 있을 수도 있습니다.
영구 메모리 매핑 영역
Persistent Kernel Mapping Region
该区域可访问高端内存。访问方法是使用 alloc_page (_GFP_HIGHMEM)
分配高端内存页或者使用kmap
함수는 할당된 고급 메모리를 이 영역에 매핑합니다.
고정 매핑 영역
Fixing kernel Mapping Region
该区域和 4G 的顶端只有 4k 的隔离带,其每个地址项都服务于特定的用途,如 ACPI_BASE
등등.

커널 공간 물리적 메모리 매핑
리뷰
위에서 이야기할 내용이 많으니 다음 섹션으로 넘어가지 마세요. 그 전에 위에서 말한 내용을 검토해 보겠습니다. 위의 장을 주의 깊게 읽으셨다면 여기에 또 다른 그림이 그려져 있으며 이제 여러분은 메모리 관리에 대한 전체적인 그림을 마음 속에 갖게 되실 것입니다.

커널 공간과 사용자 공간 전체 그림
메모리 데이터 구조
커널이 시스템에서 가상 메모리를 관리하려면 메모리 관리 데이터 구조를 추상화해야 합니다. "할당, 해제 등"과 같은 메모리 관리 작업은 이러한 데이터 구조 작업을 기반으로 합니다. 가상 메모리 영역을 관리하는 구조입니다.
사용자 공간 메모리 데이터 구조
이전 장 "프로세스와 메모리"에서 Linux 프로세스는 5가지 메모리 영역, 즉 코드 세그먼트, 데이터 세그먼트, BSS
、堆、栈,内核管理这些区域的方式是,将这些内存区域抽象成vm_area_struct
메모리 관리 개체로 나눌 수 있다고 언급했습니다.
vm_area_struct
是描述进程地址空间的基本管理单元,一个进程往往需要多个vm_area_struct
来描述它的用户空间虚拟地址,需要使用「链表」和「红黑树」来组织各个vm_area_struct
.
연결된 목록은 모든 노드를 탐색해야 할 때 사용되는 반면, 레드-블랙 트리는 주소 공간에서 특정 메모리 영역을 찾는 데 적합합니다. 커널은 메모리 영역에서 다양한 작업에 대한 고성능을 달성하기 위해 두 가지 데이터 구조를 모두 사용합니다.
사용자 공간 프로세스의 주소 관리 모델:

wm_arem_struct
커널 공간은 메모리 데이터 구조를 동적으로 할당합니다
커널 공간 장에서 "동적 메모리 매핑 영역"에 대해 언급했습니다. 커널 함수에 의해 할당된 선형 주소에 해당하는 물리적 페이지vmalloc
来分配,特点是:线性空间连续,但是对应的物理地址空间不一定连续。vmalloc
는 저사양 메모리에 있을 수도 있고 고급 메모리에 있을 수도 있습니다.
vmalloc
分配的地址则限于vmalloc_start
与vmalloc_end
之间。每一块vmalloc
分配的内核虚拟内存都对应一个vm_struct
结构体,不同的内核空间虚拟地址之间有4k
크기 교차 방지 자유 영역 파티션.
사용자 공간의 가상 주소 특성과 유사하게 이러한 가상 주소는 물리적 메모리와 단순 매핑 관계를 갖지 않으며 커널 페이지 테이블을 통해 물리적 주소 또는 물리적 페이지로 변환되어야 하며 아직 매핑되지 않았을 수 있습니다. 페이지 부재가 발생할 때까지 매핑되지 않습니다. 실제로 물리적 페이지를 할당합니다.

동적 메모리 매핑
요약하자면
Linux
메모리 관리는 매우 복잡한 시스템입니다. 이 기사에서 설명하는 내용은 거시적 관점에서 메모리 관리의 전체 그림을 보여 주지만 일반적으로 채팅을 할 때는 이 지식만으로도 충분합니다. 물론 나는 또한 모두가 독서를 통해 더 깊은 원리를 이해할 수 있기를 바랍니다.
이 글은 특정 포인트를 깊이 있게 공부하고 싶을 때, 이 장들에서 진입점을 찾을 수 있고, 메모리 관리의 거시적 관점에서 이 지식 포인트의 위치를 찾아볼 수 있는 색인형 학습 가이드로 활용될 수 있습니다.
이 글을 작성하면서 지식 지표로 활용할 수 있는 예제 다이어그램도 많이 그렸습니다. 개인적으로는 글을 읽는 것보다 사진을 보는 것이 더 명확하다고 생각합니다. 내 공식 계정 "백엔드 기술 학교" 배경에 있는 "Management" 이 사진의 고해상도 원본입니다.
오래된 규칙입니다. 기사의 목적은 지식을 공유하는 것입니다. 기술적인 기사의 경우 기사에 명백한 오류가 있는 경우 최대한 정확성을 보장하기 위해 반복적으로 확인하겠습니다. 함께 토론을 통해 배워봅시다. 오늘의 기술 공유는 여기까지입니다. 다음 호에서 만나요.
위 내용은 Linux 메모리 관리를 이해하지 못한다고 말하지 마세요. 10장의 사진을 통해 이해하실 수 있습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Centos와 Ubuntu의 주요 차이점은 다음과 같습니다. Origin (Centos는 Red Hat, Enterprise의 경우, Ubuntu는 Debian에서 시작하여 개인의 경우), 패키지 관리 (Centos는 안정성에 중점을 둡니다. Ubuntu는 APT를 사용하여 APT를 사용합니다), 지원주기 (Ubuntu는 5 년 동안 LTS 지원을 제공합니다), 커뮤니티에 중점을 둔다 (Centos Conciors on ubuntu). 튜토리얼 및 문서), 사용 (Centos는 서버에 편향되어 있으며 Ubuntu는 서버 및 데스크탑에 적합), 다른 차이점에는 설치 단순성 (Centos는 얇음)이 포함됩니다.

CentOS 설치 단계 : ISO 이미지를 다운로드하고 부팅 가능한 미디어를 실행하십시오. 부팅하고 설치 소스를 선택하십시오. 언어 및 키보드 레이아웃을 선택하십시오. 네트워크 구성; 하드 디스크를 분할; 시스템 시계를 설정하십시오. 루트 사용자를 만듭니다. 소프트웨어 패키지를 선택하십시오. 설치를 시작하십시오. 설치가 완료된 후 하드 디스크에서 다시 시작하고 부팅하십시오.

Centos는 2024 년에 상류 분포 인 RHEL 8이 종료 되었기 때문에 폐쇄 될 것입니다. 이 종료는 CentOS 8 시스템에 영향을 미쳐 업데이트를 계속받지 못하게합니다. 사용자는 마이그레이션을 계획해야하며 시스템을 안전하고 안정적으로 유지하기 위해 Centos Stream, Almalinux 및 Rocky Linux가 포함됩니다.

CentOS 시스템 하에서 Gitlab의 백업 및 복구 정책 데이터 보안 및 복구 가능성을 보장하기 위해 CentOS의 Gitlab은 다양한 백업 방법을 제공합니다. 이 기사는 완전한 GITLAB 백업 및 복구 전략을 설정하는 데 도움이되는 몇 가지 일반적인 백업 방법, 구성 매개 변수 및 복구 프로세스를 자세히 소개합니다. 1. 수동 백업 gitlab-rakegitlab : 백업 : 명령을 작성하여 수동 백업을 실행하십시오. 이 명령은 gitlab 저장소, 데이터베이스, 사용자, 사용자 그룹, 키 및 권한과 같은 주요 정보를 백업합니다. 기본 백업 파일은/var/opt/gitlab/backups 디렉토리에 저장됩니다. /etc /gitlab을 수정할 수 있습니다

Docker는 Linux 커널 기능을 사용하여 효율적이고 고립 된 응용 프로그램 실행 환경을 제공합니다. 작동 원리는 다음과 같습니다. 1. 거울은 읽기 전용 템플릿으로 사용되며, 여기에는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함합니다. 2. Union 파일 시스템 (Unionfs)은 여러 파일 시스템을 스택하고 차이점 만 저장하고 공간을 절약하고 속도를 높입니다. 3. 데몬은 거울과 컨테이너를 관리하고 클라이언트는 상호 작용을 위해 사용합니다. 4. 네임 스페이스 및 CGroup은 컨테이너 격리 및 자원 제한을 구현합니다. 5. 다중 네트워크 모드는 컨테이너 상호 연결을 지원합니다. 이러한 핵심 개념을 이해 함으로써만 Docker를 더 잘 활용할 수 있습니다.

Docker Desktop을 사용하는 방법? Docker Desktop은 로컬 머신에서 Docker 컨테이너를 실행하는 도구입니다. 사용 단계는 다음과 같습니다. 1. Docker Desktop 설치; 2. Docker Desktop을 시작하십시오. 3. Docker 이미지를 만듭니다 (Dockerfile 사용); 4. Docker Image 빌드 (Docker 빌드 사용); 5. 도커 컨테이너를 실행하십시오 (Docker Run 사용).

Centos Hard Disk Mount는 다음 단계로 나뉩니다. 하드 디스크 장치 이름 (/dev/sdx)을 결정하십시오. 마운트 포인트를 만듭니다 ( /mnt /newdisk를 사용하는 것이 좋습니다); 마운트 명령을 실행합니다 (mount /dev /sdx1 /mnt /newdisk); 영구 마운트 구성을 추가하려면 /etc /fstab 파일을 편집하십시오. Umount 명령을 사용하여 장치를 제거하여 프로세스가 장치를 사용하지 않도록하십시오.

Centos가 중단 된 후 사용자는 다음과 같은 조치를 취할 수 있습니다. Almalinux, Rocky Linux 및 Centos 스트림과 같은 호환되는 분포를 선택하십시오. Red Hat Enterprise Linux, Oracle Linux와 같은 상업 분포로 마이그레이션합니다. Centos 9 Stream : 롤링 분포로 업그레이드하여 최신 기술을 제공합니다. Ubuntu, Debian과 같은 다른 Linux 배포판을 선택하십시오. 컨테이너, 가상 머신 또는 클라우드 플랫폼과 같은 다른 옵션을 평가하십시오.
