Заключение
Приоритетное планирование
У каждого потока управления ( процесса ) в каждый момент времени есть определенный приоритет. Равноприоритетные потоки управления, готовые к выполнению, объединяются в списки. Эти списки упорядочены, от первого элемента (головы) к последнему (хвосту).
Цель политики планирования состоит в определении допустимых операций над множеством списков (например, перемещение потоков между списками и внутри них).
Реализация, удовлетворяющая стандарту POSIX, должна выбирать для выполнения процесс ( поток управления ), находящийся в голове наиболее приоритетного списка, независимо от ассоциированной политики планирования.
Политика SCHED_FIFO ( планирование по очереди) предписывает упорядочивать потоки управления в пределах каждого списка по длительности ожидания.
Чтобы сделать планирование более справедливым по отношению к равноприоритетным процессам, можно воспользоваться политикой SCHED_RR (циклическое планирование ). Она эквивалентна SCHED_FIFO с одним исключением: когда время, в течение которого поток управления занимал процессор, становится больше или равным результату функции sched_rr_get_interval(), он перемещается в хвост соответствующего списка, а для выполнения выбирается головной поток. Таким образом, ни один из равноприоритетных потоков не сможет монополизировать процессор.
По сравнению с SCHED_FIFO и SCHED_RR, политика SCHED_SPORADIC (спорадическое планирование ) представляется гораздо более сложной. Она позволяет резервировать процессорное время для выполнения непериодических действий.
Четвертая политика планирования, которую должны поддерживать реализации, соответствующие стандарту POSIX, называется "прочей" ( SCHED_OTHER ). Она необходима, чтобы мобильные приложения могли заявить, что они больше не нуждаются в политике планирования реального времени.
Стандарт POSIX-2001 предусматривает следующие функции управления планированием процессов: sched_getscheduler() (опрос политики планирования процесса ), sched_getparam() (опрос параметров планирования процесса ), sched_setscheduler() (установка политики и параметров планирования процесса ) и sched_setparam() (установка параметров планирования процесса ).
Стандарт POSIX-2001 предоставляет также средства для опроса характеристик политик планирования – минимального ( sched_get_priority_min() ) и максимального ( sched_get_priority_max() ) среди допустимых приоритетов, а также величины кванта выделяемого процессорного времени для политики циклического планирования ( sched_rr_get_interval() ).
Функция sched_yield() позволяет вызывающему потоку управления добровольно уступить процессор.
Асинхронный ввод/вывод
Средства асинхронного ввода/вывода позволяют прикладным процессам ставить в очередь команды ввода/вывода данных, продолжать работу параллельно с операциями передачи данных и получать асинхронные уведомления о завершении выполнения этих команд.
После завершения асинхронной операции ввода/вывода приложению может быть доставлен сигнал.
Жизненный цикл операции асинхронного ввода/вывода включает два этапа:
Основными операциями асинхронного ввода/вывода являются чтение ( aio_read() ) и запись ( aio_write() ) данных.
Функция lio_listio() позволяет за один вызов поставить в очередь список запросов на чтение и/или запись данных.
Для выяснения статуса операций асинхронного ввода/вывода служат функции aio_return() и aio_error().
Ожидающие обработки запросы на асинхронный ввод/вывод можно аннулировать, воспользовавшись функцией aio_cancel().
Согласно стандарту POSIX-2001, списком можно не только инициировать запросы на асинхронный ввод/вывод, но и ожидать их завершения. Для этого служит функция aio_suspend().
Функции sync(), fsync(), fdatasync(), aio_fsync() предназначены для согласования состояния буферизованных и хранимых в долговременной памяти данных, обеспечения целостности данных и файлов.
Рекомендательные интерфейсы
В стандарте POSIX-2001 предусмотрена оптимизация работы с файлами, которая может затрагивать следующие аспекты осуществляемого приложением ввода/вывода:
- последовательный доступ;
- кэширование;
- передача данных;
- предварительное резервирование долговременной и оперативной памяти.
Описанные возможности реализуют функции posix_fadvise(), posix_fallocate(), posix_madvise() и posix_memalign().
Ожидаемое поведение может специфицироваться как:
- отсутствие рекомендаций;
- последовательный доступ;
- случайный доступ;
- доступ в ближайшее время;
- отсутствие доступа в ближайшее время;
- однократный доступ.
При оптимизации обмена данными с файлами, наряду с применением рекомендательных интерфейсов, целесообразно учитывать значения ряда конфигурационных констант:
POSIX_REC_MIN_XFER_SIZE
Минимальное рекомендуемое число передаваемых байт при обмене данными с файлами. Рекомендуется также, чтобы и смещение передаваемой порции данных от начала файла было кратным POSIX_REC_MIN_XFER_SIZE.
POSIX_REC_MAX_XFER_SIZE
Максимальное рекомендуемое число передаваемых байт при обмене данными с файлами.
POSIX_REC_XFER_ALIGN
Рекомендуемое значение для выравнивания границы буфера обмена данными с файлами.