Потрясающий! 20 фотографий раскрывают туман управления памятью

интервью задняя часть
Потрясающий! 20 фотографий раскрывают туман управления памятью
Ежедневный английский, улучшайте немного каждый день

предисловие

Многие читатели ранее сообщали мне, можете ли вы написать графическую операционную систему?

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

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

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

Даже если вы начнете изучать операционную систему с энтузиазмом, но3Через несколько минут на меня внезапно накатила сонливость. . .

Что должно быть проглочено, еще должно быть проглочено, что должно быть проиллюстрировано, еще должно быть проиллюстрировано, долгожданное»Графическая операционная системаСерия здесь.

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

Только что закончил, план этой статьи:

本文提纲
План этой статьи

текст

Виртуальная память

Если вы специализируетесь в области электроники, вы, должно быть, возились с однокристальными микрокомпьютерами в колледже.

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

Кроме того,ЦП однокристального микрокомпьютера напрямую управляет «физическим адресом» памяти..

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

Как операционная система решает эту проблему?

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

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

进程的中间层
средний слой процесса

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

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

Итак, вот понятия двух адресов:

  • Адрес памяти, используемый нашей программой, называетсяадрес виртуальной памяти(Virtual Memory Address)
  • Адрес пространства, реально существующий в аппаратном обеспечении, называетсяадрес физической памяти(Physical Memory Address).

Операционная система вводит виртуальную память, и виртуальный адрес, удерживаемый процессом, будет преобразован в физический адрес через отношение отображения блока управления памятью (MMU) в микросхеме ЦП, а затем доступ к памяти через физический адрес, как показано на следующем рисунке:

虚拟地址寻址
адресация виртуальных адресов

Как операционная система управляет взаимосвязью между виртуальными и физическими адресами?

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


сегментация памяти

Программа состоит из нескольких логических сегментов, таких как сегменты кода, сегменты данных, сегменты стека и сегменты кучи.Разные сегменты имеют разные атрибуты, поэтому используйте сегментацию (Segmentation), чтобы разделить эти сегменты.

Как в механизме сегментации сопоставляются виртуальные адреса и физические адреса?

Виртуальный адрес в рамках механизма сегментации состоит из двух частей:селектор сегментовиВнутрисегментное смещение.

内存分段-寻址的方式
сегментация памяти - адресация
  • селектор сегментовхранится в сегментном регистре. Самое главное в селекторе сегментовномер сегмента, используемый в качестве индекса в таблице сегментов.таблица сегментовВот что в нем хранитсяБазовый адрес сегмента, границы сегмента и уровень привилегийЖдать.

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

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

内存分段-虚拟地址与物理地址
Сегментация памяти — виртуальные адреса против физических адресов

Если мы хотим получить доступ к виртуальному адресу со смещением 500 в сегменте 3, мы можем рассчитать физический адрес как базовый адрес сегмента 3 7000 + смещение 500 = 7500.

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

  • Первыйфрагментация памятиПроблема.
  • ВторойНеэффективная подкачка памятиПроблема.

Далее поговорим о том, почему возникают эти две проблемы.

Давайте сначала посмотрим, почему сегментация вызывает фрагментацию памяти?

Давайте рассмотрим такой пример. Предположим, имеется 1 Гб физической памяти, и пользователь выполняет несколько программ, среди которых:

  • Игра занимает 512 Мб памяти.
  • Браузер занимает 128 МБ памяти
  • Музыка занимает 256 МБ памяти.

В это время, если мы закроем браузер, остается 1024 - 512 - 256 = 256 МБ свободной памяти.

Если эти 256 МБ не являются смежными, они делятся на две части памяти по 128 МБ, в результате чего не остается места для открытия другой программы размером 200 МБ.

内存碎片的问题
проблема с фрагментацией памяти

Здесь есть два места для проблемы фрагментации памяти:

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

Для двух вышеупомянутых проблем с фрагментацией памяти решения будут разными.

Решение проблемы фрагментации внешней памятиподкачка памяти.

Память объемом 256 МБ, занимаемая музыкальной программой, может быть записана на жесткий диск, а затем считана с жесткого диска в память. Однако при обратном чтении мы не можем загрузить его обратно в исходное место, а сразу следим за занятыми 512 МБ памяти. Это освобождает 256 МБ непрерывного пространства, поэтому можно загрузить новую программу размером 200 МБ.

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

Давайте посмотрим, почему сегментация приводит к неэффективной подкачке памяти?

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

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

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

Для решения проблем фрагментации памяти и низкой эффективности обмена памятью при сегментации памяти появляется пейджинг.


подкачка памяти

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

Чтобы решить эти проблемы, мы должны придумать способ уменьшить фрагментацию памяти. Кроме того, когда требуется подкачка памяти, требуется записать или загрузить с диска меньше данных, и проблема может быть решена. Этот методподкачка памяти(Paging).

Пейджинг заключается в разрезании всего пространства виртуальной и физической памяти на сегменты фиксированного размера.. Такое непрерывное пространство памяти фиксированного размера мы называемСтраница(Page). В Linux размер каждой страницы4KB.

Переход между виртуальным адресом и физическим адресомтаблица страницна карту, как показано ниже:

内存映射
карта памяти

Таблица страниц фактически хранится в процессоре.блок управления памятью(MMU), поэтому ЦП может напрямую найти адрес физической памяти, к которому можно получить доступ через MMU.

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

Как пейджинг решает проблемы фрагментации сегментированной памяти и низкой эффективности обмена памятью?

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

Если места в памяти недостаточно, операционная система освободит «недавно неиспользуемые» страницы памяти в других запущенных процессах, то есть временно запишет их на жесткий диск, называемыйпоменять(Swap Out). При необходимости он снова загружается, вызываетсяпоменять местами(Swap In). Поэтому за один раз на диск записывается всего несколько страниц или несколько страниц, и это не займет слишком много времени.Эффективность подкачки памяти относительно высока.

换入换出
поменять местами поменять местами

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

Как виртуальные адреса и физические адреса сопоставляются в механизме пейджинга?

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

内存分页寻址
подкачка памяти

Подводя итог, можно сказать, что трансляция адреса памяти состоит из трех шагов:

  • Разделить адрес виртуальной памяти на номера страниц и смещения;
  • В соответствии с номером страницы из таблицы страниц запросите соответствующий номер физической страницы;
  • Возьмите номер физической страницы напрямую и добавьте предыдущее смещение, чтобы получить адрес физической памяти.

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

虚拟页与物理页的映射
Сопоставление виртуальных страниц с физическими страницами

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

Есть ли подводные камни в простой нумерации страниц?

Есть дефицит места.

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

В 32-разрядной среде виртуальное адресное пространство имеет общий размер 4 ГБ. Если предположить, что размер страницы составляет 4 КБ (2 ^ 12), то требуется около 1 миллиона (2 ^ 20) страниц, и каждая "таблица страниц entry" требуется размер 4 байта для хранения, то отображение всего пространства 4 ГБ должно иметь4MBпамяти для хранения таблиц страниц.

Эта таблица страниц размером 4 МБ не выглядит очень большой. Но вы должны знать, что у каждого процесса есть свое виртуальное адресное пространство, а значит, и своя таблица страниц.

Так,100процесс, вам нужно400MBЭто очень большой объем памяти, не говоря уже о 64-битной среде.

многоуровневая таблица страниц

Для решения вышеуказанных проблем необходимо использовать метод, называемыймногоуровневая таблица страниц(Multi-Level Page Table) решение.

Ранее мы знали, что для реализации одностраничных таблиц в 32-битном формате и размере страницы4KBВ среде , таблица страниц процесса должна установить более 1 миллиона «записей таблицы страниц», и каждая запись таблицы страниц занимает 4 байта, что эквивалентно 4 МБ пространства для каждой таблицы страниц.

Мы разбиваем одноуровневую таблицу страниц из более чем 1 миллиона «записей таблицы страниц» и делим таблицу страниц (таблицу страниц первого уровня) на1024таблицы страниц (вторичные таблицы страниц), каждая таблица (вторичная таблица страниц) содержит1024"запись таблицы страниц", формирующаяВторичный пейджинг. Как показано ниже:

二级分页
Вторичный пейджинг

Вы можете спросить, если таблица второго уровня разделена, 4 КБ (таблица страниц первого уровня) + 4 МБ (таблица страниц второго уровня) требуется для сопоставления адресного пространства 4 ГБ, так не больше ли занимаемая площадь?

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

На самом деле, мы должны посмотреть на проблему под другим углом.Помните, что принципы компьютерной композиции вездесущи.принцип локальностиКакие?

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

Если используется вторичная подкачка, первичная таблица страниц может охватывать все 4 ГБ виртуального адресного пространства, ноЕсли запись таблицы страниц таблицы страниц первого уровня не используется, нет необходимости создавать таблицу страниц второго уровня, соответствующую этой записи таблицы страниц, то есть таблицу страниц второго уровня можно создавать только при необходимости. .. Сделайте простой расчет, предполагая, что используется только 20% записей таблицы страниц первого уровня, тогда объем памяти, занимаемый таблицей страниц, составляет всего 4 КБ (таблица страниц первого уровня) + 20% * 4 МБ (страница второго уровня). таблица) =0.804MB, что соответствует одноуровневой таблице страниц4MBЭто большая экономия?

Так почему же неуровневые таблицы страниц не могут сделать это для экономии памяти? Исходя из природы таблицы страниц, ответственность таблицы страниц, хранящейся в памяти, заключается в преобразовании виртуальных адресов в физические адреса. Если виртуальный адрес не может найти соответствующую запись таблицы страниц в таблице страниц, компьютерная система не может работать. такТаблица страниц должна охватывать все виртуальное адресное пространство.Неклассифицированной таблице страниц требуется более 1 миллиона записей таблицы страниц для сопоставления, в то время как для подкачки второго уровня требуется только 1024 записи таблицы страниц.(В настоящее время таблица страниц первого уровня покрывает все виртуальное адресное пространство, а таблица страниц второго уровня создается по мере необходимости).

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

Для 64-битных систем двухуровневой подкачки явно недостаточно, и она становится четырехуровневой директорией, а именно:

  • Запись глобального каталога страниц PGD (Page Global Directory);
  • Элемент каталога верхней страницы PUD (Page Upper Directory);
  • Запись каталога промежуточных страниц PMD (Page Middle Directory);
  • Запись таблицы страниц PTE (Page Table Entry);
四级目录
четырехуровневый каталог

TLB

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

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

程序的局部性
место программы

Мы можем воспользоваться этой функцией для хранения наиболее часто используемых записей таблицы страниц на оборудовании с более высокой скоростью доступа, поэтому специалисты по информатике добавили таблицу страниц специально для хранения наиболее часто используемых таблиц страниц в микросхеме ЦП. этот Кэш является TLB (Translation Lookaside Buffer), широко известный как кэш таблицы страниц, кэш обхода передачи, быстрая таблица и т. д.

地址转换
перевод адреса

Внутри чипа ЦП блок управления памятью (Memory Management Unit), который используется для завершения преобразования адресов, доступа к TLB и взаимодействия с ним.

При использовании TLB при адресации ЦП сначала проверяет TLB, и если он не найден, он продолжает проверять обычную таблицу страниц.

Частота обращений TLB на самом деле очень высока, потому что есть всего несколько страниц, к которым программа обращается чаще всего.


управление сегментированной памятью

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

段页式地址空间
сегментированное адресное пространство

Как реализовано управление сегментированной страничной памятью:

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

Таким образом, адресная структура задается какНомер абзаца, номер страницы в абзаце и смещение в пределах страницыОн состоит из трех частей.

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

段页式管理中的段表、页表与内存的关系
Связь между таблицей сегментов, таблицей страниц и памятью в управлении страницами сегментов

Чтобы получить физический адрес в преобразовании адреса страницы сегмента, требуются три обращения к памяти:

  • Получите доступ к таблице сегментов в первый раз, чтобы получить начальный адрес таблицы страниц;
  • Получите доступ к таблице страниц во второй раз, чтобы получить номер физической страницы;
  • В третий раз номер физической страницы объединяется со смещением внутри страницы, чтобы получить физический адрес.

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


Управление памятью Linux

Итак, как операционная система Linux управляет памятью?

Прежде чем ответить на этот вопрос, мы должны взглянуть на историю развития процессоров Intel.

Ранние процессоры Intel из 80286 использовали сегментированное управление памятью. Но вскоре выяснилось, что управления сегментированной памятью без управления страничной памятью недостаточно, что сделало серию X86 неконкурентоспособной на рынке. Поэтому управление страничной памятью было реализовано в 80386 вскоре после этого. Другими словами, 80386 не только завершает и совершенствует управление сегментированной памятью, начиная с 80286, но также реализует управление памятью на основе страниц.

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

Поскольку адрес, отображаемый при управлении сегментированной памятью, в настоящее время больше не является «физическим адресом», Intel называет его «линейным адресом» (также называемым виртуальным адресом). Таким образом, управление сегментированной памятью сначала сопоставляет логические адреса с линейными адресами, а затем управление страничной памятью сопоставляет линейные адреса с физическими адресами.

Intel X86 逻辑地址解析过程
Процесс разрешения логического адреса Intel X86

Вот логические адреса и линейные адреса:

  • Адрес, используемый программой, обычно адрес, который не отображается при управлении сегментированной памятью, называется логическим адресом;
  • Адреса, отображаемые посредством управления сегментированной памятью, называются линейными адресами, также называемыми виртуальными адресами;

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

Разобравшись с историей развития процессоров Intel, поговорим о том, как Linux управляет памятью?

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

В основном это вызвано историей развития процессора Intel, описанного выше, поскольку ЦП Intel X86 всегда выполняет сопоставление сегментов с адресами, используемыми в программе, перед сопоставлением страниц. Поскольку аппаратная структура ЦП такова, ядро ​​Linux должно подчиняться выбору Intel.

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

Каждый сегмент в системе Linux представляет собой все 4 ГБ виртуального пространства (в 32-разрядной среде), начиная с адреса 0, то есть начальный адрес всех сегментов одинаков. Это означает, что код в системе Linux, включая код самой операционной системы и код приложения, обращен к адресному пространству линейного адресного пространства (виртуального адреса), что эквивалентно экранированию логического адреса в процессоре. Сегменты используются только для контроля доступа и защиты памяти.

Давайте еще раз посмотрим, как распределяется виртуальное адресное пространство Linux?

В операционной системе Linux внутренняя часть виртуального адресного пространства разделена наПространство ядра и пространство пользователяДве части, системы с разным количеством битов, имеют разные диапазоны адресного пространства. Например, наиболее распространенными 32-битными и 64-битными системами являются следующие:

用户空间与内存空间
Пользовательское пространство и объем памяти

Отсюда видно:

  • 32Занятие пространства ядра битовой системы1G, в высшей точке, остальные3Gпользовательское пространство;
  • 64И пространство ядра, и пространство пользователя битовой системы128T, занимают верхнюю и нижнюю части всего пространства памяти соответственно, а остальная часть средней части не определена.

Давайте поговорим о разнице между пространством ядра и пространством пользователя:

  • Когда процесс находится в пользовательском режиме, он может обращаться только к памяти пользовательского пространства;
  • Только после входа в режим ядра можно получить доступ к памяти в пространстве ядра;

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

每个进程的内核空间都是一致的
Пространство ядра каждого процесса согласовано

Далее узнайте больше о разделении виртуального пространства.Разделение пространства пользователя и пространства ядра отличается, и распределение пространства ядра не будет обсуждаться.

Давайте взглянем на распределение пользовательского пространства Взяв за пример 32-битную систему, я нарисовал диаграмму, чтобы показать их взаимосвязь:

虚拟内存空间划分
Разделение пространства виртуальной памяти

На этом рисунке вы можете видеть, что память пользовательского пространства, изснизу вверхСуществует 7 различных сегментов памяти:

  • Сегменты программных файлов, включая двоичный исполняемый код;
  • Инициализированные сегменты данных, включая статические константы;
  • Неинициализированные сегменты данных, включая неинициализированные статические переменные;
  • Сегменты кучи, включая динамически выделяемую память, растут вверх от младших адресов;
  • Сегмент сопоставления файлов, включая динамические библиотеки, разделяемую память и т. д., начинается с младших адресов и растет вверх (Зависит от железа и версии ядра);
  • Сегмент стека, включая локальные переменные и контекст вызовов функций и т. д. Размер стека фиксирован, как правило8 MB. Конечно, система также предоставляет параметры, чтобы мы могли настроить размер;

Среди 7 сегментов памяти динамически выделяется память кучи и файловых сегментов. Например, используя стандартную библиотеку Cmalloc()илиmmap(), вы можете динамически выделять память в сегментах отображения кучи и файлов соответственно.


резюме резюме

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

У каждого процесса есть свое виртуальное пространство, а физическая память всего одна, поэтому при включении большого количества процессов физической памяти неизбежно будет очень тесно, поэтому операционная система пройдетподкачка памятиТехнология, которая временно сохраняет редко используемую память на жестком диске (заменяет ее), а затем при необходимости загружает ее обратно в физическую память (заменяет).

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

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

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

В результате появляется подкачка памяти, разделяющая виртуальное пространство и физическое пространство на страницы фиксированного размера.Например, в системе Linux размер каждой страницы составляет4KB. После пейджинга не будет небольшой фрагментации памяти. При этом при обмене памяти на жесткий диск записывается только одна страница или несколько страниц, что значительно повышает эффективность обмена памяти.

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

Система Linux в основном использует управление страницами, но из-за истории развития процессоров Intel система Linux не может избежать управления сегментами.. Таким образом, Linux устанавливает базовый адрес всех сегментов в0, что означает, что адресное пространство всех программ представляет собой линейное адресное пространство (виртуальный адрес), что эквивалентно экранированию концепции логических адресов ЦП, поэтому сегменты используются только для контроля доступа и защиты памяти.

Кроме того, распределение виртуального пространства в системе Linxu можно разделить наПользовательский режимиСостояние ядраДве части, включая распределение пользовательского режима: сегмент кода, глобальная переменная, BSS, стек функций, куча памяти, область отображения.


Нытье

Опубликовано300PDF-файл страницы "Иллюстрированная сеть" также был доступен некоторое время. Недавно я получил много отзывов об ошибках от читателей, большинство из которых являются опечатками и упущениями. Я очень благодарен этим читателям, которые внимательно прочитали PDF-файл.

Среди них есть очень хардкорный читатель, который исправил все опечатки в PDF почти из 9W слов.

И очень подробно, до какой степени? Слишком много пробелов для деталей, неправильная пунктуация, разница между «в» и «ре» и так далее. .

Позвольте мне показать вам, как много Кобаяши написал.BUG. . .

Эти красные строки - записи, исправленные этим читателем. Еще раз спасибо этому заядлому и внимательному читателю. Если честно, Кобаяши очень гордится такими читателями, ха-ха.

Кобаяши также переделал PDF, вы можете повторно загрузить исправленный «Illustration Network V2.0»,Ответьте в «Сети» на официальном аккаунте, чтобы получить ссылку для скачивания.

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

公众号回复「网络」获取下载地址
Официальный аккаунт отвечает на «Сеть», чтобы получить адрес загрузки.

Кобаяши — человек-инструмент, созданный для всех. До свидания, увидимся в следующий раз!