Задачи, головоломки, загадки

Возникла практическая задача.

Имеется жесткий диск, который вращается с постоянной скоростью.
Плотность записи по всему диску одинаковая.
Скорость чтения на самых внешних дорожках равна Vmax (в мегабайтах в секунду).
Cкорость чтения на самых внутренних дорожках равна Vmin (для определенности можно принять Vmin = 1/2 Vmax).
Поскольку плотность записи везде одинакова, то можно принять что скорость чтения пропорциональна радиусу дорожки.

Какова будет средняя скорость чтения при чтении всего диска? Или другими словами, за сколько времени можно будет прочитать весь диск, если его объем известен заранее и равен C?
 
Средняя скорость чтения будет примерно равна написанной в спецификации на диск.
Опять же, хотелось бы знать свойства интерфейса, бо прочесть в заданном случае это не просто почитать, но и создать временный файл содержимого на втором диске, который должен быть больше.
 
Средняя скорость чтения будет примерно равна написанной в спецификации на диск.
Опять же, хотелось бы знать свойства интерфейса, бо прочесть в заданном случае это не просто почитать, но и создать временный файл содержимого на втором диске, который должен быть больше.
Интерфейс у нас не является фактором, т.к. изначально поддерживает гораздо большие скорости.
Временный файл не будем создавать. Допустим читаем весь диск чтобы подсчитать сумму всех байтов на нем.

ПС. Чтобы два раза не вставать, сразу второй вопрос: какова средняя скорость чтения случайного одного мегабайта на этом диске.
 
ВотЪ, сделалъ тестъ сейчас
disktest.jpg

где
  • Seq Q32T1: Sequential (Block Size=128KiB) Read/Write with multi Queues & Threads
  • 4K Q32T1: Random 4KiB Read/Write with multi Queues & Threads
  • 4K Q1t1: Random 4KiB Read Write with single Queue & Thread
 
... Плотность записи по всему диску одинаковая. ...
Не хочу придираться, но задача определена как "практическая". В реальности плотность записи неодинаковая. Это связано с тем что диск логичеcки делится на сектора, сегменты, дорожки и т.д., и очень неудобно если на каждой дорожке кол-во информации различается.
Самым простым решением было бы сделать постоянной "угловую" плотность информации (т.е. на единицу угла поворота), но в этом случае дальше от центра плотность информации на единицу площади падает, следовательно КПД такого дизайна хуже.
В реальности диск делится на радиальные "зоны", в каждой из которых угловая плотность информации постоянна, при этом средняя плотность информации на единицу площади по всему диски примерно одинаковая.

Подробнее здесь: http://hddscan.com/doc/HDD_Tracks_and_Zones.html

Далее по задаче.

Т.к. скорость вращения постоянна, то каждая дорожка читается за одно время. Очевидно также что скорость чтения информации пропорциональна радиусу дорожки.

Т.е. скорости считывания и объёмы информации считанные с каждой дорожки образуют арифметическую прогрессию, и времена чтения каждой дорожки равны.
Следовательно средняя скорость чтения равна среднему арифметическому чтения всех дорожек.
 
Далее по задаче.

Т.к. скорость вращения постоянна, то каждая дорожка читается за одно время. Очевидно также что скорость чтения информации пропорциональна радиусу дорожки.

Т.е. скорости считывания и объёмы информации считанные с каждой дорожки образуют арифметическую прогрессию, и времена чтения каждой дорожки равны.
Следовательно средняя скорость чтения равна среднему арифметическому чтения всех дорожек.
ОК, согласен. А что по второму вопросу: какова средняя скорость чтения случайно расположенного по всему доступному объему куска, допустим в 100МБ. (Кусок достаточно большой, чтобы пренебречь временем позиционирования головки).
 
ОК, согласен. А что по второму вопросу: какова средняя скорость чтения случайно расположенного по всему доступному объему куска, допустим в 100МБ. (Кусок достаточно большой, чтобы пренебречь временем позиционирования головки).
Ну тут у нас по аналогии будет отношение суммы квадратов скорости чтения всех дорожек к сумме этих дорожек. Т.е. для двух дорожек (V0^2 + V1^2) / (V0 + V1). Наверное это можно и более красиво записать.
Ну это при условии что объём диска сильно больше читаемого куска.
 
Спойлер: Вроде так Ну тут у нас по аналогии будет отношение суммы квадратов скорости чтения всех дорожек к сумме этих дорожек. Т.е. для двух дорожек (V0^2 + V1^2) / (V0 + V1). Наверное это можно и более красиво записать.
Ну это при условии что объём диска сильно больше читаемого куска.
Не, тут что-то не то. Допустим минимальная скорость равна нулю, тогда получается, что средняя скорость равна максимальной.
 
Не, тут что-то не то. Допустим минимальная скорость равна нулю, тогда получается, что средняя скорость равна максимальной.
Да не, всё правильно. Если скорость у дорожки равна нулю, то значит и данных на ней тоже ноль и её можно не учитывать. Я же там сказал что это просто тупой учёт всех дорожек, общую формулу от Vmin и Vmax для бесконечного числа дорожек я так с наскока не смог вывести, но очевидно что там что-то нелинейное будет.

Т.е. ещё раз, моя тупая формула для определения средней скорости чтения со случайного куска на диске.
V = (V0^2+V1^2 + ... + Vn^2) / (V0 + V1 + ... Vn)
Где n - число дорожек, Vi - скорость чтения на i-ой дорожке.
 
Последнее редактирование:
Да не, всё правильно. Если скорость у дорожки равна нулю, то значит и данных на ней тоже ноль и её можно не учитывать. Я же там сказал что это просто тупой учёт всех дорожек, общую формулу от Vmin и Vmax для бесконечного числа дорожек я так с наскока не смог вывести, но очевидно что там что-то нелинейное будет.

Т.е. ещё раз, моя тупая формула для определения средней скорости чтения со случайного куска на диске.
V = (V0^2+V1^2 + ... + Vn^2) / (V0 + V1 + ... Vn)
Где n - число дорожек, Vi - скорость чтения на i-ой дорожке.
А, понял. Эта формула верна, если бы было всего две дорожки, только самая быстрая и самая медленная. Вопрос к чему оно стремится, если добавить кучу промежуточных дорожек.
 
Не хочу придираться, но задача определена как "практическая". В реальности плотность записи неодинаковая.

Подробнее здесь: http://hddscan.com/doc/HDD_Tracks_and_Zones.html

Далее по задаче.

Т.к. скорость вращения постоянна, то каждая дорожка читается за одно время. Очевидно также что скорость чтения информации пропорциональна радиусу дорожки.

Т.е. скорости считывания и объёмы информации считанные с каждой дорожки образуют арифметическую прогрессию, и времена чтения каждой дорожки равны.
Следовательно средняя скорость чтения равна среднему арифметическому чтения всех дорожек.
На хороших дисках количество секторов разное на разных дорогах.

Это я тебе как писатель микркода и прочих драйверов говорю.
Еще интерлив вспомните..... :)
 
А вот на FreeBSD проделал тест
dd говорит ниочем, без знания тонких настроек: кеша операционки, кеша диска, как конкретная реализация открывает/закрывает девайс/файла. там очень много через ioctl можно рассказать. Это не считая установок различных полиси на одернуть операции в ОС, контроллер и самом диске.
 
Если серьезно:
С внешних дорог средняя скорость чтения больше, потому как:
1. Там больше секторов.
2. Там больше расстояние между дорогами, и легче позиционировать головы. (алгоритм позиционирования головы при long seek это отдельная песня)

Если есть вопросы, спрашивайте.
 
ОК, согласен. А что по второму вопросу: какова средняя скорость чтения случайно расположенного по всему доступному объему куска, допустим в 100МБ. (Кусок достаточно большой, чтобы пренебречь временем позиционирования головки).
Разумеется это зависит от многих факторов. Предполагаю что ОС предпочитает сперва заполнять "быстрые" зоны диска.
Но если абстрагироваться от этого, то:

Подвох в формулировке: что значит "средняя скорость чтения".

Если имеется ввиду что выбирается случайный "небольшой" кусок данных (который помещается в одну дорожку, то вероятность попасть в конкретную дорожку линейно зависит от её радиуса, т.е. вероятность попасть в быструю дорожку выше.
В этом случае средняя скорость чтения равна сумме квадратов скоростей поделить на сумму скоростей.
Заменяем сумму интегралом, немного вычислений, и получаем:

<V> = 2/3 (Vmax^3 - Vmin^3) / (Vmax^2 - Vmin^2)

<V> = 2/3 (Vmax^2 + Vmax*Vmшт + Vmin^2) / (Vmax + Vmin)

Формула логична. Если Vmin=Vmax, то <V> = Vmin = Vmax
Если Vmin=0, то <V> = 2/3 Vmax, т.е. мы видим что быстрые дорожки получили больший вес.

-----------------------------------
Теперь можно рассмотреть другой вариант задачи. Скажем, какова средняя скорость чтения в случайно выбранный момент времени.
Здесь с одной стороны вероятность нахождения данных на быстрой дорожке выше, с другой - чтение с этой дорожки берёт меньше времени.

Для данной задачи эти эфекты друг друга уравновешивают, и средняя скорость чтения (по времени) равна (Vmax + Vmin) / 2.