Асинхронные операции ввода/вывода ядра операционной системы

Оценить
(1 голос)

В том случае, когда дисковая операция ввода/вывода выполняется с использованием системных вызовов read, pread, write и pwrite, поток выполнения останавливается, ожидая перед своим продолжением, пока очередная операция ввода/вывода не будет завершена. Следовательно, такие вызовы называются блокирующими (blocking) системными вызовами. Чтобы позволять другой работе быть выполненной за то же время, процесс освобождает ЦП на период ожидания завершения операции ввода/вывода. Ввод/вывод такого типа известен как синхронный (synchronous I/O).

Альтернативной формой ввода/вывода, используемой как многопоточными, так и базирующимися на процессах базами данных, является асинхронный ввод/вывод (asynchronous I/O). Асинхронные вызовы из библиотеки ввода/вывода, aioread и aiowrite, возвращают управление вызывающей программе немедленно, без блокирования, даже в том случае, если данная операция ввода/вывода еще не завершена. Вызывающая программа либо ожидает уведомления относительно завершения данной операции ввода/вывода через сигнал (SIGIO), либо "получает результат" данной операции ввода/вывода, но часто после задержки, посредством блокирования с помощью специального библиотечного вызова aiowait.

Очистители страниц памяти (Database Writers в терминологии Oracle) обычно используют асинхронный ввода/вывод, чтобы выполнить несколько операций записи в одно и то же время. Этот подход более эффективен, чем ожидание завершения отдельно для каждой операции записи перед инициализацией следующей операции. Синхронный параллелизм ввода/вывода может быть улучшен в том случае, если одновременно используется несколько очистителей страниц, но асинхронный ввод/вывод представляет собой более эффективное решение.

Асинхронные операции ввода/вывода осуществляются с помощью пользовательской библиотеки libaio.so. Поскольку первоначальная реализация зависит от пользовательских потоков, то вызов асинхронной операции ввода/вывода задействует несколько переключателей между привилегированным режимом (режимом ядра) и непривилегированным (пользовательским) режимом. Чтобы улучшить эффективность асинхронных операций ввода/вывода, специальный модуль ядра операционной системы, /kernel/sys/kaio, полностью обрабатывает асинхронный ввод/вывод в режиме ядра. Эта функциональная возможность, известная под названием КАЮ (Kernel Asynchronous I/O — асинхронный ввод/вывод ядра), была введена в Solaris 2.4. КАЮ не требует от разработчиков программных продуктов внесения каких-либо изменений: он выполняется прозрачным образом на стороне вызывающей программы.

Когда выполняется операция асинхронного ввода/вывода, библиотека пытается использовать КАЮ, чтобы обработать эту операцию. Но КАЮ работает только, если целью асинхронного ввода/вывода является символьно-специальный файл устройства. Другими словами, КАЮ работает лишь с низкоуровневыми (с неформатированными данными в виде битовых потоков) устройствами. Если конкретный файл базы данных реализован на каком-нибудь низкоуровневом устройстве (например, в разделе диска или на низкоуровневых томах, предоставляемых менеджером томов), то ввод/вывод будет выполнен с использованием КАЮ. Если файлы базы данных находятся в файловых системах, попытка воспользоваться КАЮ потерпит неудачу (с ошибкой ENOTSOP), и библиотека вместо этого создаст пользовательский поток для завершения операции ввода/вывода.

КАЮ обеспечивает повышение производительности для файлов базы данных на низкоуровневых устройствах за счет сокращения маршрута программного кода, требуемого для того, чтобы завершить асинхронную операцию ввода/вывода. Доступность КАЮ является одной из многих причин того, почему низкоуровневые устройства представляют собой более эффективный выбор для файлов БД, нежели файловые системы.

Расширения файловой системы Unix
Прямой ввод/вывод
Другие оптимизации ввода/вывода
Поддержка больших файлов
Другие оптимизации

Добавить комментарий


Защитный код
Обновить