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

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

Что такое поток?

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

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

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

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

Разница между процессом и потоком

Преимущества нити

  • Потоки минимизируют время переключения контекста.
  • Использование потоков обеспечивает параллелизм внутри процесса.
  • Эффективное общение.
  • Более экономично создавать потоки и переключать контекст.
  • Потоки позволяют использовать многопроцессорные архитектуры в большем масштабе и с большей эффективностью.

Типы тем

Потоки реализуются двумя способами:

  • Потоки пользовательского уровня — потоки, управляемые пользователем.
  • Потоки уровня ядра — потоки, управляемые операционной системой, действующие на ядро, ядро ​​операционной системы.

Потоки пользовательского уровня

В этом случае ядро ​​управления потоками не знает о существовании потоков. Библиотека потоков содержит код для создания и уничтожения потоков, для передачи сообщений и данных между потоками, для планирования выполнения потоков, а также для сохранения и восстановления контекстов потоков. Приложение запускается с одного потока.

Преимущества

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

Недостатки

  • В типичной операционной системе большинство системных вызовов блокируются.
  • Многопоточное приложение не может использовать преимущества многопроцессорности.

Потоки уровня ядра

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

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

Преимущества

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

Недостатки

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

Что такое библиотеки потоков?

Библиотеки потоков предоставляют программистам API для создания потоков и управления ими.

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

Три типа нити

  1. POSIX Pitheads может предоставляться либо как пользовательская библиотека, либо как библиотека ядра, как расширение стандарта POSIX.
  2. Потоки Win32 предоставляются в виде библиотеки уровня ядра в системах Windows.
  3. Потоки Java. Поскольку Java обычно работает на виртуальной машине Java, реализация потоков зависит от операционной системы и аппаратного обеспечения, на которых работает JVM, т. е. потоков Pithead или Win32 в зависимости от системы.

Многопоточные модели

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

Многопоточность — это метод, который позволяет программе или процессу выполнять множество задач одновременно. одновременно и параллельно. Это позволяет процессу выполнять свои задачи в параллельном режиме на однопроцессорной системе.

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

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

Библиотеки потоков предоставляют программистам API для создания и управления потоками, такими как потоки Java.

  • Например, в текстовом процессоре один поток может проверять орфографические ошибки, в то время как другой поток одновременно сохраняет или обрабатывает входные данные.
  • Другим хорошим примером является веб-сервер, где несколько потоков работают с несколькими запросами, отправленными клиентами.
  • Многие фреймворки с графическим интерфейсом являются многопоточными.
  • массовое обновление файлов данных (например, добавление значения/записи к 10 000 записей)

Конкретные примеры:

  • Майкрософт Ворд
  • Майкрософт Эксель
  • Веб-браузер

Суть в том, что многопоточность встречается везде и в каждом приложении.

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

  • Связь многие ко многим.
  • Связь многие к одному.
  • Отношения один к одному.

Модель «многие ко многим»

Модель «многие ко многим» мультиплексирует любое количество пользовательских потоков в равное или меньшее количество потоков ядра.

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

Модель «многие к одному»

Модель «многие к одному» сопоставляет множество потоков пользовательского уровня с одним потоком уровня ядра. Управление потоками выполняется в пользовательском пространстве библиотекой потоков. Когда поток делает блокирующий системный вызов, весь процесс будет заблокирован. Одновременно к ядру может обращаться только один поток, поэтому несколько потоков не могут работать параллельно на многопроцессорных системах.

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

Модель один к одному

Существует взаимно-однозначное отношение потока пользовательского уровня к потоку уровня ядра. Эта модель обеспечивает больше параллелизма, чем модель «многие к одному». Это также позволяет запускать другой поток, когда поток выполняет блокирующий системный вызов. Он поддерживает несколько потоков для параллельного выполнения на микропроцессорах.

Недостатком этой модели является то, что для создания пользовательского потока требуется соответствующий поток ядра. OS/2, Windows NT и Windows 2000 используют модель отношений один к одному.

Разница между потоком уровня пользователя и уровня ядра

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

  1. Ответная реакция
  2. Совместное использование ресурсов, что позволяет лучше использовать ресурсы.
  3. Эконом. Создание потоков и управление ими становится проще.
  4. Масштабируемость. Один поток работает на одном процессоре. В многопоточных процессах потоки могут быть распределены по ряду процессоров для масштабирования.
  5. Переключение контекста плавное. Переключение контекста относится к процедуре, которой следует ЦП для перехода от одной задачи к другой.

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

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

Отмена темы

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

Обработка сигналов

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

Системный вызов fork()

fork() — это системный вызов, выполняемый в ядре, посредством которого процесс создает свою копию. Теперь проблема в многопоточном процессе заключается в том, что если один поток разветвляется, будет ли скопирован весь процесс или нет?

Проблемы с безопасностью

Да, могут быть проблемы с безопасностью из-за обширного совместного использования ресурсов между несколькими потоками.

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

ЗАДАНИЕ 02

Примеры некоторых многопоточных программ на Java

Многопоточная программа 1

public class DadiAP {
public static void main (String [] args) {
Mobil m1 = new Mobil («M-1»);
Mobil m2 = новый Mobil («М-2»);
m2.setPriority(8); // digunakan untuk mengatur Prioritas m2 agar lebih tinggi daripada m1, biar gak lupa pake comment ini
m1.start();
m2.start();
}
}
class Mobil extends Thread {
// конструктор
public Mobil (String id) {
super (id);
}
// Ограничение отправки run()
public void run() {
String nama = getName();
for (int i=0; i‹5; i++) {
System.out.println("Thread" + nama + ":Posisi" + i );
}
}
}

Выходная программа:

Многопоточная программа 2

class belThreading extends Thread
{
public void cobaThread212()
{
try
{
for (int i = 0; i ‹ 10; i++)
{
System.out.println("Thread 212 " + i);
Thread.sleep(1000);
}
}
catch( Исключение e)
{
}
}
public void cobaThread213()
{
try
{
for (int i = 0; i ‹ 10; i++)
{
System.out.println("Thread 213 " + i);
Thread.sleep(1000);
}
}
catch(Exception e)
{
}
}
}
public class Main {

public static void main(String[] args) {
System.out.println("Многопоточность");

belThreading tid1 = new belThreading();

tid1. cobaThread212();
tid1.cobaThread213();

System.out.println("Конец");
}
}

Выходная программа:

Многопоточная программа 3

class dida extends Thread
{
public int name,i;
public void run()
{
for(i=1;i‹=20;i++)
{
System.out.println(" Thread " + name + " : " + i);
try
{
sleep(2000); /** untuk membuat delay 2 detik sesuai perintah tugas pak Ferry */
}
catch(Exception e)
{
System.out.println(“some Problem”);
}
}
}
}
открытый класс дади
{
public static void main(String[] args)
{
dida a=new dida();
dida b=new dida();
a.name=111;
b.name=112;
a .start();
b.start();
}
}

Выходная программа:

Задание 03

Что мы сделали?

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