В статье "Boost application performance using asynchronous I/O (http://www-128.ibm.com/developerworks/linux/library/l-async/)" рассказывается про оптимизацию производительности приложений используя средства асинхронного ввода/вывода в Linux.URL: http://www-128.ibm.com/developerworks/linux/library/l-async/
Новость: http://www.opennet.me/opennews/art.shtml?num=8275
- if ((ret = aio_return( &my_iocb )) > 0)
+ if ((ret = aio_return( &my_aiocb )) > 0)
на познакомиться IMHO вполне приличная статья, молодцы.// wbr
Я в таких случаях завожу отдельный поток, очередь и бросаю всё в неё. Как по мне такое решение более красивое, наглядное и простое чем полинг состояния AIO.
Дык, в подсистеме AIO тоже есть ниточки - aio_threads :)#ifdef __USE_GNU
extern void aio_init (__const struct aioinit *__init) __THROW;
#endifstruct aioinit
{
int aio_threads; /* Maximal number of threads. */
int aio_num; /* Number of expected simultanious requests. */
int aio_locks; /* Not used. */
int aio_usedba; /* Not used. */
int aio_debug; /* Not used. */
int aio_numusers; /* Not used. */
int aio_idle_time; /* Number of seconds before idle thread
terminates. */
int aio_reserved;
};
Только действительно, немного через ж...у получается...
>Дык, в подсистеме AIO тоже есть ниточки - aio_threads :)Но обработка то всё-равно выполняется в одном потоке.
Если с aio (если верить статье ;) я буду делать:
-----
ret = aio_write( &my_aiocb );
while ( aio_error( &my_aiocb ) == EINPROGRESS )
do_something();
-----То в случае с потоками получится примерно следующее:
-----
queue.add(buf, size);
-----А в соседнем потоке ждём очередь, и потом пишем. Так удобно логеры делать и обработку потока данных (заводим три потока: reader, writer и worker и понеслось ;)
Ну struct QUEUE, это отдельная история...Вот ещё в догону парочка...
http://lwn.net/Articles/145365
http://www.bullopensource.org/posix
>Но обработка то всё-равно выполняется в одном потоке.
Для простых дисков и дисковых массивов один поток лучше чем много.По скорости.
>>Но обработка то всё-равно выполняется в одном потоке.
>Для простых дисков и дисковых массивов один поток лучше чем много.По скорости.Я не то имел в виду. Есть один поток (thread) который пишет на диск. У него есть очередь в которую другие потоки кидают запросы на запись.
а если не диск а сокеты??
>а если не диск а сокеты??Зависит от логики. Либо один сокет на поток, либо несколько и через select/etc.
AIO read and write on sockets (doesn't return an explicit error, but quietly defaults to synchronous or rather non-AIO behavior)
http://lse.sourceforge.net/io/aio.html
При использовании сигналов или нитей для уведомления о завершении, нужно ли хранить структуры которые использовались для вызова? или можно не дожидаясь завершения операции заюзать структуру aiocb снова?Вобще хочется дать n запросов на ио через lio_listio и двигатся далее
Подскажиете пожалуста, как динамически создать N структур для aio и передать их lio_listio? У меня за цикл разное количество операций и я не могу эффективно использовать уже выделенную память или создать столько сколько нужно.