Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср ноя 22, 2017 11:58 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 88 сообщений ]  На страницу Пред. 1 2 3 4 5 6 След.
Автор Сообщение
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср сен 09, 2009 3:44 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Я начала создавать библиотеку для работы с сетью. Первая версия экспортирует стандартные функции inet_ntoa, inet_addr, getaddrinfo, freeaddrinfo для работы с доменными именами, информацию о функциях легко найти в Сети, в стандарте POSIX, в MSDN или в манах. getaddrinfo не поддерживает IPv6 и сырые сокеты, не поддерживает файлы hosts и services, так что имя службы можно указывать только в десятичной нотации или не указывать вовсе. Резолвинг имён поддерживается полностью. Кеширования DNS-ответов пока нет, но, по крайней мере, общесистемный кеш можно сделать, если приложения будут использовать библиотеку вместо того, чтобы отправлять запросы вручную.
Библиотека работает только со свежим ядром: в ревизии 1153 я добавила возвращаемое значение к функции 40, в ревизии 1154 - выбор неиспользованного локального порта при указании нуля в функциях открытия сокета.
Функция getaddrinfo может заморозить вызывающий поток, ожидая ответа от DNS-сервера. Для того, чтобы в процессе ожидания можно было ещё что-то делать, например, обрабатывать события типа перерисовки, есть два варианта. Во-первых, можно создать второй поток, который будет ждать ответа от getaddrinfo, в то время как главный поток может заниматься чем угодно. Во-вторых, я вынесла в экспорт отдельные части: getaddrinfo_start, посылающую запрос, getaddrinfo_process, обрабатывающую результат, и getaddrinfo_abort для прерывания ожидания, например, по таймауту, и вместо одного блокирующего вызова getaddrinfo можно вызвать getaddrinfo_start, после чего в цикле обработки сообщений события с сетью направлять на обработку getaddrinfo_process, а с остальными работать как обычно.
Я закоммитила библиотеку на SVN, в папку svn://kolibrios.org/programs/develop/libraries/network, поэтому исходников здесь не выкладываю. Скомпилированную версию я всё же прилагаю.
В качестве примера использования есть консольный резолвер имён, который в цикле читает доменное имя и выводит все соответствующие ему IP-адреса. Я закоммитила его исходники вместе с библиотекой в подпапку examples, скомпилированную версию тоже прилагаю.


Вложения:
Комментарий к файлу: Консольный резолвер.
nslookup-bin.7z [716 байт]
92 скачивания
Комментарий к файлу: Скомпилированная библиотека.
network-v1-bin.7z [1.89 КБ]
90 скачиваний

_________________
Сделаем мир лучше!
Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср сен 09, 2009 4:58 pm 
CleverMouse писал(а):
Во-вторых, я вынесла в экспорт отдельные части: getaddrinfo_start, посылающую запрос, getaddrinfo_process, обрабатывающую результат, и getaddrinfo_abort для прерывания ожидания, например, по таймауту, и вместо одного блокирующего вызова getaddrinfo можно вызвать getaddrinfo_start, после чего в цикле обработки сообщений события с сетью направлять на обработку getaddrinfo_process, а с остальными работать как обычно.

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


Вернуться к началу
   
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср сен 09, 2009 5:19 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Mario79, я не поняла вопроса. Что ты подразумеваешь под "обработкой до установки флага события"? Физическое чтение пакета из сети и сохранение его в буфер сокета? Такими вещами занимается и должно заниматься ядро, и в Колибри оно обрабатывает сигналы от сетевой платы в главном цикле ядра. Всю остальную обработку делает getaddrinfo_process, когда её позовут, в контексте того потока, который её позовёт.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср сен 09, 2009 6:56 pm 
CleverMouse
Ты все правильно поняла.
Тут скорее вопрос не столько к твоему коду, а сколько к общей организации - ЕМНИП сетеая карта в ядре не повешена на прерывание. Если оно обрабатывается в MAIN LOOP, то пропускная способность сетевого стека весьма низкая, к сожалению.


Вернуться к началу
   
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Пт сен 18, 2009 1:56 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Mario79, в сетевом стеке авторства hidnplayr, закоммиченном в ветку net репозитория Колибри, сетевая карта всё же "повешена на прерывание".

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Пт сен 18, 2009 2:16 pm 
CleverMouse
1. Мой пост относился к trunk и был размещен здесь раньше, чем появились коммиты от hidnplayr
2. Я знаю о том, что он работал над улучшенным стеком:
Current status of the network stack/network drivers
The new network stack


Вернуться к началу
   
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Вс ноя 08, 2009 3:56 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4226
Скорее всего версия downloader'a от CleverMouse основана на более старой версии downloader'a от barsuk'a, т.к. в ней наблюдается старый глюк - программа не ходит по ссылкам вида http://bash.org.ru/abyssbest и http://bash.org.ru/idea в то время, как на http://bash.org.ru переходит без проблем.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Пн ноя 09, 2009 2:41 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Я прилагаю исправленную версию без глюка, указанного Leency. Кроме исправления глюка, я частично убрала вывод на доску отладки, так что размер несколько уменьшился.


Вложения:
Комментарий к файлу: Исходные тексты.
downloader-src.7z [15.38 КБ]
86 скачиваний
Комментарий к файлу: Скомпилированная программа.
downloader-bin.7z [2.91 КБ]
90 скачиваний

_________________
Сделаем мир лучше!
Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Вт окт 05, 2010 3:31 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Я добавила в программу обработку ситуаций, при которых HTTP-сервер не указывает явно размер страницы - например, при скачивании заглавной страницы этого форума при том сервере, который стоит сейчас. Кроме того, оказалось, что версия из дистрибутива 0.7.7.0 отличается от версии, приложенной в предыдущем посте, возможностью сохранения результата в разделяемую область памяти вместо файла /rd/1/.download; эта версия содержит все изменения.


Вложения:
Комментарий к файлу: Скомпилированная программа.
downloader-bin.7z [2.95 КБ]
73 скачивания
Комментарий к файлу: Исходные тексты.
downloader-src.7z [14.01 КБ]
79 скачиваний

_________________
Сделаем мир лучше!
Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Вт окт 05, 2010 3:43 pm 
А SVN использовать сложно? Просто работу diamond'a по изготовлению ночных сборок это облегчило бы.
Вечером протестирую.

UPD. Результаты запостил в теме Снова qemu


Вернуться к началу
   
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср окт 06, 2010 4:46 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Я увеличила ограничение на урл, доведя его до 256 символов. В качестве побочного эффекта теперь урл может не помещаться в поле для ввода. К сожалению, я не располагаю сейчас достаточным количеством времени для внесения достаточно существенных изменений по использованию библиотеки edit_box вместо примитивного ввода, унаследованного от httpc.
Mario, я закоммитила программу на svn, ревизия 1645. Я также прилагаю скомпилированную версию и исходные тексты здесь.


Вложения:
Комментарий к файлу: Скомпилированная программа.
downloader-bin.7z [2.84 КБ]
73 скачивания
Комментарий к файлу: Исходные тексты.
downloader-src.7z [14 КБ]
73 скачивания

_________________
Сделаем мир лучше!
Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср окт 06, 2010 4:56 pm 
CleverMouse
Спасибо.
Если есть необходимость могу сам прикрутить box_lib - из минусов бинарник программы станет больше от 2 кб.
Также могу прикрутить OpenDialog, если есть в нем необходимость (для выбора рабочей директории например).


Вернуться к началу
   
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср окт 06, 2010 5:16 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Mario, я думаю, что edit_box в downloader однозначно нужен, а OpenDialog ни к чему. Я, впрочем, думала, что реализации всех функций по управлению edit_box находятся в разделяемой библиотеке, а код программы должен содержать только загрузку этой библиотеки и вызовы функций, причём downloader уже загружает одну библиотеку libini. Неужели вызовы функций edit_box добавляют целых 2 Кб?

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Ср окт 06, 2010 6:06 pm 
CleverMouse
Цитата:
Я, впрочем, думала, что реализации всех функций по управлению edit_box находятся в разделяемой библиотеке

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

Вызов Edit_Box добавит данные компонента, плюс три вызова процедур (отрисовка, клавиатура, мышь). Еще немного может добавить "обвязочный" код, если фокус ввода с клавиатуры потребуется устанавливать не только на Edit_Box. Ну, и остальное добавит макрос load_lib - я понимаю что есть другие способы загрузки и импорта библиотек, которые могут сократить размер кода загрузки библиотек, но они к сожалению не наглядны. Приложение просто вылетает при отсутствии библиотек или приходится создавать код объясняющий причину ошибки самому прикладному программисту, тогда как load_lib вполне себе сообщит в чем дело. Экономия этих 2 Кб не настолько существенна - профит для юзера от применения превосходит эту затрату. К тому-же в упакованном виде эти 2 Кб будут как минимум в 2 раза меньше, а возможно и еще больше сожмутся упаковщиком.
Цитата:
а OpenDialog ни к чему

Насколько я понимаю - загрузка не все время будет в рамдиск, а для пользователя редактировать INI файл достаточно муторное занятие.

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


Вернуться к началу
   
 Заголовок сообщения: Re: http качалка
СообщениеДобавлено: Чт окт 07, 2010 12:49 pm 
Я взял на себя смелость оптимизировать код (никаких библиотек не прикручивал).

SVN r.1646
Downloader версии 0.5
1) Размер бинарника сократился более чем в два раза. В несжатом состоянии 4514 байт. Прежний код был почти 11 Кб.
2) Размер занимаемый в памяти сократился до 0x7000 (28 Кб), плюс то что выделится 68 функцией. Прежний код сразу запрашивал 0x100000 (1 Мб).
3) Окно при запуске с параметром теперь не рисуется - все события кроме сетевого запрещены.

У меня остался вопрос насчет области dnsMsg - я выделил 4 Кб, но не уверен что это достаточно. В прежнем коде область была ограничена тем самым 1 мб, за минусом стековой области. Если нужно больше 4 Кб то по идее можно выделять динамически, если знать нужный размер.


Вернуться к началу
   
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 88 сообщений ]  На страницу Пред. 1 2 3 4 5 6 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB