Многопоточное программирование пришло чуть позже, чем многоядерность компьютеров. Многоядерность компьютера — это когда в одном процессоре содержится несколько ядер, которые обрабатывают поступающие команды. Многоядерность увеличила быстродействие компьютерных устройств, так как открыла возможность выполнять несколько параллельных команд единовременно. Когда ядро только одно, тогда все поступающие в процессор команды обрабатываются в строгой последовательности, которая формируется согласно приоритетности команд.
Инженеры придумали многоядерные компьютеры, а программисты придумали к ним многопоточное программирование. Многопоточное программирование и многопоточность — тесно связанные понятия:
многопоточность — это свойство платформы (операционной системы, виртуальной машины или приложения), которое позволяет выполнять один процесс параллельно в несколько потоков;
многопоточное программирование — это придание программе свойства, которое позволит ей выполняться параллельно.
Многопоточное программирование
Здесь важно правильно расставить точки над «i»:
многоядерность — это свойство устройства, подразумевающие наличие нескольких ядер в процессоре;
многопоточность — это свойство ядра, операционной системы, виртуальной машины, подразумевающее способность параллельно выполнять одну программу в несколько потоков;
одно ядро в процессоре может выполнять один поток, а может и несколько — это зависит от свойства ядра;
процесс в операционной системе — это выполнение одной программы;
процессы не взаимосвязаны, поэтому могут выполняться отдельно друг от друга, при этом процесс может состоять из нескольких потоков;
поток программы — это «ветвь», «нить», часть кода одной программы, которая может выполняться параллельно с другими такими же частями;
потоки одной программы взаимосвязаны и не могут выполняться отдельно друг от друга, при этом потоки разных программ не взаимосвязаны;
если программа не запрограммирована выполняться в несколько потоков, тогда она выполняется в один поток, то есть все ее команды выполняются последовательно;
любой программный код — это перечень команд для процессора, обозначающих, что ему нужно вычислить или сделать.
Что такое многопоточность и многопоточное программирование
Мы выяснили, что многопоточность — это параллельное выполнение одной программы в несколько потоков. Как это выглядит на деле? Когда мы запускаем операционную систему, то в автоматической загрузке находится несколько системных программ:
антивирус,
часы с датой,
управление звуком,
мессенджер,
и др.
Каждая отдельная программа — это отдельный процесс. В операционной системе запускается много служебных процессов, о которых пользователь может и не подозревать. Если после загрузки ОС вы запустите еще и браузер, чтобы зайти в интернет, то вы запустите еще один процесс в системе. Если принять условие, что одна программа — это один процесс, а один процесс — это один поток, тогда каждый такой поток обрабатывается в одном из потоке ядра процессора. Ядра обрабатывают потоки, а не процессы. Если ядро одно и поток у ядра только один, тогда все программные потоки будут обрабатываться последовательно. При этом операционная система сама решает, какому программному потоку отдать приоритет обработки. Обычно тот программный поток, который «прямо сейчас» необходим пользователю, обрабатывается «без очереди», а остальные «стоят и ждут». Это похоже на автомобили в пробке — все ждут своей очереди, но если едет машина со спецсигналами, тогда автомобили вынуждены «расступиться». Как только спецмашина проедет, все автомобили опять становятся в очередь.
Точно так же реализуется последовательность выполнения программных потоков, если в компьютере несколько ядер и у них есть по несколько потоков для обработки команд. В этом случае ОС будет распределять выполнение программных потоков между несколькими потоками ядер.
Многоядерность и многопоточность компьютеров значительно ускорили обработку программных команд и, следовательно, быстродействие самих устройств. Скорость работы компьютера увеличивается, если работают несколько программ (процессов), но скорость обработки одной программы не сильно увеличивается, если ее обрабатывать в одном потоке. Поэтому программисты решили распараллелить программы и заставить выполнять одну и ту же программу одновременно в несколько потоков.
На деле это выглядит так: у вас запущена ОС и несколько системных приложений. Вы запустили браузер — все это отдельные процессы. Представим, что вы открываете в браузере несколько вкладок: в одной включаете музыку, в другой открываете почту, в третьей ищите какую-то информацию и т. д. Если браузер реализован в парадигме «многопоточное программирование», тогда каждая отдельная открытая вкладка может быть отдельным потоком одного процесса. Браузер — это процесс, а вкладка — это поток этого процесса. По мере того, какая вкладка у вас будет активной, той операционная система и будет отдавать приоритет обработки в потоках ядра.
Заключение
Многопоточное программирование — это доктрина, позволяющая разработчикам распараллеливать выполнение программ. Многопоточные программы работают быстрее, чем однопоточные аналоги. Однако многопоточность программы требует дополнительных усилий со стороны разработчика, потому что многопоточность программы реализуется только программистом, а не операционной системой. Операционная система лишь распределяет выполнение потоков по степени их важности, но не формирует потоки отдельных процессов.
Многоядерность и многопоточность устройств становится нормой при производстве компьютеров. Использование однопоточных программ на многоядерных компьютерах — это намеренное не использование его мощности. Поэтому рано или поздно многопоточное программирование возьмет верх над однопоточным.
Другое