Мне интересно, какие API доступны, чтобы избежать следующей проблемы.
Возвращаясь к лекциям по операционной системе на моем старом курсе CS, тема была о многопроцессорном планировании и параллельном вводе-выводе.Вот что дал лектор в качестве примера того, что должно произойти:
Два процесса, X и Y, должны кое-что сделать.Есть один процессор / шина / что угодно, и планировщик наивно распределяет временные интервалы между X и Y следующим образом:
- X получает временной интервал 1
- Y получает временной интервал 2
- X получает временной интервал 3
- ...
Это было описано как "справедливое", однако мне это кажется грубо несправедливым .Рассмотрим два случая по этой схеме
Если X и Y оба будут занимать по 10 секунд каждый, то теперь оба будут занимать 20 секунд.
Если X требуется 10 секунд, а Y - 100 секунд, то X займет 20 секунд, а Y - 110 секунд.
Если планировщик просто «сделал все X, то все Y»«тогда в первом случае X потребовалось бы 10 секунд, а Y - 20 секунд;во втором случае X будет принимать 10, а y - 110.
Каким образом система, которая никого не делает лучше, а кому-то хуже, может быть хорошей идеей?Единственный аргумент в пользу «справедливой» системы заключается в том, что если бы мы выполнили все Y раньше, чем какой-либо из X, то небольшая работа X была бы отложена из-за большой работы Y, и мы должны держать обе работы «отзывчивыми».
Во втором случае часть меня видит естественный «лучший» способ сказать: «X в 10 раз меньше, поэтому при отсутствии явных предпочтений он должен получить в 10 раз больше временных интервалов, чем Y».(Это немного похоже на предоставление пешеходам права проезда перед машинами на том основании, что они создают меньшую нагрузку на дороги, но я отступаю.) По этой схеме X завершает работу за 11 секунд, а Y - за 110 секунд.Последствия реального мира: мой mp3 загружается и воспроизводится без заметной дополнительной задержки, даже если в фоновом режиме происходит массивная копия файла.
Очевидно, существует целая вселенная доступных стратегий, и я не хочу спорить о пригодностио каком-то конкретном, моя точка зрения такова: все такие стратегии требуют знания размера задания.
Итак, есть ли API-интерфейсы для ОС (Linux илидаже Windows), которые позволяют указывать намеки на объем работы, которую будет выполнять операция?
(Примечание: вы могли бы утверждать, что дисковый ввод-вывод включает это неявно, но while(not_done){read_chunk();}
сделает его бессмысленным - видAPI, о котором я думаю, будет указывать мегабайты во время открытия файла, циклы часов во время создания потока или что-то в этом роде.)