Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Nov 19, 2019 12:48 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 91 posts ]  Go to page Previous 1 2 3 4 57 Next
Author Message
 Post subject: Re: http качалка
PostPosted: Wed Sep 09, 2009 3:44 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Я начала создавать библиотеку для работы с сетью. Первая версия экспортирует стандартные функции 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, скомпилированную версию тоже прилагаю.


Attachments:
File comment: Консольный резолвер.
nslookup-bin.7z [716 Bytes]
Downloaded 158 times
File comment: Скомпилированная библиотека.
network-v1-bin.7z [1.89 KiB]
Downloaded 154 times

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

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


Top
   
 Post subject: Re: http качалка
PostPosted: Wed Sep 09, 2009 5:19 pm 
Offline
Kernel Developer
User avatar

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

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


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


Top
   
 Post subject: Re: http качалка
PostPosted: Fri Sep 18, 2009 1:56 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Mario79, в сетевом стеке авторства hidnplayr, закоммиченном в ветку net репозитория Колибри, сетевая карта всё же "повешена на прерывание".

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


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


Top
   
 Post subject: Re: http качалка
PostPosted: Sun Nov 08, 2009 3:56 pm 
Offline
Designer
User avatar

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

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


Top
   
 Post subject: Re: http качалка
PostPosted: Mon Nov 09, 2009 2:41 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Я прилагаю исправленную версию без глюка, указанного Leency. Кроме исправления глюка, я частично убрала вывод на доску отладки, так что размер несколько уменьшился.


Attachments:
File comment: Исходные тексты.
downloader-src.7z [15.38 KiB]
Downloaded 147 times
File comment: Скомпилированная программа.
downloader-bin.7z [2.91 KiB]
Downloaded 154 times

_________________
Сделаем мир лучше!
Top
   
 Post subject: Re: http качалка
PostPosted: Tue Oct 05, 2010 3:31 pm 
Offline
Kernel Developer
User avatar

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


Attachments:
File comment: Скомпилированная программа.
downloader-bin.7z [2.95 KiB]
Downloaded 133 times
File comment: Исходные тексты.
downloader-src.7z [14.01 KiB]
Downloaded 140 times

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

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


Top
   
 Post subject: Re: http качалка
PostPosted: Wed Oct 06, 2010 4:46 pm 
Offline
Kernel Developer
User avatar

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


Attachments:
File comment: Скомпилированная программа.
downloader-bin.7z [2.84 KiB]
Downloaded 135 times
File comment: Исходные тексты.
downloader-src.7z [14 KiB]
Downloaded 135 times

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


Top
   
 Post subject: Re: http качалка
PostPosted: Wed Oct 06, 2010 5:16 pm 
Offline
Kernel Developer
User avatar

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

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


Top
   
 Post subject: Re: http качалка
PostPosted: Wed Oct 06, 2010 6:06 pm 
CleverMouse
Quote:
Я, впрочем, думала, что реализации всех функций по управлению edit_box находятся в разделяемой библиотеке

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

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

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

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


Top
   
 Post subject: Re: http качалка
PostPosted: Thu Oct 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 Кб то по идее можно выделять динамически, если знать нужный размер.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 91 posts ]  Go to page Previous 1 2 3 4 57 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited