Проблема блокировки считывателя карт

Другая проблема, проблема блокировки, может возникнуть если управляющая программа отправила сообщение драйверу считывателя карт который в этот момент ждет поступления данных от аппаратуры. Если у драйвера считывателя нет данных, и он спроектирован блокироваться до их получения, то он не ответит клиенту (который запросил данные) пока кто-нибудь не воспользуется картой. Это может показаться неплохой идеей, но проблема состоит в том, что управляющей программе может быть необходимо запрашивать данные у нескольких считывателей карт. Если ваша программа не многопоточна, то у вас сразу появляется проблема – управляющая программа может быть заблокирована в ожидании приема данных со считывателя. Если запрос был выполнен в пятницу вечером, и никто не воспользовался этим считывателем карт до утра понедельника, управляющая программа все выходные будет блокирована в ожидании поступления данных с этого считывателя.

Между тем, кто-то может воспользоваться другим считывателем карт в субботу утром. Простое добавление программных потоков – по одному на каждый считыватель, тоже нельзя назвать хорошо масштабируемым решением. Хотя программные потоки обходятся достаточно дешево, но они все равно требуют ресурсов – это как минимум 8 Кб оперативной памяти (4 Кб для данных и 4 Кб для исполняемого кода, в зависимости от типа вашего процессора), внутренние данные ядра и накладные расходы на переключение контекста.

Наибольшее значение имеет занимаемая память (данные ядра для каждого потока относительно невелики, а переключение контекста выполняется очень быстро). Кроме того, как только вы добавите программные потоки к управляющей программе, вы должны будете их синхронизировать, чтобы они могли нормально работать с общими ресурсами (например, с базой данных). Единственная польза от этих программных потоков – это возможность использования в вашей программе множество блокировочных «агентов».

Исходя из этого, казалось бы все просто.

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

РубрикиFAQ

Добавить комментарий