Интервью попросили понять управление памятью Linux? 10 картинок четко расставлены для вас!

Linux

Брат Лемон разобрал 50 электронных книг, связанных с компьютерами, подписался на публичный аккаунт «Школа внутренних технологий», ответил «1024», и я отправлю его вам, и ответил «Войти в группу», чтобы втянуть вас в читалку. группа по обмену технологиями сотен человек.

Давайте изучим это сегодняLinuxуправление памятью. для опытныхCURDодноклассники по бизнесу, управление памятью, кажется, далеко от нас, но, хотя этот пункт знаний непопулярен (подсчитано, что многие люди не имеют возможности использовать его после изучения), он определенно является основой основ. Немедленного эффекта после этого вы не увидите, но это будет очень полезно для вашей будущей работы по развитию, потому что вы стоите выше.

Все примеры картинок в статье нарисованы мной.Рисование картинок занимает больше времени, чем кодирование, но чтение картинок более интуитивно понятно, чем текст.Для студентов, которым нужны картинки-примеры высокой четкости, есть способ получить их в конце статья.

Чтобы быть более утилитарным, если вы ненароком покажете, что знаете это знание во время собеседования, а вы можете сказать раз, два или три, это может вызвать больший интерес у интервьюера к вам, получить повышение и повысить зарплату, и достичь пика. жизни снова, на шаг ближе.

image

Соглашение о предпосылке: в этой статье обсуждается предпосылка технического содержания, среда операционной системы — это всеx8632-битная архитектураLinuxсистема.

виртуальный адрес

Даже в современной операционной системе память по-прежнему является очень ценным ресурсом в компьютере.Просто посмотрите, сколько терабайт твердотельных накопителей в вашем компьютере, а затем посмотрите на размер памяти. Чтобы в полной мере использовать ресурсы системной памяти и управлять ими, Linux использует технологию управления виртуальной памятью, которая позволяет каждому процессу иметь4GBНемешающее виртуальное адресное пространство.

Выделение и операция инициализации процесса основаны на этом «виртуальном адресе».Только когда процессу требуется фактический доступ к ресурсам памяти, будет установлено сопоставление виртуального адреса и физического адреса и передано на страницу физической памяти.

Проведите неуместную аналогию. Фактически этот принцип аналогичен текущему сетевому диску XX.1TB, неужели вы думаете, что вам дадут столько места на одном дыхании? Это еще слишком молодо, это выделение места для вас, когда вы кладете в него вещи, и дает вам столько фактического пространства, сколько вы вкладываете, но вы и ваши друзья выглядите так, как будто оно есть у всех.1TBтакое же пространство.

img

Преимущества виртуальных адресов

  • Предотвратите прямой доступ пользователей к адресам физической памяти, предотвратите некоторые деструктивные операции и защитите операционную систему.
  • Каждому процессу выделяется 4 ГБ виртуальной памяти, и пользовательские программы могут использовать большее адресное пространство, чем реальная физическая память.

4GBВиртуальное адресное пространство процесса разделено на две части: «пространство пользователя» и «пространство ядра».

用户空间内核空间

Физический адрес

В приведенной выше главе мы уже знаем, что в пространстве пользователя или в пространстве ядра используются виртуальные адреса. будут перенесены в физическую память.

Преобразование виртуального адреса в физический адрес памяти, что предполагает использованиеMMUБлок управления памятью (Memory Management Unit) выполняет сегментацию виртуальных адресов и пейджинговую (segment page) трансляцию адресов. Конкретный процесс сегментации и пейджинга здесь повторяться не будет. Вы можете обратиться к любому учебнику по принципам компоновки компьютера.

段页式内存管理地址转换

LinuxЯдро делит физическую память на три области управления, а именно:

ZONE_DMA

DMAобласть памяти. Содержит кадры страниц памяти от 0 МБ до 16 МБ, которые могут бытьISAоборудование черезDMAИспользуйте, сопоставьте непосредственно с адресным пространством ядра.

ZONE_NORMAL

Обычная область памяти. Содержит фреймы страниц памяти размером от 16 МБ до 896 МБ, обычные фреймы страниц, которые напрямую отображаются в адресное пространство ядра.

ZONE_HIGHMEM

Высокопроизводительная область памяти. Фрейм страницы памяти, содержащий более 896 МБ, напрямую не отображается, и доступ к этой части кадра страницы памяти можно получить с помощью постоянного и временного сопоставления.

物理内存区划分

пользовательское пространство

Пользовательские процессы могут получить доступ к «пользовательскому пространству», каждый процесс имеет свое собственное независимое пользовательское пространство, а виртуальный адрес находится в диапазоне от0x00000000к0xBFFFFFFFОбщая емкость 3G.

Пользовательские процессы обычно имеют доступ только к виртуальным адресам в пространстве пользователя и могут обращаться к пространству ядра только при выполнении операций перехвата или системных вызовов.

процесс и память

Пользовательское пространство, занимаемое процессом (исполняемой программой), делится на5различные области памяти. Атрибуты доступа относятся к «доступному для чтения, записи, исполняемому файлу и т. д.».

  • фрагмент кода

    Сегмент кода служит для хранения в памяти инструкций по работе исполняемого файла, образа исполняемой программы. Сегмент кода должен быть защищен от нелегальной модификации во время выполнения, поэтому разрешены только операции чтения, он не доступен для записи.

  • сегмент данных

    Сегмент данных используется для хранения инициализированных глобальных переменных в исполняемом файле, другими словами, для хранения статически выделенных переменных и глобальных переменных программы.

  • сегмент BSS

    BSSСегмент содержит неинициализированные глобальные переменные в программе, в памятиbssВсе сегменты обнуляются.

  • куча heap

    Куча используется для хранения динамически выделяемого сегмента памяти во время работы процесса, ее размер не является фиксированным и может динамически увеличиваться или уменьшаться. Когда процесс вызывает для выделения памяти такие функции, как malloc, вновь выделенная память динамически добавляется в кучу (куча расширяется); когда память освобождается такими функциями, как free, освобожденная память удаляется из кучи (т. куча уменьшилась)

  • кучаstack

    Стек — это локальная переменная, временно созданная пользователем для хранения программы, то есть переменная, определенная в функции (но не включающаяstaticОбъявленная переменная, static означает сохранение переменной в сегменте данных). Кроме того, при вызове функции ее параметры также будут помещены в стек процесса, инициировавшего вызов, а после завершения вызова возвращаемое значение функции также будет сохранено обратно в стек. Из-за того, что стеки работают по принципу «первым поступил — первым обслужен», стеки особенно удобны для сохранения/восстановления мест вызова. В этом смысле мы можем думать о стеке как об области памяти для регистрации и обмена временными данными.

Сегменты данных в вышеупомянутых областях памяти,BSSСегменты и кучи обычно хранятся в памяти непрерывно и расположены последовательно, в то время как сегменты кода и стеки часто хранятся независимо. Области кучи и стекаi386В архитектуре стек расширяется вниз, а куча расширяется вверх.程序内存区域分段

Вы также можете использовать его под linuxsizeКоманда для просмотра размера каждой области памяти скомпилированной программы:

[lemon ~]# size /usr/local/sbin/sshd
   text	   data	    bss	    dec	    hex	filename
1924532	  12412	 426896	2363840	 2411c0	/usr/local/sbin/sshd

пространство ядра

существуетx86 32В битовой системе адресное пространство ядра Linux относится к виртуальным адресам из0xC0000000начать0xFFFFFFFFАдресное пространство верхней памяти до, всего1GЕмкость включает в себя образ ядра, физическую таблицу страниц, драйверы и т. д., работающие в пространстве ядра.

内核空间细分区域.

Непосредственно нанесенная на карту область

Непосредственно нанесенная на карту областьDirect Memory Region: Начиная с начального адреса пространства ядра, максимальное896MДиапазон адресов пространства ядра — это область прямого отображения памяти.

«Линейный адрес» области прямого отображения размером 896 МБ находится непосредственно перед «физическим адресом».896MBВыполняется сопоставление, то есть линейный адрес и выделенный физический адрес являются смежными. Линейный адрес адресного пространства ядра0xC0000001Соответствующий физический адрес0x00000001, они отличаются смещениемPAGE_OFFSET = 0xC0000000

Существует зависимость линейного преобразования между линейным адресом и физическим адресом этой области. «Линейный адрес =PAGE_OFFSET+физический адрес" также можно использоватьvirt_to_phys() Функция преобразует линейные адреса в виртуальном пространстве ядра в физические адреса.

Линейное адресное пространство памяти высокого класса

Линейный адрес пространства ядра находится в диапазоне от 896M до 1G, а диапазон адресов емкостью 128 МБ является линейным адресным пространством памяти высокого класса.Почему он называется линейным адресным пространством памяти высокого уровня? Вот вам объяснение:

Как упоминалось ранее, общий размер пространства ядра составляет 1 ГБ, а линейный адрес 896 МБ, начинающийся с начального адреса пространства ядра, может быть напрямую сопоставлен с диапазоном адресов с размером физического адреса 896 МБ. Возвращаясь на десять тысяч шагов назад, даже если линейный адрес пространства ядра размером 1 ГБ отображается на физический адрес, он может адресовать только диапазон адресов физической памяти размером до 1 ГБ.

Насколько велика ваша карта памяти сейчас? На дворе почти 2020 год, а память обычных ПК больше 1 Гб!

Таким образом, пространство ядра берет последний 128-мегабайтный диапазон адресов и делит его на следующие три высокопроизводительные области отображения памяти для адресации всего диапазона физических адресов. В 64-битной системе такой проблемы нет, потому что доступное линейное адресное пространство намного больше, чем устанавливаемая память.

карта динамической памяти

vmalloc RegionЭта область контролируется функцией ядраvmallocДля выделения характерны следующие характеристики: линейное пространство является непрерывным, но соответствующее физическое адресное пространство не обязательно является непрерывным.vmallocФизическая страница, соответствующая выделенному линейному адресу, может находиться в младшей или старшей памяти.

карта постоянной памяти

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 Управление памятью - очень сложная система. Эта статья - лишь вершина айсберга. Она покажет вам всю картину управления памятью с макро-ракурса. В общем, этих знаний достаточно, когда вы общаетесь с интервьюером. Конечно, Я также надеюсь, что вы сможете понять более глубокие принципы через чтение.

Я надеюсь, что эта статья может быть использована в качестве учебного пособия, подобного указателю.Если вы хотите изучить определенный момент, вы можете найти точку входа в этих главах и расположение этой точки знаний в макросе управления памятью.

В процессе создания этой статьи я также нарисовал много примеров диаграмм, которые можно использовать в качестве указателя знаний. Лично я считаю, что читать изображения понятнее, чем читать текст. Вы можете ответить на «Управление памятью» в фон моей официальной учетной записи "Школа внутренних технологий", чтобы получить эти фотографии оригинальное изображение высокой четкости.

Старые правила, спасибо за чтение, цель статьи - поделиться пониманием знаний, и я буду неоднократно проверять технические статьи, чтобы обеспечить максимальную точность.Если в статье есть очевидные ошибки, вы Добро пожаловать, чтобы указать. На сегодняшнем обмене технологиями все, увидимся в следующий раз.

Оригинальность непростая.Видеть это, если есть небольшой выигрыш для меня, двигать пальцами "вперед" и "смотреть" - это самая большая поддержка для меня.

Еще мои отличные статьи:

Очень подробный обзор пути изучения Linux C/C++! Получил предложение Tencent
Интервьюер пришел снова звонить вам, чтобы построить самолет. Давайте поговорим о том, как спроектировать интерфейс микросервиса?
Микросервисы, управление сервисами, RPC, микросервисные фреймворки следующего поколения, о которых спрашивают в интервью... Эта статья поможет вам досконально разобраться!
Не паникуйте, если есть проблема с "процессом" под Linux, опытные программисты научат вас 6 трюкам, как это сделать!
Интервьюер: Вы сказали, что знакомы с делами MySQL? Тогда я задам вам 10 вопросов
Я использовал большие данные, чтобы проанализировать потребности в найме более 1000 рабочих мест в городах первого уровня и рассказать вам, как найти работу с научной точки зрения.
Интервью с Tencent по фоновой разработке, письменный тест, справочные заметки по C++
Ты еще можешь так играть? Я использую VsCode для рисования диаграмм классов, блок-схем, диаграмм последовательности и диаграмм состояний.
Интервьюер: Сколько типов распределенных блокировок Redis вы знаете? Я буду три!
Самый подробный учебник по созданию личного блога GithubPages + блог в простом стиле Jekyll

Создать не просто, ставьте лайки, подписывайтесь и поддерживайте

Вы можете выполнить поиск в общедоступной учетной записи «Школа бэкэнд-технологий» на WeChat и ответить на «1024», чтобы получить 50 компьютерных электронных книг, и ответить на «Присоединиться к группе», чтобы втянуть вас в толпу читателей технического обмена. обновляется каждую неделю До встречи в следующем выпуске!