ru:https://highload.today/blogs/mnogopotochnost-v-java-protsessi-i-potoki/ ua:https://highload.today/uk/blogs/mnogopotochnost-v-java-protsessi-i-potoki/
logo
Основы      06/12/2021

Многопоточность в Java: разбираемся с работой процессора, процессами и потоками

Владимир Фролов BLOG

Java Developer в DataArt

Темную силу чувствую я.

Даешь парсек за три года.

Привет! Меня зовут Владимир Фролов, я — Java Developer в DataArt. Этим материалом я хочу начать цикл публикаций на Highload о многопоточности в Java.

Нет, мы не будем рассматривать историю механических вычислительных машин для арифметических вычислений, созданных в XIX веке и раньше.

Начнем с XX века, когда появились компьютеры в привычном нам понимании. На заре компьютерной эры аналоговые и ламповые машины были большими, малопроизводительными и потребляли много электрической энергии. После открытия полупроводниковых материалов размеры ЭВМ уменьшились, а производительность и энергоэффективность существенно возросли. Затем начали появляться первые микросборки и микросхемы, а в 1965 году был сформулирован закон Мура, который гласил, что количество транзисторов на одном кристалле будет удваиваться каждые 24 месяца.

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

Иллюстрация: DataArt

Со временем пользователи захотели выполнять несколько программ одновременно / Иллюстрация: DataArt

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

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

Краткое описание работы процессора

Рассмотрим на простейшем уровне, как работает процессор. Он состоит из:

  • АЛУ (арифметико-логического устройства) — главного элемента;
  • Онлайн курс з промт інжинірингу та ефективної роботи з ШІ від Powercode academy.
    Курс-інтенсив для отримання навичок роботи з ChatGPT та іншими інструментами ШІ для професійних та особистих задач, котрі допоможуть як новачку, так і професіоналу.
    Записатися на курс
  • регистров;
  • шин данных;
  • адреса;
  • дешифратора команд. 

Изначально АЛУ могло выполнять всего несколько элементарных операций: чтение и запись в память, сложение, сдвиг вправо, сдвиг влево, логические AND, OR, NOT, XOR.

Вычитать АЛУ не умело. Вычитание осуществлялось путем сложения в дополнительном коде, умножение — путем сложения и сдвига влево, деление осуществлялось сдвигом вправо и вычитанием.

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

Поддержка на уровне операционной системы

Операционные системы могут решать задачу распределения процессорного времени разными способами. Основные подходы:

  1. Простое переключение задач. Когда процессы одновременно загружены в память системы и по таймеру происходит переключение между процессами. У процессов нет никаких приоритетов. Преимущества этой системы в том, что в ней могут работать программы, которые предназначены для работы в однопоточной среде.
  2. Онлайн-курс "Комерційний Аудіопродакшн" від Skvot.
    Навчіться створювати, зводити й мастерити музику для комерційних проєктів — кіно, серіалів, улюблених ігр чи вірусних рекламних роликів.
    Детальніше про курс та довід лектора
  3. Кооперативная многозадачность. Когда следующая задача выполняется, после того как предыдущая явно укажет, что она может отдать процессорное время другой задаче. При кооперативной многозадачности приложение может захватить фактически столько процессорного времени, сколько оно считает нужным. Все приложения делят процессорное время, периодически передавая управление следующей задаче. 
  4. Вытесняющая многозадачность. Когда операционная система сама передает управление от одной выполняемой программы другой в случае завершения операций ввода-вывода, возникновения аппаратных прерываний или же при поступлении тех или иных сигналов от одной программы к другой. В этом виде многозадачности процессор может переключиться с выполнения одной программы на другую без пожелания первой программы, буквально между любыми двумя инструкциями в ее коде. Распределение процессорного времени осуществляется планировщиком процессов. К тому же, каждой задаче может быть назначен пользователем или самой операционной системой определенный приоритет. Этот вид многозадачности обеспечивает более быстрый отклик на действия пользователя.

Процессы и потоки

Введем понятия процесса и потока.

Процесс — это программа, которая выполняется в текущий момент времени, как и все ее элементы: адресное пространство, глобальные переменные, регистры, потоки, открытые файлы и т. д. 

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

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

Потоки выполнения отличаются от процессов:

  • процессы, как правило, независимы, тогда как потоки выполнения существуют как составные элементы процессов;
  • процессы несут значительно больше информации о программе, тогда как несколько потоков выполнения совместно используют эту информацию внутри процесса;
  • Бізнес англійська від Englishdom.
    Тут навчають за методикою Кембриджу, завдяки якій англійську вивчили понад 1 мільярд людей. Саме вона використовується в найкращих навчальних закладах світу, і саме за нею створені курси.
    Інформація про курс
  • процессы имеют отдельные адресные пространства, тогда как потоки выполнения совместно используют память процесса;
  • переключение между потоками выполнения в одном процессе, как правило, быстрее, чем переключение между процессами.

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

Вот оно что!

Вот оно что!

Заключение

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

В следующих статьях разберемся с потоками и их свойствами, блокировками и классами синхронизации потоков, атомарными переменными — читайте скоро на Highload.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Практичний інтенсивний курс з дизайну - Design Booster від Powercode academy.
Навчіться дизайну з нуля за 3 місяці і заробляйте перші $1000, навіть якщо ви не маєте креативного мислення, смаку або вміння малювати. Отримайте практичні навички, необхідні для успішної кар'єри в дизайні.
Зарееструватися

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров марта

PHP Developer в ScrumLaunch
Всего просмотровВсего просмотров
2434
#1
Всего просмотровВсего просмотров
2434
Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсего просмотров
113
#2
Всего просмотровВсего просмотров
113
Career Consultant в GoIT
Всего просмотровВсего просмотров
95
#3
Всего просмотровВсего просмотров
95
CEO & Founder в Trustee
Всего просмотровВсего просмотров
94
#4
Всего просмотровВсего просмотров
94
Рейтинг блогеров

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: