stunpix

Персональный бортжурнал

select, poll и в чём отличия у qnx и linux

В нашем проекте по портированию webkit на qnx мы столкнулись с проблемой, что скорость загрузки ресурсов используя libcurl неожиданно низкая. В той же сети, Google Chrome к примеру загружает ресурсы в разы быстрее (примерно в 5-6 раз). Увеличив количество одновременных соединений мы не получили никаких видимых приростов скорости. Возник вопрос в том, не упираемся ли мы в ограничения при вызове select(), который мы используем чтобы определить пришли ли данные в сокет. Забегая вперёд скажу, что ограничений мы не достигли, но зато я с удивлением узнал об ограничениях системной функции select().

Если кратко, то многие знают, что select() в posix системах используется для того, чтобы определить случились ли какие-нибудь изменения в открытых дискрипторах (будь то файл, pipe или socket). И если что-то изменилось, то из дискриптора можно прочитать данные, либо записать их туда. Но select() на столько старая функция, что она имеет ряд ограничений, которые вполне полезны для каких-то платформ ограниченных в ресурсах, но для современных высокопроизводительных серверов или рабочих станций - эти ограничения проблема.

Типичный код использования этой ф-ии:

struct fd_set myDescriptors;
struct timeval tv;

tv.tv_sec = 5;
tv.tv_usec = 0;

FD_ZERO(&myDescriptors);        // вычищаем все старые дискрипторы
FD_SET(desc1, &myDescriptors);  // добавляем первый дискриптор
FD_SET(desc2, &myDescriptors);  // добавляем второй дискриптор

select(max(desc1, desc2) + 1, &myDescriptiors, 0, 0, &tv);

Суть ограничений select() в том, что структура fd_set, которую он использует для проверки дискрипторов - это битовый массив с вполне предопределённым размером. Битовый массив означает, что каждый установленный бит - это порядковый номер дискриптора для проверки. Например если у нас есть 3 дискриптора со значениями 10, 15 и 100, то в битовом массиве соответственно будут установлены биты с номерами 10, 15 и 100. Функция select() увидев, что эти биты установлены - соответственно проверит дискрипторы с такими порядковыми номерами. Размер битового поаоля fd_set на ядре linux 3.2 равен 1024 бита, а на qnx 6.5.0 вообще 256 бит. Из этого следует, что если вы в своём linux приложении откроете больше 1024 файлов/сокетов/pipe'ов - у вас начнутся проблемы с использованием select(). На qnx даже более сложная ситуация - там вы можете использовать не более 256 дискрипторов с этой функцией.

Таким образом, сложное приложение на qnx вполне может вылезти за пределы размера fd_set. Было бы печально, если бы не бло альтернативы, но она есть. Альтернативой функции select() является другая posix функция poll(), которая не имеет таких ограничений и даже позволяет больше узнать о состоянии дискрипторов (к примеру, для сокетов можно определить, что соединение было закрыто удалённой стороной).

В этом и есть различие между select() и poll(). В итоге можно сказать, что использование select() вполне приемлемо для большинства приложений, которые зараннее уверены, что не будут открывать более сотни файлов/сокетов/pipe'ов. Однако если у вас такой уверенности нет и количество открытых дескрипторов зависит от неконтролируемых внешних факторов (к примеру серверные приложения), то обязательно стоит использовать poll(). Ну и в совсем уж сложных случаях когда приложение может использовать десятки тысяч открытых дискрипторов - вам надо переходить на такие библиотеки как libevent или libev. Они во-первых возьмут всю рутинную работу на себя, а во-вторых, для каждой платформы будут использовать лучшее доступное системное api для работы с дискрипторами. Так libev, к примеру, на linux может использовать более улучшенный epoll() или kqueue на freebsd, а на том же qnx за неимением лучшего будет использоваться poll(). А на совсем захудалых платформах и вовсе select().

Happy coding. =)


Ремонт башмака вспышки у Canon

У меня на фотоаппарате жутко расшатался "башмак" крепления вспышки и когда я ставил вспышку мне приходилось её прижимать пальцем так, чтобы она срабатывала, а иначе терялся контакт и... ну в общем ничего не работало. Несколько раз пытался починить, но никак не мог понять, как добраться до крепёжных болтов. Когда терпение окончательно лопнуло я вооружился пинцетом.

Оказалось, что там совершенно ничего сложного нет. У "башмака" есть маленькая пластинка, которая никак не закреплена и её просто надо поддеть острым предметом, иголкой к примеру или остроконечным пинцетом как у меня.

ремонт башмака вспышки canon

После того как поддели надо потянуть пластинку в том направлении как снимается вспышка. Вуаля - вы добрались до болтов.

ремонт башмака вспышки canon

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

Happy using!


Блог умер... Да здравствует блог!

Так получилось, что после перехода сервера на Ubuntu 12.10 предыдущий движок блога Эгея не пережил этого потрясения и приказал долго жить самым оригинальным способом - он просто убил все мои записи. Смерть выглядела примерно так:

с некими подозриетельными надписями про mysql_escape_string(), а константация факта смерти выглядела в виде пустых записей и коментариев:

Пришлось в срочном порядке искать что-то подходящее. Я давно заглядывался на движки со статическим контентом, но как-то не решался. Преждевременный отход старого движка на покой не оставил мне сомнений - выбор пал на Pelican написанный на python. Вытащил из резервной копии все записи кроме одной, про обзор компактной клавиатуры Rapoo E9080. Эта статья пользовалась однозначной популярностью судя по Google Analytics, но... без жертв не обошлось. И да, другая жертва - все старые ссылки ушли с старым движком, что тоже ударит сайту в поисковиках.

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

И будьте осторожны с Эгеей при любых обновлениях.

P.S.: По умолчанию у пеликана темы страшненькие. Пришлось набросать свою тему и назвать её Stunned Pixel. =) Когда она будет допилена - выложу на github.

← Новое 4 из 11 Старое →