Может ли AIO работать без создания потока? - PullRequest
2 голосов
/ 26 февраля 2012

Я бы хотел, чтобы aio сообщал своей программе, когда операция чтения завершается, и согласно этой странице такое уведомление может быть получено либо по сигналу, отправленному ядром, либо путем запуска потока, выполняющегопользовательская функция.Любое поведение можно выбрать, установив правильное значение sigev_notify.

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

(gdb) info threads
  Id   Target Id         Frame 
  2    Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in gettimeofday () from /lib64/libc.so.6
* 1    Thread 0x7ffff7fc3720 (LWP 6344) "xnotify" 0x0000000000401834 in update (this=0x7fffffffdc00)

В документе также указано, что: Реализация этих функций может быть выполнена с использованием поддержки в ядре (если доступно) или с использованием реализации, основанной на потоках на уровне пользователя.Хотелось бы, чтобы у меня не было потока, это возможно?

Я проверил свое ядро, и это выглядит нормально:

qdii@localhost /home/qdii $ grep -i aio /usr/src/linux/.config
CONFIG_AIO=y

Можно ли запустить aio безкакой-либо (пользовательский) поток вообще (кроме основного, конечно)?

РЕДАКТИРОВАТЬ : я копался глубже в этом.librt, кажется, предоставляет набор функций aio: просмотр источников glibc выявил что-то подозрительное: внутри /rt/aio_read.c есть заглушка функции:

int aio_read (struct aiocb *aiocbp)
{
  __set_errno (ENOSYS);
  return -1;
}

stub_warning (aio_read)

Я нашел первую соответствующую реализацию в подкаталоге sysdeps./ pthread, который напрямую называется __aio_enqueue_request(..., LIO_READ), который в свою очередь создает pthreads.Но так как мне было интересно, почему в этом случае возникнет глупость, я подумал, что, может быть, заглушка может быть реализована самим ядром Linux, и эта реализация pthread будет своего рода резервным кодом.

Grepping aio_read через мой каталог / usr / src / linux выдает много результатов, которые я сейчас пытаюсь понять.

1 Ответ

1 голос
/ 29 февраля 2012

Я обнаружил, что на самом деле есть две действительно разные aio библиотеки: одна входит в glibc , включена в librt и выполняет асинхронный доступ с использованием pthreadsДругая библиотека aio реализует тот же интерфейс, что и первый, но построена на самом ядре Linux и может использовать сигналы для асинхронной работы.

...