МНОГОПОТОЧНОСТЬ ИЛИ ЧТО ОБЩЕГО У СОВРЕМЕННЫХ КОМПЬЮТЕРОВ И ЮЛИЯ ЦЕЗАРЯ
Задумывались ли вы, как так получается, что каждый из нас на своих устройствах может одновременно слушать музыку, листать ленту любимой соцсети и переписываться в Телеграме? И действительно, большинство современных устройств обладают свойством многозадачности (как и Цезарь, судя по легендам), хотя эти самые устройства имеют только один процессор и в лучшем случае пару ядер в нём. Так как так получается? В этой статье мы постараемся ответить на этот вопрос.
Как вы уже могли понять, ключевым словом в данной загадке является многопоточность. Но не все так быстро и просто.
Процессы VS Потоки.
Сразу перейдем к делу. Это два очень схожих понятия, которые часто путают. Давайте разберемся, в чем разница.
Не будем вдаваться в скучные определения, процессы, говоря простым языком, это выполнение каких-то программ на вашем устройстве, например, открытый браузер или звонок маме - это все является процессами.
Дать определение потоку немного сложнее, с некоторыми допущениями мы можем сказать, что поток это какая-то задача в рамках процесса. Например, во время звонка из предыдущего примера смартфон записывает вашу речь, преобразует в байты, зашифровывает их и отправляет по сети. С этим же, он получает по сети байты от другого устройства, преобразует их в звук и воспроизводит его. В этом примере звонок является процессом, а задачи по получению данных и их отправки являются потоками.
Однако не всегда процессы содержат несколько потоков, он может быть и один. Рассмотрим это на примере. Представим вот такую ситуацию, вы твердо решили стать крутым программистом, выбрали востребованный язык программирования, например Java, прошли пару уроков по этому языку и решили использовать свои новые знания для признания в любви соседке с пятого этажа, которая нравится вам еще с 7 класса. Вы собрали все свои знания и написали следующую программу:
public static void main(String[] args) {
for(int i = 0; i < 1000; i++){
System.out.println(“I love you <3”);
После чего отправили файл с этой программой вашей возлюбленной. И вот она решила запустить эту программу, к сожалению мы так и не узнаем, ответит ли девушка вам взаимностью, но мы точно знаем, что запуск этой программы - является процессом, в рамках которого выполняется все лишь одна задача(поток) - вывод на экран 1000 строк с признанием в любви.
Реализация многопоточности
Итак мы с вами разобрались, что такое процессы и потоки, однако мы все еще не можем ответить на поставленный вопрос.
Предположим вы счастливый обладатель мощного компьютера с 10-ядерным процессором. Тогда каждое из ваших ядер может выполнять независимые от других ядер вычисления. То есть, вы уже на аппаратном уровне можете параллельно решать 10 задач или же выполнять 10 потоков. Такой тип многопоточности называется аппаратным. Но много это или мало? На самом деле очень мало и большинство приложений использует большее количество потоков.
Данная проблема решается на уровне операционной системы. Говоря простым языком, операционная система вашего компьютера хранит список процессов и их потоков. И выполняет все потоки по кусочкам. Вернемся к программе, которую вы написали для своей соседки. Девушка заметила, что вы отправили ей файл, и решила запустить его параллельно слушая музыку в своих наушниках. Она даже не подозревает, но операционная система ее компьютера проделывает следующую работу: она видит, что в текущий момент времени должно выполняться сразу два процесса - воспроизведение музыки и выполнение вашей программы. ОС поступит следующим образом, она возьмет пару байтов композиции, выполнит преобразования и отправит на устройство вывода(наушники), запомнит, на каком месте она остановилась и перейдет к вашей программе, пару раз выведет признание любви на экран и опять вернется к музыке и так по кругу, пока процессы не завершатся. Таким образом, ОС выступает по сути в роли повара, который готовит сразу несколько блюд. Чутка подсолит одно, потом помешает другое и так далее, пока у него не закончатся заказы.Это называется программной многопоточностью.
Еще один важный момент, очевидно, что некоторые процессы имеют разный приоритет: ОС не может одинаковыми кусочками обрабатывать процесс мультимедийного плеера и каких-то важных задач для устройства. Поэтому у каждого потока свои размеры кусочков, которые будут выполняться системой. Данный размер кусочков называется выделенным потоку процессорным временем. Какому потоку какое количество процессорного времени выделить решает сама ОС.
Итоги
В рамках этой короткой статьи мы с вами обсудили, что такое многопоточность, различия между потоками и процессами, а также поняли, что такое аппаратная и программная многопоточность.Спасибо за прочтение!