Комбинаторная генерация программных конфигураций ОС В. Кулямин kuliamin@ispras.ru ИСП РАН Конфигурационное тестирование • Программная конфигурация операционной системы – Использование форматов, сигналов, устройств, файловых систем, … – Размеры буферов, страниц, пулов, … – Количества очередей, мьютексов, портов, … – Значения по умолчанию для приоритетов, политик, режимов, … – Имена и номера устройств, спец. файлы, адреса, … • Нужно проверить работу ОС при различных комбинациях значений конфигурационных параметров 2 / 20 Общие задачи тестирования • Как проверить корректность работы системы? – Можно считать, что есть достаточно много тестов работоспособности ОС Они будут выполняться в разных конфигурациях и проверять корректность работы ОС • Как оценить полноту тестового набора? – Для этого нужно знать, что такое конфигурация, какие конфигурации бывают вообще, какие из них существенно отличаются по поведению ОС 3 / 20 Основные вопросы • Как задается одна конфигурация? – Как определяются текущие значения параметров – Результат работы генератора – набор таких описаний • Какие конфигурации бывают? – Какие есть параметры и какие значения они могут принимать – Это – входные данные генератора • Как понять, что набор конфигураций «достаточно полный»? – И как построить такой набор? – Так будет устроен механизм генерации 4 / 20 Определение конфигурации 5 / 20 Определение одной конфигурации • Файлы configos.h, x_configbrd.h с набором макроопределений в виде #define/#undef • Файл usermake.def для make, в котором определения даются в виде <имя> = <значение> 6 / 20 Возможные конфигурации • Набор параметров и их возможных значений зависит от аппаратной платформы • Между параметрами есть зависимости – При включенной сети можно определить поддерживаемые протоколы, адреса шлюзов, … При выключенной эти протоколы и адреса не имеют смысла • Полный набор параметров с их возможными значениями и зависимостями описан в TCL-скрипте для настройки конфигурации перед сборкой – Этот скрипт и дает входные данные – Это удобно с точки зрения возможных модификаций системы параметров 7 / 20 Виды параметров • Типы – Булевский (#define/#undef) – Целое число (десятичное, шестнадцатеричное) – Идентификатор C – Строка – Перечисление • Будем работать только с булевскими и перечислимыми 8 / 20 Зависимости • Примеры – INCLUDE_REMOTE_DEBUG_SERVER : $INCLUDE_DEBUG && $INCLUDE_NETWORK==1 – ERASE_MEMORY : [string compare $OUTPUT_MSG_TO flash_memory]==0 || [string compare $OUTPUT_EMERG_TO flash_memory]==0 • Почти все имеют вид логических выражений над формулами вида $x = v, $x != v • Дизъюнкции используются редко (нет дизъюнкций из трех выражений) 9 / 20 Критерий полноты • Все возможные комбинации значений – Нереализуем – mips64/cprio64 – 563 (17215153413152541) 2.23875·10176 • Некоторые комбинации – Использование: каждый участок кода закрыт не более чем двумя-тремя условиями #ifdef – достаточно сочетаний пар или троек значений! 10 / 20 Формальная постановка задачи • Задан класс конфигураций – Набор параметров – Для каждого – конечное множество значений – Для каждого – условие использования : логическое выражение из элементарных формул p = v • Задано число t = 2,3,4 • Построить набор корректных конфигураций, в рамках которого для каждых t параметров и каждого возможного сочетания их значений это сочетание встречается в одной из конфигураций 11 / 20 Покрывающие наборы • Есть k параметров, имеющих n1, …, nk возможных значений • Покрывающий набор глубины t – матрица из k столбцов – В каждом столбце j встречаются только nj значений – Для каждого набора из t параметров и для каждого сочетания их возможных значений в некоторой строке есть это сочетание 12 / 20 Пример • 35 параметров со значениями {0,1} – 34 359 738 368 всех комбинаций – Есть набор из 8 тестов, покрывающих все сочетания пар значений 00000 11111 11111 11110 10001 01001 00100 00010 00000 11111 11111 00000 11000 00110 10101 01011 00000 11111 00000 11111 11100 10011 01010 00101 00000 11111 00000 10000 01110 01101 11011 10111 00000 00000 11111 11111 11100 10011 01010 00101 00000 00000 11111 10000 01110 01101 11011 10111 00000 00000 00000 11110 11101 11011 10111 01111 13 / 20 Методы построения • Комбинаторные и алгебраические • Рекурсивные • Оптимизационные – Жадный алгоритм 14 / 20 Учет условий использования • Для данного набора t параметров – Условия использования могут быть противоречивы – Условия использования могут ограничивать допустимые комбинации значений 15 / 20 Проверка противоречивости • В общем виде – NP-полная задача – Есть только алгоритмы, экспоненциальные от числа используемых элементарных формул • У нас дизъюнкции имеют не более 2-х элементов – Задача 2-SAT – Есть линейный алгоритм Тарьяна 16 / 20 Алгоритм Тарьяна (-Аспвала-Пласса) • Преобразуем X || Y в две импликации !X Y и !Y X • Строим граф с вершинами X, !X, соединенных дугами, соответствующими импликациям • Поиск в глубину за линейное от числа дуг время находит компоненты сильной связности • Противоречие есть тогда и только тогда, когда в одной компоненте есть X и !X 17 / 20 Общая схема • Разбор TCL-файла – дает набор параметров, множества их значений и зависимости • Транзитивное замыкание зависимостей – дает полные условия использования • Построение покрывающего набора без учета условий использования – комбинаторная инициализация части + жадный алгоритм • Достраивание набора с учетом условий использования • Выдача результатов – Набор директорий с файлами, описывающими конфигурации 18 / 20 Практические результаты № 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Platform i386/i386 i386/x86 mips/bt205 mips/bt23-202 mips64/bt128 mips64/bt211 mips64/bt206 mips64/mpon mips64/vmips mips64/cprio64 komdiv64/bt128 R4000/bt128 R4000/bt206 R4000/mpon R4000/vmips R4000/cprio64 NP 228 215 373 331 548 334 334 301 241 563 548 419 220 183 113 434 Params 42362220 42362207 172151887261534193212316 172151134947253473102298 17215153413152526 172151134947253453102302 172151726153453182302 17215153413152279 5141362233 17215153413152541 17215153413152526 17215153423142397 1721511414726153463172174 17215153423142161 5142352105 17215153423142412 C 172 170 279 267 500 277 278 251 203 511 500 377 155 138 80 388 N1 25 23 322 319 289 319 289 289 27 289 289 289 823 289 28 289 N2 92 72 670 653 556 726 651 574 89 564 556 541 826 543 62 549 T1 0.01 0.01 1.57 1.07 0.57 0.78 0.58 0.33 0.01 0.58 0.56 0.44 1.28 0.23 0.01 0.46 T2 0.31 0.26 5.07 4.58 7.88 4.08 2.99 2.15 0.42 6.70 7.80 7.00 1.65 0.56 0.07 5.59 19 / 20 Спасибо за внимание! 20 / 20