Передача операций асинхронного ввода/вывода
Для фактического запуска операций асинхронного ввода/вывода приложение делает системный вызов io submit , который принимает три параметра:
- ctx id— дескриптор, возвращенный системным вызовом io setupO и идентифицирующий контекст асинхронного ввода/вывода;
- iocbpp — адрес массива указателей на дескрипторы типа iocb, каждый из которых описывает одну операцию асинхронного ввода/вывода;
- nr — длина массива, на который указывает параметр iocbpp.
Структура iocb состоит из тех же полей, что и POSIX-дескриптор aiocb (aio_fildes, aio_buf, aio_nbytes, aio_offset) ПЛЮС ПОЛе aio_lio_opcode, которое содержит тип запрошенной операции (как правило, чтение, запись или синхронизация).
Служебная процедура sys io submit выполняет следующие действия:
1. Проверяет корректность массива дескрипторов iocb.
2. Ищет объект kioctx, соответствующий дескриптору ctx id, в списке, корень которого находится в поле ioctx iist дескриптора памяти.
3. Для каждого дескриптора iocb в массиве функция выполняет следующие действия:
• получает адрес файлового объекта, соответствующего дескриптору файла, хранящегося в поле aio fiides;
• выделяет и инициализирует новый дескриптор kiocb для операции ввода/вывода;
• проверяет наличие свободного слота в кольце асинхронного ввода/вывода для результата выполнения операции;
• задает метод ki retry дескриптора kiocb в соответствии с типом операции (см. ниже).
4. Выполняет фуНКЦИЮ aio_run_iocb, КОТОрую вызывает Метод ki retry, чтобы запустить фактическую пересылку данных для операции асинхронного ввода/вывода. Если метод ki retry возвращает код -eiocbretry, значит, операция асинхронного ввода/вывода была передана на выполнение,
но еще не полностью удовлетворена: функция aio run iocb будет вызвана снова для этого дескриптора kiocb, но немного позже (см. ниже). В противном случае описываемая функция вызывает функцию aio compieteO, чтобы добавить сообщение о завершении операции в кольцо контекста асинхронного ввода/вывода.
Если операция асинхронного ввода/вывода является запросом на чтение, метод ki retry соответствующего дескриптора kiocb реализуется функцией aio_pread. Эта функция выполняет метод aio read файлового объекта, а затем обновляет поля ki buf и ki ieft дескриптора kiocb в соответствии со значением, которое возвратил метод aio read. В конце работы функция aio preado возвращает количество байтов, фактически прочитанных из файла, или значение -eiocbretry, если функция определила, что не все запрошенные байты были переданы. В большинстве файловых систем метод aio read файлового объекта сводится к вызову функции generic_fiie_aio_read. Предполагая, что флаг o direct у файла установлен, эта функция вызывает функцию generic fiie direct ioo, как было описано в предыдущем разделе. Однако в этом случае функция biockdev_direct_ioo не блокирует текущий процесс, ожидающий завершения пересылки данных, а возвращает управление немедленно. Поскольку операция асинхронного ввода/вывода все еще ждет своего выполнения, функция aio run iocb будет вызвана снова, на этот раз потоком ядра aio из рабочей очереди aio wq. Дескриптор kiocb следит за ходом выполнения ввода/вывода. В конце концов, все запрошенные данные будут пересланы, и результат выполнения будет занесен в кольцо асинхронного ввода/вывода.
Аналогичным образом, если операция асинхронного ввода/вывода является запросом на запись, метод ki retry соответствующего дескриптора kiocb реализуется функцией aio pwrite . Эта функция выполняет метод aio write файлового объекта, а затем обновляет поля ki buf и ki ieft дескриптора kiocb в соответствии со значением, которое возвратил метод aio write. В конце работы функция aio pwrite возвращает количество байтов, фактически записанных в файл, или значение -eiocbretry, если функция определила, что не все запрошенные байты были переданы. В большинстве файловых систем метод aio write файлового объекта сводится к вызову функции generic fiie aio write noiock . Предполагая, что флаг odirect у файла установлен, эта функция вызывает функцию generic f ile direct IO , как было ОПИСанО ВЫШе.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница