RAID объединяет несколько физических дисков в один массив. Часть ёмкости при
этом уходит на избыточность (зеркала, чётность), поэтому под данные доступно
меньше, чем суммарный объём всех дисков.
Реализуй функцию, которая считает полезную (доступную под данные) ёмкость
массива:
func UsableCapacity(level, disks, diskSize int) int
level — уровень RAID, одно из {0, 1, 5, 10};
disks — количество дисков в массиве;
diskSize — ёмкость одного диска (в любых одинаковых единицах).
Правила по уровням:
- RAID0 (striping, без избыточности):
disks * diskSize.
- RAID1 (зеркало): данные доступны в объёме одного диска —
diskSize.
Требуется минимум 2 диска (disks >= 2).
- RAID5 (striping + чётность): один диск целиком уходит под чётность —
(disks - 1) * diskSize. Требуется минимум 3 диска (disks >= 3).
- RAID10 (зеркальные пары + striping): половина дисков — зеркала —
(disks / 2) * diskSize. Дисков должно быть чётное число и минимум 4
(disks >= 4 и disks чётно).
Если конфигурация невалидна (неизвестный level, слишком мало дисков, нечётное
число дисков для RAID10, а также disks <= 0 или diskSize < 0) — верни 0.
UsableCapacity(0, 4, 100) // → 400 (striping, всё под данные)
UsableCapacity(1, 2, 100) // → 100 (зеркало: объём одного диска)
UsableCapacity(5, 4, 100) // → 300 (один диск под чётность)
UsableCapacity(10, 4, 100) // → 200 (две зеркальные пары)
UsableCapacity(5, 2, 100) // → 0 (RAID5 требует >= 3 дисков)
Подробнее про уровни и накладные расходы — в главе «RAID».