Рубрики
Без рубрики

Многопоточность и параллелизм Java: Взламывание собеседований со старшими

Если вы хотите стать старшим инженером-программистом, вы, вероятно, знаете, насколько важен Co… Помечено как java, параллелизм, карьера.

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

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

Чтобы удовлетворить эту потребность, мы тесно сотрудничали с выдающимся инженером-программистом К.Х. Афзалом, чтобы создать всеобъемлющий курс, который поможет учащимся узнать все, что им нужно знать, чтобы преуспеть в вопросах, связанных с параллелизмом, для собеседований со старшими инженерами.

Ознакомьтесь с Многопоточность и параллелизм Java для собеседований со старшими инженерами .

Что такое многопоточность и почему она существует?

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

((3 + 2) * (6 + 4));

То, что компьютер понимает, когда ему дается эта инструкция, это:

Во-первых, найдите (3 + 2)

Затем, найти (6 + 4)

Наконец, умножьте результаты друг на друга

Если мы предположим, что каждый из этих шагов занимает ровно 1 единицу времени, то все вышесказанное будет выполнено за 3 единицы времени.

Но что, если бы два потока могли выполняться одновременно? В этом случае обе задачи сложения могут обрабатываться разными процессорами одновременно, а затем впоследствии умножаться друг на друга, как только результат будет найден. В этом чрезвычайно упрощенном сценарии те же вычисления, которые ранее занимали 3 единицы времени, будут выполнены всего за 2 единицы времени — экономия 33%.

Для более практического примера: если процессор хочет выполнить инструкцию, требующую извлечения данных из памяти, обычно требуется некоторое количество тактов — предположим, что это займет 5. В этом случае следующая инструкция не может сразу начать использовать значение, так как оно еще не “извлечено” из памяти еще на 5 тактов. Многопоточный процессор мог бы в этом случае просто начать работать над инструкцией от другого процесса тем временем. Фактически, теоретически он мог бы использовать эти 5 тактов для выполнения 5 различных задач из 5 разных процессов.

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

Преимущества многопоточности

  1. Более высокая пропускная способность или способность обрабатывать большее количество единиц информации за заданный промежуток времени. (Это предполагает, что “стоимость” пропускной способности, связанная с работой с несколькими потоками, ниже, чем создаваемая ею эффективность. Обычно это так, но не всегда.)

  2. Более отзывчивые приложения , которые обеспечивают плавный пользовательский интерфейс и иллюзию многозадачности. Например, пользовательский интерфейс приложения по-прежнему будет функциональным и отзывчивым, даже если операции ввода-вывода выполняются в фоновом режиме приложения для обработки изображений.

  3. Более эффективное использование ресурсов. Вообще говоря, создание потоков менее “затратно” по сравнению с созданием совершенно нового процесса. Веб-серверы, которые используют потоки вместо создания нового процесса при отправке веб-запросов, потребляют гораздо меньше ресурсов.

Проблемы с многопоточностью

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

  2. Более высокая стоимость обслуживания кода , поскольку в код теперь добавлено несколько уровней сложности.

  3. Больший спрос на систему . Создание каждого потока потребляет дополнительную память, циклы процессора для ведения бухгалтерского учета и время, затрачиваемое на переключение “контекстов”. Кроме того, имейте в виду, что если процессор собирается запускать 5 потоков одновременно, ему также необходимо будет хранить информацию о каждом из этих процессов и быть доступным во время выполнения других, что требует большего количества регистров.

Ограничения параллелизма

Ни один текст о многопоточности не будет полным без упоминания закона Амдала. Этот закон предусматривает, что всегда будет максимальное ускорение, которое может быть достигнуто, когда выполнение программы разделено на параллельные потоки.

Подумайте об этом грубом примере: одна женщина может родить ребенка за 9 месяцев, но это не значит, что девять женщин смогут родить ребенка за 1 месяц.

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

Закон Амдала описывает теоретический предел, которого в лучшем случае может достичь программа, используя дополнительные вычислительные ресурсы:

  • S(n) – это ускорение, достигаемое за счет использования n ядер или потоков.
  • P – это часть программы, которая может быть распараллелена.
  • (1 — P) – это часть программы, которая должна выполняться последовательно.

Пример:

Допустим, наша программа имеет распараллеливаемую часть%.9. Теперь давайте посмотрим, как происходит ускорение по мере увеличения количества процессов:

Ускорение увеличивается по мере увеличения количества процессоров или потоков. Однако теоретическое максимальное ускорение для нашей программы с последовательным выполнением 10% всегда будет равно 10. Мы не можем ускорить выполнение нашей программы более чем в 10 раз по сравнению с тем, когда мы запускаем одну и ту же программу на одном процессоре или потоке. Чтобы добиться большего ускорения, чем 10, мы должны оптимизировать или распараллелить последовательно выполняемую часть кода.

Также обратите внимание, что когда мы ускоряем выполнение нашей программы примерно в 5 раз, используя 10 процессоров, мы также уменьшаем загрузку этих 10 процессоров примерно на 50%, так как теперь 10 процессоров будут простаивать в течение оставшегося времени, когда один процессор был бы занят. Таким образом, увеличение пропускной способности за счет увеличения числа процессоров также может привести к менее эффективному использованию ресурсов.

Освойте параллелизм, практикуя реальные проблемы

Некоторые примеры вопросов

  1. Как бы вы спроектировали ванную комнату для мужчин, в которой одновременно не могли бы находиться люди разных полов или более 3 человек одновременно?

  2. Как бы вы решили ситуацию, когда 5 философов едят за круглым столом, и каждому философу нужна вилка в каждой руке, чтобы поесть, но есть только 5 вилок?

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

Дополнительные Ресурсы

Оригинал: “https://dev.to/educative/java-multithreading-concurrency-cracking-senior-interviews-4007”