Tuesday, January 15, 2013

Недавно на башорге прочитал цитату #420722: "RT @nett00n Нас с детства научили тому, что бывают распределенные вычисления: «Если одно яйцо варится пять минут, сколько будут варится пять яиц?»".

И появилась идея, как это можно использовать для обяснения некоторых аспектов многопоточности, а именно, времени выполнения нескольких паралельных задач.

Но, сначала поговорим о яйцах. "Эрудированный" человек, услишав эту задачку, без раздумий скажет, что, конечно же, яйца будут варится так же 5 минут. Хорошо, а если, взять 100 яиц. Да что вы морочаете голову, конечно же, 5 минут будут варится яйца все равно. Разве? А размер кастрюли вы учли, вы уверенны, что 100 яиц сразу влезут в любую кастрюлю? Хм, "эрудированный" человек задумается...

Таким образом, если учитывать размер кастрюли, задача предстает в новом свете.

Задача: Если одно яйцо варится T единиц времени, то сколько будут варится N яиц, при условии, что яйца варятся в одной кастрюле, вместимость которой M.

Немного поразмыслив, приходим к решению, что время готовки будет

t = (N/M + 1)*T, если N делится на  M с остатком  (N%M > 0)
t = (N/M)*T,       если N делится на  M без остатка (N%M == 0),

при чем операция деления N/M - целочисленная.

Еще кое-что не учли, ведь время на погружение и вынимание яйца из кастрюли тоже необходимо. Для простоты будем считать, что яйца погружаются и вынимаются по одному. Тогда, если время погружения + вынимания одного яйца L, то общее время готовки будет:
t + N*L.

Задача уже кажется не такой тривиальной?
И, наверное, прав был тот школьник, который говорил, что 5 яйиц будут варится 25 минут. Просто он, глубоко в подсознании, понимал, что этот ответ верен для вместимости кастрюли в одно яйцо и временем погружения и поднимания одного яйца ничтожно малым, таким, что им можно было пренебречь.

Теперь, все вышеизложенные размышления легко перенести в сферу многопоточности. Для этого нужно перечитать все выше сказанное, заменив некоторые слова, а именно:

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