Сколько памяти требуется Хамелеону?

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

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

Процесс

Процесс - это одна или нескольк Задач, выполняющихся в выделенном (своём собственном) адресном пространстве.

Задача

Термин Задача подразумевает программный поток (нить исполнения) выполняющийся в каком либо адресном пространстве.

Составные сегменты

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

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

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

  • Супервизор - 128 килобайт;
  • сервис терминала - 64 килобайта;
  • пользовательская задача (alone) - 64 килобайта.

Общий объём используемой статической памяти - 256 килобайт для трёх модулей.

Динамически аллокированные страницы

Система использует динамическое распределение памяти для кучи и стека. Единственная задача, использующая статически объявленный стек - roottask (в рассматриваемой конфигурации - задача Supervisor-64). Все остальные задачи, независимо от того, работают ли они в контексте Супервизора или в собственном адресном пространстве, используют динамическое выделение стека.

Общий размер стека, используемый всеми задачами Хамелеона в рассматриваемой конфигурации, составляет 108 килобайт. Задачи Sigma1, Timer, HAL, tty-64 и Logger используют по 8 килобайт стека, обработчик прерываний клавиатуры (задача irq0 - keyboard) использует 4 килобайта стека, а пользовательский процесс использует стек размером 64 килобайта.

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

Освобождение ресурсов

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

Возможности системы в рассматриваемой конфигурации

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

Сервис терминала предоставляет 10 виртуальных ANSI-совместимых терминалов на основе EGA/VGA видеокарты. Поддерживает LineDiscipline и стандартный набор ioctl.

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

Неиспользуемые модули в рассматриваемой конфигурации

Эта конфигурация не содержит модуль файловой системы и сетевой модуль, а так же не содержит сервисов, кроме драйвера ANSI терминалов.

Возможности оптимизации потребления памяти

Потребление оперативной памяти при необходимости можно сократить:

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

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