Поток, процесс, задача, операционная система, программа, программирование — это все звенья одной системы. Что такое потоки в процессоре? Что такое процесс в программировании? Что такое потоки и процессы в операционной системе? Эти и другие вопросы часто ставят врасплох начинающих программистов. Во всех этих определениях можно не запутаться, если понимать, о чем идет речь. Сегодня в статье мы разложим все «по полкам» простым и понятным языком.
Процессы и потоки в операционной системе (ОС)
Операционная система появилась намного позже, чем первые компьютеры. А те ОС, которые известны нам сейчас, появились намного позже, чем первые операционные системы. Появление ОС у компьютеров дало возможность перейти от однозадачного режима работы устройств к многозадачному. Потому что операционная система принесла с собой способность параллельно выполнять несколько одновременных задач. Такое определение верно с точки зрения пользователя, но неверно с точки зрения программиста.
Для программиста же операционная система является всего лишь программой или задачей, которую выполняет устройство. ОС имеет «глубокий» доступ к аппаратным системам устройства: процессору, материнской плате, видеокарте, аудиокарте, периферийному оборудованию и т. д., поэтому пользователи считают, что она выполняет несколько задач на компьютере. Хотя она контролирует всего лишь процессы.
Процесс на компьютере — это любое отдельно запущенное приложение. Например, открытый браузер, антивирусная программа, Skype, трей и др. — все это отдельные процессы на компьютере. Каждый отдельный процесс способен существовать отдельно друг от друга. Помимо тех процессов, которые видны пользователю на экране компьютера или которые он запустил самостоятельно, существует множество служебных процессов. Служебные процессы не видны сразу, для того чтобы их увидеть, необходимо как минимум запустить «Диспетчер задач».
Каждый отдельный процесс потребляет ресурсы устройства. Главная задача любой операционной системы — контроль потребляемых ресурсов компьютера, а также их ограничение и распределение между всеми процессами, которые на них претендуют. Главными ресурсами компьютера являются:
оперативная память;
время процессоров.
Задачу операционной системы в компьютере мы выяснили. Задачей программиста в этом же контексте является написание такого приложения, которое будет минимально расходовать системные ресурсы, в частности оперативную память и время процессора. Если разрабатывается большое приложение, тогда чем меньше оно потребляет системных ресурсов, тем медленнее оно работает. Поэтому программист большого приложения вынужден постоянно искать компромисс между потреблением ресурсов и производительностью приложения.
Некоторые пользователи могут заметить, что мощность компьютеров постоянно растет, поэтому беспокойство о ресурсах компьютера не несет в себе смысла. Тут нужно отметить, что вместе с мощностью компьютера растет сложность используемых программ, поэтому экономия ресурсов компьютера всегда будет актуальной.
Когда запускается процесс на компьютере, операционная система сразу выделяет для него системные ресурсы, поэтому процесс на компьютере считают владельцем ресурсов. Однако тут есть одна тонкость. Запущенный процесс не исполняет код приложения, поэтому он не потребляет время процессора. Код программы выполняют потоки, поэтому именно им операционная система выделяет время процессора. Потоки тоже создаются операционной системой при создании процесса. Любой поток связан с каким-то процессом, а у любого запущенного процесса может быть несколько потоков.
Что такое потоки в операционной системе и процессоре
Мы выяснили, что процесс в операционной системе является неким объектом, которому выделяются системные ресурсы, но самостоятельно он не выполняет код программы. У одного процесса может быть несколько потоков, которые будут выполняться одновременно и параллельно. Важно отметить, что несколько потоков одного процесса будут выполнять отдельные части кода одной программы.
Объясним просто. Когда на компьютере запущено несколько разных приложений, тогда мы можем считать, что запущено несколько разных процессов. Когда мы запускаем одно приложение на компьютере и внутри него выполняем несколько разных действий, то мы можем предполагать, что они выполняются в разных потоках, но в одном процессе. Например, вы запустили текстовый редактор, тогда запись текста, автоматическое сохранение, проверка орфографии и т. д. могут быть разными потоками одного приложения.
Представим на секунду, сколько процессов может быть одновременно запущено на компьютере? Несколько десятков. А сколько потоков могут быть одновременно запущены на компьютере? Несколько сотен. Установленный процессор чисто физически не справился бы со всеми потоками одновременно. Поэтому в операционной системе существует специальный планировщик процессорных потоков. Суть его работы сводится к тому, чтобы выдавать приоритет каждому отдельному потоку и отправлять на выполнение тот, у которого максимальный приоритет.
Например, у вас запущен браузер, мессенджер и текстовый редактор на компьютере. Пока вы ищите информацию в браузере, все его потоки будут задействованы, однако потоки мессенджера и редактора будут «приторможены», потому что вы не пользуетесь этими приложениями в данный момент времени. Вы нашли в браузере информацию и решили записать ее в редактор. В этот момент часть потоков браузера «притормаживается», но активируются потоки редактора, а потоки мессенджера пока «спят». Вы пишите в редакторе, и вам приходит сообщение в мессенджер. Вы открываете мессенджер, чтобы ответить. В этот момент потоки браузера и редактора «притормаживаются», но активизируются потоки мессенджера. Здесь принцип распределения потоков описан очень просто, с упущением многих моментов, однако суть распределения изложена верно. Операционная система активирует тот поток, исполнение которого необходимо пользователю в данный момент времени, и останавливает те потоки, которые пользователю пока не нужны.
Получается, что приоритетность потоков является условным свойством, которое может быть передано любому потоку, если пользователю или устройству необходимо его исполнение.
Что такое потоки в процессоре
Может ли исполняться сразу несколько потоков? Конечно. Современные компьютеры имеют продвинутые процессоры, у которых есть по несколько ядер. Каждое отдельное ядро способно обработать минимум один поток. Но производители ядер научились в состав одного ядра внедрять многопоточность, позволяя одному ядру одновременно выполнять несколько потоков: 4, 6, 8, 12 и т. д. Можно умножить это количество возможностей на количество ядер, и тогда несложно посчитать, сколько потоков одновременно могут выполнять ядра.
Однако и тут есть тонкость. Для того чтобы программа выполнялась в несколько потоков, она изначально должна быть на это запрограммирована. То есть программист при разработке программы должен заложить в ней многопоточное исполнение, чтобы код программы мог исполняться параллельно. Если этого не сделать, программа не сможет работать в несколько потоков. Параллельное программирование сложнее однопоточного, поэтому не все программисты применяют такой подход, убегая от трудностей. Распараллеливание программ приводит к их ускорению и повышению их производительности, поэтому все равно за таким программированием будущее. Другой момент, что применение многоядерных компьютеров для вычисления однопоточных программ — это неэффективное использование мощности устройства.
Так что такое потоки в процессоре? Поток в процессоре — это «канал» исполнения потока процесса. Раньше было так: одно ядро имело один поток, а один поток — это выполнение одной команды. Теперь научились делать ядра многопоточными, а это означает, что одно ядро может одновременно выполнять количество команд по числу потоков. Допустим, в одном ядре 4 потока, значит, ядро может выполнить одновременно 4 команды.
Но не нужно путать ядра и потоки. Допустим, мы имеем два компьютера:
один с 4 ядрами по 2 потока, то есть всего 8 потоков;
второй с 8 ядрами по одному потоку, то есть тоже 8 потоков.
Потоки не равны ядрам, поэтому второй компьютер будет производительней и мощнее. Хотя наличие нескольких потоков в одном ядре тоже улучшает производительность. Разницу между количеством потоков и количеством ядер можно оценить по следующей ситуации. Допустим, у нас есть куча кирпичей. Мы можем переносить ее одно рукой (один поток), а можем переносить двумя руками (двумя потоками). Две руки быстрее, чем одна, но человек-то все равно один, а значит, быстрее устанет. Лучше переносить кирпичи одной рукой, но в два человека, чем двумя руками, но одним человеком.
Заключение
Что такое потоки в процессоре? Это «каналы» для одновременного исполнения команд. Чем больше потоков, тем больше команд может обработать процессор, а значит, многопоточная программа будет работать быстрее.
Что такое процесс в ОС? Простыми словами, процессом в операционной системе является каждое отдельно запущенное приложение. Процессы в ОС не взаимосвязаны, поэтому могут работать по отдельности.
Что такое поток в программировании? Это возможность разрабатываемой программы работать параллельно в несколько «веток» (потоков). Потоки в программировании взаимосвязаны. Потоки одной программы не могут работать отдельно друг от друга.
Потоки, процессы, задачи являются очень интересной и обширной темой. Сегодня мы лишь приоткрыли занавес по этой тематике, чтобы вы имели представление об этих терминах.
Другое