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

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

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

Итак, поехали.

В качестве первой темы выбрал подсистему памяти в linux системах.

  • Для мультипроцессорных систем основная архитектура работы с виртуальной памятью называется NUMA. Вкратце смысл в том, что каждый процессор обращается к той памяти, которые находятся «ближе» к нему, а значит работа с ними будет быстрее.
  • Каждая часть памяти выделяемая отдельному CPU, называется нодой (node).
  • Каждая нода делится на блоки под названием зоны (zones). Каждая из зон представляет собой отдельный диапазон памяти.

Зоны могут быть например Zone_DMA (direct memory access) — первые 16MB памяти и Zone_DMA32 — 4GB. (/proc/zoneinfo)

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

Это сделано для более удобного и гибкого управления памятью, приложениями, и/или системой. Также позволяет не заботиться разработчикам и их приложениям о структуре физической памяти, интерфейсе её подключения и тд.

  • Виртуальная память — это адресное пространство процесса.
  • Виртуальная память делится на страницы, стандартного размера — 4KB. Также есть возможность использования бОльших страниц, с помощью так называемых hugepages, которые поддерживаются большинством современных CPU. huge pages бывают 2MB и 1GB. Понятно, что увеличение размера страниц, сокращает их общее количество, и как следствие повышает эффективность работы.
  • Благодаря виртуализации памяти, процессы могут получать больше памяти, чем доступно физически. Это регулируется параметром overcommit.
  • Связь между виртуальной и физической памятью происходит с помощью page table. Это структура, содержащая маппинг адресов памяти, т.е. какой адрес виртуальной памяти, соответствует адресу физической.
  • Есть такая штука — TLB (translation lookaside buffer), который является ассоциативным кешем, и содержит ранее полученные маппинги. Делается это для ускорения процесса поиска и выделения адресов.
  • Во время «перевода» виртуального адреса в физический, может произойти ошибка, причиной тому могут служить:

— Запрашиваемого физического адреса не существует. Результат обычно — segmentation fault
— Физический адрес был перемещен в другое хранилище. Обычно такое случается при перемещении адреса в swap. При этом, во время его запрашивания, если физической памяти достаточно, происходит обратная запись страницы из swap в физическую память и отдается по запросу.

 

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

Продолжение, надеюсь следует.