Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Проект Yocto

Глава 23 из книги "Архитектура приложений с открытым исходным кодом", том 2.

Оригинал: The Yocto Project
Автор: Elizabeth Flanagan
Перевод: А.Панин

Хранилище данных DataSmart системы BitBake с возможностью копирования при записи

В версии 1.0 системы BitBake переменные после извлечения из файлов помещались в один очень большой словарь в ходе инициализации класса данных. Как было сказано ранее, это приводило к проблемам, так как при работе с очень большими словарями языка Python операции записи и доступа к элементам осуществляются достаточно медленно и если на сборочной машине в процессе сборки закончится физическая память, будет использоваться раздел подкачки. Хотя такой сценарий и маловероятен для большинства систем в конце 2011 года, во время создания проекта OpenEmbedded и системы BitBake среднестатистические характеристики компьютеров обычно включали в себя объем оперативной памяти меньше одного или двух гигабайт.

Эта особенность являлась одним из слабых мест ранних версий системы BitBake. Двумя основными недостатками, которые требовали исправления для повышения производительности, являлись: во-первых, отсутствие возможности предварительного создания цепочки зависимостей сборки; во-вторых, необходимость сокращения объема данных, хранящихся в памяти. Большая часть хранящихся данных рецептов не изменялась от рецепта к рецепту; например, при наличии значений переменных TMPDIR, BB_NUMBER_THREADS и других глобальных переменных BitBake хранение в памяти всех данных окружения для каждого из рецептов являлось неэффективным. Решением проблемы оказался разработанный Tom Ansell словарь с поддержкой метода копирования при записи, который "злоупотреблял классами для того, чтобы быть замечательным и быстрым". Модуль с реализацией метода копирования при записи системы BitBake является одновременно и особо радикальным и разумным решением. Выполнение команды python BitBake/lib/bb/COW.py и исследование модуля облегчат ваше понимание принципа работы реализации механизма копирования при записи и способа использования этой реализации средствами системы BitBake для эффективного хранения данных.

Модуль DataSmart, использующий словарь с поддержкой метода копирования при записи, хранит все данные начальной конфигурации системы Poky, данные из файлов с расширениями .conf и .bbclass в словаре в виде объектов данных. Каждый из этих объектов может содержать другой объект данных с информацией исключительно об отличиях данных. Таким образом, в том случае, если с помощью рецепта происходит изменение данных начальной конфигурации, вместо копирования всей конфигурации с целью локализации, на уровне ниже в стеке данных, подвергающихся копированию при записи, сохраняется объект, содержащий информацию об отличиях данных родительского объекта. При попытке доступа к переменной модуль данных будет использовать модуль DataSmart для объектов на верхнем уровне стека. В том случае, если переменная не обнаруживается, осуществляется переход на нижний уровень стека до тех пор, пока переменная не обнаруживается, либо генерируется ошибка.

Одна из других интересных особенностей модуля DataSmart находится в области раскрытия переменных. Так как переменные BitBake могут содержать исполняемый код на языке Python, одной из необходимых для выполнения операций является передача значения переменной методу bb.codeparser для установления того, что это значение представляет собой корректный код на языке Python и не содержит циклических ссылок. В качестве примера переменной, содержащей код на языке Python, может использоваться фрагмент файла ./meta/conf/distro/include/tclibc-eglibc.inc:
LIBCEXTENSION = "${@[", '-gnu'][(d.getVar('ABIEXTENSION', True) or ") != "]}"

Эта переменная подключается с помощью одного из конфигурационных файлов уровня OE-Core с именем ./meta/conf/distro/include/defaultsetup.conf и используется для формирования набора стандартных параметров в различных конфигурациях дистрибутивов, которые могут использоваться при работе с Poky и OpenEmbedded. Этот файл позволяет импортировать некоторые специфичные для библиотеки eglibc переменные, значения которых устанавливаются в зависимости от значения другой переменной BitBake с именем ABIEXTENSION. В процессе создания хранилища данных код на языке Pyhon из данной переменной должен быть разобран и проверен для того, чтобы избежать неудачного завершения задач, использующих эту переменную.


Далее: Планировщик BitBake