Применение метода самоорганизующегося файла в алгоритмах поиска драйвера устройства

Автор: Ильин Игорь Андреевич, Белянина Наталья Васильевна

Журнал: Сервис в России и за рубежом @service-rusjournal

Статья в выпуске: 3 (8), 2008 года.

Бесплатный доступ

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

Самоорганизующийся поиск, pci-устройства, алгоритмизация

Короткий адрес: https://sciup.org/140205426

IDR: 140205426

Текст научной статьи Применение метода самоорганизующегося файла в алгоритмах поиска драйвера устройства

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

Одним из первых СП был предложен Джоном Мак-Кэйбом [2]. Его метод перемещал успешно найденную запись, не являющуюся первой в таблице, на один порядок вверх, заменяя его место предыдущей. Л. Ривест [4] позже доказал, что при длительной работе метод перестановки использует меньше сравнений, чем ранее используемый метод перемещения найденной записи в начало таблицы.

Как видно из описанного метода перестановки Мак-Кэйба, принцип самоорганизации заключается в изменении исходного множества поиска в зависимости от результатов работы алгоритма. При этом сама процедура модификации множества поиска реализована в самом алгоритме. Аналогично задачам сортировки [5] будем различать методы изменения множества на внутренние, где изменения происходят внутри алгоритма поиска, и внешние — изменение множества поиска осуществляется другими алгоритмами, а алгоритм поиска лишь использует ранее обработанное множество.

Постановка задачи поиска драйвера

Существует PNP-устройство, представленное в виде PNP-строки, разбитой на блоки [1]. В данной статье будут обсуждаться PCI-устройства, хотя все описанные методы применимы для любых PNP-устройств.

Задача поиска драйвера — найти наиболее вероятный драйвер для заданного устройства, описанного в формате PNP-строки.

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

  • 1.    Собственно путь на драйвер в формате абсолютной ссылки на файловый ресурс в нотации ОС Microsoft Windows (C:\DRIVERS\VIDEO\...).

  • 2.    Версия драйвера в формате k.l.m.n, где k главная версия (major version), l подчиненная версия (minor version), m вторая главная версия (submajor version), n вторая подчиненная версия (subminor version).

  • 3.    Дата выпуска драйвера (driver_date) в формате mm/dd/yyyy, где mm полный номер месяца (01, 02, 03 и т.д.), dd полный номер числа месяца (01, 02, ….12, …31), yyyy полный номер года (2003, 2004 и т.д.).

  • 4.    Дата добавления драйвера в базу драйверов в формате даты выпуска драйвера.

  • 5.    Список устройств, поддерживаемых драйвером.

  • 6.    Список поддерживаемых драйвером аппаратных платформ.

  • 7.    Список поддерживаемых драйвером программных платформ.

Дополнительно драйвер может содержать следующую информацию:

  • 1.    Строка класса драйвера CLASS_STRING . Строковое обозначение класса драйвера ( SYSTEM системный драйвер; MEDIA драйвер многофункциональных мультимедиа устройств; NET драйвер сетевого устройства и др.).

  • 2.    Результаты установки драйвера для устройства в рамках разных аппаратных и программных платформ.

Кэшированные таблицы

Рассмотрим наиболее часто используемый метод внутреннего СП — кэширование. Алгоритм описывается следующим образом.

  • 1.    Найти в таблице соответствий связку устройства с драйвером.

  • 2.    Если связка найдена, вернуть ссылку на драйвер и завершить алгоритм.

  • 3.    Если связка не найдена, запустить алгоритм поиска драйвера.

  • 4.    Если драйвер найден, добавить в таблицу сопоставления связку устройства и драйвера.

  • 5.    Вернуть ссылку на драйвер и завершить алгоритм.

  • 6.    Если драйвер не найден, завершить алгоритм с ошибкой.

Ниже на рис. 1 приводится полный алгоритм поиска драйвера (в дальнейшем в статье мы будем на него ссылаться).

  • 72          DV.Major Version,

  • 73          DV.Minor Version,

  • 74          DV.Sub_Major_Version,

  • 75          DV.Sub Minor Version,

  • 76           MAX(DV.Stamp Date),

DV.InspectionFlag,

  • 78          CASE

  • 79           WHEN DV.ExpirationDate S NOT MULL

  • 80             THEN CONVERT(datetime, DV.ExpirationDate, 103:

  • 81            ELSE NULL

  • 82           END,

  • 83          CAST(CASE WHEN DV.ExpirationDate IS NOT NULL THEN 1 ELSE 0 END AS bit)

  • 84    FROM dbo.av driverOSVersion DV

  • 85    WHERE Device ID - ©device id

  • 86     AND Subsystem_ID - ©subsystem_id

  • 87     AND Version = ©version

  • 88    GROUP BY DV.DriverPath ID, DV.Major Version, DV.Minor Version, DV.                xr

Sub_Major_Version, DV.Sub_Minor_Version,

  • 89            DV.InspectionFlag, DV.ExpirationDate

  • 90    UNION ALL

  • 91    SELECT DISTINCT DV.DriverPath_ID,

  • 92               2,

  • 93            MAX (DV.Driver Date.',

  • 94          DV.Major_Version,

  • 95          DV.Minor Version,

  • 96          DV.Sub Major Version,

  • 97          DV.Sub_Minor_Version,

  • 98           MAX(DV.Stamp Date),

  • 99          DV.InspectionFlag,

100           CASE

101           WHEN DV.ExpirationDate IS NOT NULL

102             THEN CONVERT(datetime, DV.ExpirationDate, 103;

103            ELSE NULL

104            END,

105          CAST(CASE WHEN DV.ExpirationDate IS NOT NULL THEN 1 ELSE 0 END AS bit)

106 FROM dbo.av_driverOSVersion DV

107 WHERE Device ID - ©device id

108     AND Subclass ID = ©subclass id

109     AND Version ©version

111            DV.InspectionFlag, DV.ExpirationDate

112 UNION ALL

113 SELECT DISTINCT DV.DriverPath_ID,

114               3,

117          DV.Minor_Version,

120          MAX(DV.Stamp_Date),

121          DV.InspectionFlag,

122           CASE

123           WHEN DV.ExpirationDate IS NOT NULL

124             THEN CONVERT(datetime, DV.ExpirationDate, 103)

125            ELSE NULL

126           END,

127          CAST(CASE WHEN DV.ExpirationDate IS NOT NULL THEN 1 ELSE 0 END AS bit)

129   WHERE Device_ID @device_id

130 AND Version = ©version

Sub_Major_Version, DV.Sub_Minor_Version,

132            DV.InspectionFlag, DV.ExpirationDate

133 UNION ALL

134 SELECT DISTINCT DV.DriverPath_ID,

135               4,

137           DV.Major_Version,

140          DV.Sub_Minor_Version,

142          DV.InspectionFlag,

143           CASE

WHEN DV.ExpirationDate S NOT MULL

THEN CONVERT(datetime, DV.ExpirationDate, 103} ELSE NULL

END,

CAST(CASE WHEN DV.ExpirationDate IS NOT NULL THEN 1 ELSE 0 END AS bit) FROM dbo.av_driverOSVersion DV WHERE Device ID IS NULL

AND Subsystem ID IS NULL

AND Subclass_ID @subclass_id

AND Version = ^version

Sub_Major_Version, DV.Sub_Minor_Version,

DV.InspectionFlag, DV.ExpirationDate

— Посмотрим, сколько нашли драйверов SELECT Sent - COUNT(DISTINCT Path_IDj FROM @drivers

PRINT ’Всего найдено драйверов: * + CONVERT(char, ©ent:

IF @cnt = 0

BEGIN

PRINT ’Для указанного устройства драйверов не найдено!’ GOTO ERROR

END

IF 9cnt = 1

JOIN ©drivers D ON D.Path_ID = DF.DriverPath_ID

PRINT ’Найден драйвер по поиску. ID: 1 * CONVERT(char, ©d_id! GOTO SUCCESS

END

— 0. Приоритет (Поле Priority)

IF (SELECT COUNT(DISTINCT Priority) FROM ©drivers: 1 BEGIN

DELETE ©drivers FROM ©drivers D JOIN (SELECT MIN(Priority) AS Priority

FROM ©drivers: MD ON D.Priority ! = MD.Priority END

IF (SELECT COUNT(DISTINCT Path_ID) FROM ©drivers = 1 BEGIN

FROM v_driverlnfo DF

JOIN ©drivers D ON D.Path_ID ^ DF.DriverPath_ID

PRINT ’Найден драйвер по фильтру приоритетов. ID: * + CONVERT(char, @d_id: GOTO SUCCESS

END

— 1. Аппаратная ллафторма

IF (SELECT COUNT(DISTINCT Path_ID) FROM ©drivers) - 1 BEGIN

JOIN ©drivers D ON D.Path_ID - DF.DriverPath_ID

PRINT ’Найден драйвер по фильтру аппаратной платформы. ID: * - CONVERT(char, ©W d id)

GOTO SUCCESS

END

— 2. Дата драйвера

DELETE ©drivers FROM ©drivers DI JOIN 'SELECT MAX(Driver_Date: AS Driver_Date

Рис. 1. Полный алгоритм поиска драйвера

Алгоритм представляет собой последовательный поиск во временной таблице с применением ранжирования. Задача самоорганизации реализуется в двух операторах. Первый (строки 15—34) проверяет наличие результатов поиска драйвера в таблице соответствия. Если драйвер найден, алгоритм завершает свою работу. В ином случае запускается процедура поиска драйвера. Если драйвер найден, в таблицу соответствия добавляется новая запись с информацией об устройстве и найденном для него драйвере; а также добавляется версия операционной системы (ОС), характеризующая программную платформу, для которой был найден драйвер. Указанный алгоритм имеет один существенный недостаток — при появлении нового драйвера он не будет найден при поиске, т.к. в таблице сопоставления уже существует связка устройства с драйвером. Решением этой проблемы является применение метода внешней самоорганизации, когда в таблицу сопоставления добавляется запись на этапе регистрации драйвера в БД. На рис. 2 показан алгоритм добавления нового драйвера в таблицу.

  • —    Добавим только те устройства, для которых нет сопоставления с 0path_id с указанной версией ОС INSERT INTO dbo.DeviceDriver

(PCIDevice_ID, Path_ID, [Version], Priority, Driver_Date, MJ_Version, MN_Version, SMJ_Version, SMN_Version) SELECT PCIDevice_ID, 0path_id, [Version] , MIN(Priority) AS Priority, Driver_Date, MJ_Version, nN_Version, SMJ_Version, SMN_Version FROM @devices D WHERE NOT EXISTS (SELECT DD.Path_ID FROM dbo.DeviceDriver DD WHERE D.PCIDevice_ID = DD.PCIDevice_ID AND D.[Version] = DD.[Version]) GROUP BY PCIDevice_ID, [Version], Driver_Date, MJ_Version, MN_Version, SMJ_Version, SMN_Version

  • —    Обновим драйвера для устройств, у которых существует сопоставление с драйверов с указанной версией, — но с меньшим рангом UPDATE dbo.DeviceDriver

SET Path_ID = CASE WHEN DD.Priority < D.Priority THEN 0path_id

ELSE CASE WHEN DD.Driver_Date < D.Driver_Date THEN 0path_id

ELSE CASE WHEN DD.SMN_Version < D.SMN_Version THEN 0path_id

ELSE CASE WHEN DD.SMJ_Version < D.SMJ_Version THEN 0path_id

ELSE CASE WHEN DD.MN_Version < D.MN_Version THEN 0path_id

ELSE CASE WHEN DD.MJ_Version < D.MJ_Version THEN 0path_id ELSE DD.Path_ID END

END

END

END

END END

FROM dbo.DeviceDriver DD

JOIN 0devices D ON D.PCIDevice_ID = DD.PCIDevice_ID AND D.[Version] = DD.[Version]

Рис. 2. Алгоритм добавления нового драйвера в таблицу

В операторе INSERT в таблицу сопоставления ( DeviceDriver ) добавляются лишь те устройства, которых нет в таблице с указанной версией ОС. При обновлении (оператор UPDATE ) производится сравнение поочередное сравнение двух строк — информация с существующим сопоставленным драйвером с информацией о вновь найденном драйвере для устройства. Как и в алгоритме поиска драйвера сначала сравниваются ранги. Если устройство было найдено для драйвера по критерию с более высоким рангом, то происходит замена ранее сопоставленного драйвера на найденный. Такие же действия последовательно осуществляются для даты драйвера и его версии.

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

Избыточные данные

Зачастую для ускорения времени выполнения алгоритма приходятся добавлять избыточную информацию. Подобный механизм реализован в алгоритме, показанном на рис. 1. В нем формируется временная таблица результатов поиска по критериям PNP-строк. При этом в таблицу добавляется информация о версии, дате создания и дате регистрации драйвера. Это обеспечивает возможность работы с данными в оперативной памяти, не используя постоянные таблицы, находящиеся в файловой системе. Однако эта информация касается лишь драйвера и не имеет в сущности отношения к устройству. Единственное, что объединяет драйвер и устройство – это PNP-строка. Но есть еще одна сущность, существующая только для драйверов, хотя может быть применена и для устройств. Это строка класса драйвера. В стандарте PCI устройство обладает, так называемым, классом, — кодированным описанием типа устройства (см. табл. 1).

Таблица 1

Список некоторых классов PCI-устройства

Base devices

Mass storage controllers

Network controllers

Display controllers

Multimedia controllers

Memory controllers

Bridge devices

Simple communications controllers

Base system peripherals

Input devices

Docking stations

A

Processors

B

Serial bus controllers

C

В табл. 2 перечислены некоторые классы драйверов.

Таблица 2

Список некоторых классов драйверов

DISPLAY

HDC

MEDIA

MODEM

MULTIFUNCTION

MULTIPORTSERIAL

NET

PCMCIA

PORTS

SCSIADAPTER

SDHOST

SYSTEM

USB

Сравнив эти таблицы, можно увидеть соответствия. Например, класс устройства Display controllers сопоставим с классом драйвера DISPLAY ; Network controllers — NET; Base devices, Mass storage controllers, Bridge devices — SYSTEM; и так далее. Эту закономерность можно применить в алгоритме СП.

На рис. 3 показаны изменения обсуждаемого алгоритма (отмечены красной чертой). В блок входных параметров добавлена переменная @class_string , содержащая значение класса драйвера, но уже для устройства. Во временную таблицу добавляется информация по классу найденного драйвера. На рис. 4 показаны действия по удалению драйверов, не подходящих под критерии поиска по классу драйвера.

В

A CREATE PROCEDURE [dbo] [d_FindDriver_4]

0device_id int, 0 s ub s уs t em_ i ci i nt 0 s ub с 1as s_ i cl i n t, 0os id int.

0р1at fоrm_id int

ID

устройства из

kr im. db о . Devic е

ID

подсистемы из

krim.dbo.SubSystem

ID

подкласса из

krim.dbo.Subclass

ID

операционной

системы

Версия операционной системы

ID аппаратной платформы

0class string varchar(2Ui

2 0

2 1

2 3

2 4

2 5

2 6

2 7

2 9

3 0

3 1

3 2

3 3

3 4

3 5

3 6

3 7

3 8

3 9

0d_id int. OUTPUT)

AS

BEGIN

SET NOCOUNT ON

Строка класса драйвера

ID записи в. krim. dbo.DriverInfо (ID драйвера в. *.inf)

DECLARE 0cnt int

— Определим таблицу найденных драйверов.

DECLARE 0drivers TABLE

(Path_ID int, Priority int, Class_String varchar(20), Driver_Date datetime, MJ_Version int, HN_Version int, SMJ_Version int, SHN_Version int, Date datetime Inspection_Flag int, Expiration_Date datetime, Expiration_Flag bit)

INSERT INTO 0drivers

(Path_ID, Priority, Class_String, Driver_Date, MJ_Version, MN_Version, Date, Inspection_Flag, Expiration_Date, Expiration_Flag)

S E L EСT DV.DriverPath ID,

Самый высокий приоритет присваивает драйверам, найденным по

Class String,

MAX(DV. Driver_Date),

DV.M1nor _Ve r s i оn,

DV.Sub_Major_Version,

DV. Sub_Minor_Version,

MAX(DV. Stamp_Date) , DV.InspectionFlag,

CASE

WHEN DV.ExpirationDate IS MOT NULL

THEN CONVE RT (dat et line, DV. E xp 1 rat 1 оnDate, 10 3 )

ELSE NULL

END,

Рис. 3. Изменения алгоритма

SMJ Version, SHN Version,

полному совпадению

162

— Отсечение no Class_String

163![ 164!

] DELETE

FROM 0 drivers

165

166!

WHERE Class_String != 0ciass_string

167![ 168

] SELECT @cnt = COUNT(DISTINCT Path_ID)

FROM 0drivers

169

PRINT 'Всего найдено драйверов: 1 + CONVERT(char, 0cnt

171![ 172!

173

] IF 0cnt = 0 GOTO ERROR

174![

] IF 0cnt = 1

175![

1 BEGIN

176!я SELECT 0d_id = MAX DF ID

177! FROM v_driverInfo DF

178! - JOIN 0drivers D ON D Path_ID DF DriverPath_ID

179!

180! PRINT 'Найден драйвер по фильтру Class_String. ID: 1 + CONVERT(char, 0d_id

181! GOTO SUCCESS

182! - END

183!

Рис. 4. Алгоритм удаления драйверов

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

Алгоритм с обратной связью

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

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

  • 1.    В процессе поиска выбирать только те драйвера, для которых, либо существует информация об успешной установке на данной версии ОС, либо эта информация отсутствует. Т.е. производить исключение всех драйверов, для которых указано, что для заданной ОС установка прошла неудачно.

  • 2.    После процедуры установки драйвера сохранить информацию о результате установки, чтобы использовать ее в следующих запусках алгоритма.

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

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

  • - - Исключим драйвера с результатом неудачной установки и

  • - - те, чья дата цифровой подписи на момент поиска истекла.

  • - - При этом надо учитывать, что под исключени по дате

  • - - подпадают лишь те драйвера, которые имеют цифровую подпись, -- т.е. значение даты не пустое DELETE

FROM @drivers

WHERE InspectionFlag != 1 — факт неудачной установки

OR (ExpirationFlag = 1 AND ExpirationDate > GETDATE())

Рис. 5. Изменения в алгоритме

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

Разработанный в 60-е годы прошлого века метод перестановок развился от алгоритмов Мак-Кейба и Ривеста до моделей кэшированных таблиц и систем с обратной связью. На современном этапе развития идеи самоорганизующихся алгоритмов базируются на принципах ранжирования и упомянутой ранее обратной связи. Также все более широкое применение находят эволюционные алгоритмы, идеи нечеткой логики и нейронные сети [4]. Стоит отметить одну из первых сетей с применением самоорганизации, — нейронную сеть с обратным распространением ошибки. Основная идея состоит в распространении сигналов ошибки от выходов сети к её входам, в направлении, обратном прямому распространению сигналов в обычном режиме работы. Впервые подобный метод был описан Полем Дж. Вербосом в 1974 г., и далее развит Дэвидом И. Румельхартом и Рональдом Дж. Вильямсом в 1986 г.

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

Список литературы Применение метода самоорганизующегося файла в алгоритмах поиска драйвера устройства

  • Identifiers for PCI Devices. Microsoft Developer Network. [В Интернете] http://msdn.microsoft.com/en-us/library/ms791082.aspx.
  • MacCabe, John. 1965. Operation Research. 1965. pp. 609-618.
  • Nong Ye, 2003. The handbook of data mining. LEA. 2003. Arizona State University
  • Rivest, Ronald L. 1976. CACM. 1976. pp. 63-67.
  • Кнут, Дональд Э. 2000. Искусство программирования. Москва: Вильямс, 2000. Т. Сортировка и поиск.
Статья научная