Упорядочивание потоков в C ++ / Linux - PullRequest
0 голосов
/ 23 апреля 2011

В настоящее время я выполняю симуляцию операций ввода-вывода жесткого диска в C ++ и использую потоки pthread и мьютекс для чтения на диске.

Однако я пытаюсь оптимизировать время чтения, упорядочивая свои темы.Проблема в том, что мой диск в данный момент читает сектор, и поступает куча запросов на чтение, любой из них будет выполнен.Я хочу упорядочить их так, чтобы следующий запрос выполнялся с ближайшим сектором.

Таким образом, головка виртуального жесткого диска не будет перемещаться слишком сильно.

Мой вопрос: Является ли использование системы приоритетов процессов Linux хорошим способом убедиться, что ближайший запрос на чтение будет выполнен раньше остальных?Если нет, то на что я могу рассчитывать?

PS: Извините за мой английский.

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2011

Очень редко стоит полагаться на точное поведение схем приоритетов процессов, особенно на универсальные операционные системы, такие как Linux, потому что они не гарантируют вам какое-либо конкретное поведение. Создание чего-либо с наивысшим приоритетом не поможет, если оно ссылается на некоторый адрес в памяти или на какой-либо вызов ввода-вывода, что заставляет его задерживаться на мгновение - операционная система затем запустит какой-то процесс с более низким приоритетом, и вам будет неприятно удивлен.

Если вы хотите быть уверены в том, в каком порядке выполняются запросы дискового ввода-вывода, или имитировать это, вы можете создать поток, который хранит список ожидающих операций ввода-вывода и запрашивает один запрос на выполнение. одновременно, в порядке, которым он управляет.

2 голосов
/ 23 апреля 2011

Планировщики ввода / вывода в ядре Linux могут переупорядочивать и объединять операции чтения (и в некоторой степени записи), чтобы их упорядочение было более благоприятным для диска, как вы это описываете. Это влияет на планировщик процессов (который также заботится о потоках) тем, что потоки, ожидающие ввода-вывода, также «переупорядочиваются» - их запросы на чтение или запись выполняются в том порядке, в котором их обслуживал диск, а не в том порядке в котором они сделали свой запрос. (Это очень упрощенное представление о том, что действительно происходит.)

Но если вы моделируете дисковый ввод-вывод, т. Е. Если вы на самом деле не делаете реальный ввод-вывод, планировщик ввода-вывода вообще не задействуется. Только планировщик процессов. А планировщик процессов не знает, что вы «имитируете» жесткий диск - у него нет информации о том, что делают процессы, просто информация о том, нуждаются ли они в ресурсах процессора или нет. (Опять же, это упрощенное представление о том, как все работает).

Таким образом, планировщик процессов не поможет вам переупорядочить или объединить моделирование запросов на чтение. Вы должны реализовать эту логику в своем коде. (Чтение о планировщиках ввода / вывода - отличная идея.)

Если вы отправляете реальный ввод-вывод, то в некоторых случаях выполнение переупорядочения может улучшить производительность, и действительно алгоритмы планировщика ввода-вывода для оптимизации пропускной способности или задержки будут влиять на планирование ваших потоков (для блокировки В любом случае, ввод / вывод - асинхронный ввод / вывод еще более усложняет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...