Исторический обзор управления оперативной памятью в ОС

Вступление

Были времена когда люди радовались каждому байту памяти. Программисты трепетно ужимали свои программы под ограниченную память. Никто и помыслить не мог, что однажды мир изменится. Сейчас фото с камеры вашего смартфона весит больше чем содержимое дискеты. Однако, это было прекрасное время когда продвинутые пользователи делились хитростями такими как: XOR-обмен содержимого двух переменных без использования других переменных.

Допустим, у нас есть две переменные, которые мы представим в двоичной системе исчисления: A=1010 (10 — в десятичной системе) и B=0100 (4 — в десятичной системе), обменяем их содержимое при помощи булевой операции «ИСКЛЮЧАЮЩЕГО ИЛИ».

  • A = A XOR B = 1010 XOR 0100 = 1110
  • B = A XOR B = 1110 XOR 0100 = 1010
  • A = A XOR B = 1110 XOR 1010 = 0100

В результате, A=0100 и B=1010. Сейчас это звучит странно, но таким способом можно экономить оперативную память. Этот способ разделяет ограниченные ресурсы во времени и позволяет обойтись меньшим количеством ресурсов. Основной недостаток данного подхода — время требуемое на выполнение операций.

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

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

  • Опция «-O1» (тоже самое что «-O») — компилятор пытается уменьшить размер кода и время выполнения программы, без существенного влияния на скорость компиляции.
  • Опция «-O2» — не ищет компромиса между местом и скоростью выполнения.
  • И наконец, самая дикая оптимизация — «-O3».

От реле, вакуумных ламп и транзисторов к ЦП

Первые не механические вычислительные машины использовали реле в качестве базовых элементов. Такой была машина Z1 созданная в фашистской Германии Конрадом Цузе в 1938 году. Машины которые использовали электронные реле назывались машинами с релейной логикой.

Последующие машины Цузе назывались Z2 и Z3. Память для данных последней, содержала 64 22-битовых слова, а вес превышал одну тонну. В качестве носителя информации использовали целлулоидную ленту. Общая мощность Z3 — 4000 Ватт. Для сравнения сборка из 6 видеокарт NVIDIA GTX1080Ti для майнинга криптовалют потребляет максимум 2790 Ватт.

Первым ламповым (не программируемым) компьютером была машина Атанасова-Берри, 1942 год. В 1946 году создан первый программируемый компьютер на базе ламповой логики. Они были по прежнему очень тяжелыми и весели 30 тонн. Электронные лампы часто выходили из строя и на поиск неисправности уходило очень много времени.

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

Режимы работы процессора и адресация памяти

Коротко говоря, память ОЗУ — это место для запоминания данных и доступа к ним посредством задания адреса и смещения. В старых ОС таких как MSDOS нельзя было получить доступ к памяти за пределами 1 мегабайта адресного пространства, исключая случаи использования файла HIMEM.SYS. Этот файл позволял получать доступ к «верхней памяти».

640 Кб будет достаточно для каждого.

Билл Гейтс, 1981 год.
Цитата про плохую память
Плохая память

Было время, когда радость доставляло 640 Кб ОЗУ, но все относительно в этом мире… Все проходит, все меняется и пиксельная графика уже не доставляет столько удовольствия сколько доставляют новые шейдера. Но старые хитрости, рассмотренные выше, никуда не исчезли и будут полезны для неофитов. Вот почему вам стоит рассмотреть управление памятью подробнее.

Существует 2 основных режима работы процессора:

  1. Режим реального времени, или режим реальных адресов;
  2. защищенный режим, или режим защищенного виртуального адресного пространства.

Первый режим самый старый, но тем не менее, продолжает использоваться сейчас во встраиваемых системах. Вначале, он даже использовался в Windows 3.1 с кодовым названием Янус. Собственно, имя двуликого древнеримского божества это аллюзия на главное свойство ОС которая могла функционировать в реальном и защищенном режимах. После Windows 3.11 поддержка режима реального времени была убрана.

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

  • В системах адаптивного круиз контроля автомобилей BMW;
  • В холодильных системах морга — для поддержания постоянной температуры;
  • В системах жизнеобеспечения — на международной космической станции;
  • В маршрутизаторах CISCO — для стабильной и бесперебойной работы;
  • В медицине — для контроля состояния здоровья пациента;
  • В бортовых системах Boeing 737-800 — для контроля давления в кабине пилота;
  • На атомных электростанциях — для контроля выдвижения замедляющих графитовых стержней.

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

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

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

Protected mode
Кольца защиты памяти

Защищенный режим получил свое название из-за четкого разграничения прав на страницы памяти. Кроме всего, в нем используются кольца привилегий. Ядро операционной системы как самая главная часть занимает место в памяти называемое Ring 0. В Ring 1 располагаются драйвера основных устройств ввода/вывода, файловых систем. В Ring 2 находятся драйвера для остальной менее приоритетной периферии. В Ring 3 размещаются страницы приложений.

Во времена MSDOS программист мог нечаянно задеть область памяти которая содержит код драйвера и тем самым нарушить нормальное функционирование всей ОС. В современных многозадачных ОС не получится нечаянно вмешаться в работу драйвера. В любом случае попытка прочитать запрещенную область приведет к ошибке доступа к памяти (Access Violation), как на рисунке ниже.

отсутствие доступа по адресу
Ошибка в Windows 10

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

Взаимодействие процессов и соперничество за ресурсы

А как же происходит связь между несколькими процессами? В отличии от ОС-реального времени, которые работают над решением узкого круга специфических задач, ОС функционирующие в защищенном режиме имееют большее количество интерфейсов для обмена информацией между процессами. Для этого есть сокеты, именованные каналы (named pipe), не именованные каналы, техника разделения памяти, удаленные вызовы (RPC), сигналы, очереди сообщений, файлы, mmap-файлы (отраженные в память файлы).

С точки зрения пользователя как потребителя, память или некоторая её область — это ресурс. Как распределить ресурсы, если часть из них занята? Для эффективной работы с ресурсами системе необходимо разрешать такие конфликты. Представьте, что потребность в каком-либо ресурсе испытывают несколько процессов. При этом, некоторым из них следует простаивать в ожидании. Каждый процесс имеет свой приоритет и требует определенное количество времени. Вопросы синхронизации многих задач рассматривались следующими учеными:

  • в 1965 году Эдсгером Дейкстрой («Задача обедающих философов», «Проблема спящего парикмахера»);
  • в 1971 году Сухасом С. Патилом («Проблемы сигаретных курильщиков»).

Несмотря на смешные названия, за ними кроются реальные проблемы требующие управленческих решений. В качестве решений предлагаются семафоры, мьютексы, фьютексы. Последние разработаны и внедрены Уберту Франке и Метью Кирквудом 18 марта 2002 года в экспериментальную версию 2.5.7 ядра Linux. В Windows, они стали именоваться быстрыми мьютексами. Упрощенной аналогией всех перечисленных синхронизационных примитивов являются светофоры регулирующие движение.

В Linux, в отличие от Windows вы можете ознакомиться с фьютексами во встроенной справочной системе man. Если вы пользователь Windows и хотите постигнуть глубины сложных вещей ставьте Linux. OS Linux очень гибкая и вы можете её настроить для себя.

Память и уязвимости

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

Meltdown and Spectre logo
Meltdown & Spectre

Возможно вас заинтересует статья про актуальные уязвимости 2018 года: Как улучшить производительность Linux отключив патчи для Meltdown и Spectre.

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

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

Так старые версии ОС утратившие поддержку становятся 100% незащищенными. Для поддержания должного уровня безопасности, вам следует всегда обновлять программное и аппаратное обеспечение. Если вам лень это делать, воспользуйтесь услугами ближайшего специалиста.

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

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

Существует планки памяти с синхронным доступом (SDRAM, HBM, HMC) и асинхронным доступом (FPM RAM и EDO RAM). Основные форм-факторы: DIMM, SO-DIMM, MicroDIMM. SO-DIMM используется в ноутбуках и стоит немного дороже. MicroDIMM используется в технике поменьше. Память также может быть специализированной (графическая память VRAM, WRAM, MDRAM).

Короткие выводы

  • С точки зрения пользователя память — это ресурс;
  • Запущенная программа — это процесс;
  • Каждый процесс имеет свой приоритет и использует ресурсы по-разному;
  • Существуют два режима работы процессора;
  • Режим реального времени применяется на встраиваемых системах;
  • В защищенном режиме память делится на страницы;
  • ОС в защищенном режиме использует ограничение на доступ к некоторым страницам памяти;
  • Пользовательские ОС работают в защищенном режиме;
  • Специализированные ОС работают преимущественно в режиме реального времени.

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *