Время на прочтение 3 мин
Количество просмотров64K
Системное программирование *
Навеяно предыдущей статьей на эту тему.
Для того чтобы, структурировать свое понимание – что представляют собой threads (это слово переводят на русский язык как «нити» почти везде, кроме книг по Win32 API, где его переводят как «потоки») и чем они отличаются от процессов, можно воспользоваться следующими двумя определениями:
Очень важно понять, что thread – это концептуально именно виртуальный процессор и когда мы пишем реализацию threads в ядре ОС или в user-level библиотеке, то мы решаем именно задачу «размножения» центрального процессора во многих виртуальных экземплярах, которые логически или даже физически (на SMP, SMT и multi-core CPU платформах) работают параллельно друг с другом.
На основном, концептуальном уровне, нет никакого «контекста». Контекст – это просто название той структуры данных, в которую ядро ОС или наша библиотека (реализующая threads) сохраняет регистры виртуального процессора, когда она переключается между ними, эмулируя их параллельную работу. Переключение контекстов – это способ реализации threads, а не более фундаментальное понятие, через которое нужно определять thread.
При подходе к определению понятия thread через анализ API конкретных ОС обычно вводят слишком много сущностей – тут тебе и процессы, и адресные пространства, и контексты, и переключения этих контекстов, и прерывания от таймера, и кванты времени с приоритетами, и даже «ресурсы», привязанные к процессам (в противовес threads). И все это сплетено в один клубок и зачастую мы видим, что идем по кругу, читая определения. Увы, это распространенный способ объяснять суть threads в книгах, но такой подход сильно путает начинающих программистов и привязывает их понимание к конкретике реализации.
Теги:
Хабы:
Всего голосов 53: ↑41 и ↓12 +29
Комментарии 45
sysprg @sysprg
Пользователь
Комментарии Комментарии 45
Twitter LinkedIn Facebook Адрес электронной почты
Многопоточность позволяет увеличивать скорость реагирования приложения и, если приложение работает в многопроцессорной или многоядерной системе, его пропускную способность.
Процесс — это исполнение программы. Операционная система использует процессы для разделения исполняемых приложений. Поток — это основная единица, которой операционная система выделяет время процессора. Каждый поток имеет приоритет планирования и набор структур, в которых система сохраняет контекст потока, когда выполнение потока приостановлено. Контекст потока содержит все сведения, позволяющие потоку безболезненно возобновить выполнение, в том числе набор регистров процессора и стек потока. Несколько потоков могут выполняться в контексте процесса. Все потоки процесса используют общий диапазон виртуальных адресов. Поток может исполнять любую часть программного кода, включая части, выполняемые в данный момент другим потоком.
Примечание
Платформа .NET Framework предоставляет способ изоляции приложений в процессе с помощью доменов приложений. (Домены приложений недоступны в .NET Core.) Дополнительные сведения см. в разделе Домены приложений и потоки в статье Домены приложений.
По умолчанию программа .NET запускается с одним потоком, часто называемым основным потоком. Тем не менее она может создавать дополнительные потоки для выполнения кода параллельно или одновременно с основным потоком. Эти потоки часто называются рабочими потоками.
Используйте несколько потоков, чтобы увеличить скорость реагирования приложения и воспользоваться преимуществами многопроцессорной или многоядерной системы, чтобы увеличить пропускную способность приложения.
Представьте себе классическое приложение, в котором основной поток отвечает за элементы пользовательского интерфейса и реагирует на действия пользователя. Используйте рабочие потоки для выполнения длительных операций, которые, в противном случае будут занимать основной поток, в результате чего пользовательский интерфейс будет недоступен. Для более оперативной реакции на входящие сообщения или события также можно использовать выделенный поток связи с сетью или устройством.
Если программа выполняет операции, которые могут выполняться параллельно, можно уменьшить общее время выполнения путем выполнения этих операций в отдельных потоках и запуска программы в многопроцессорной или многоядерной системе. В такой системе использование многопоточности может увеличить пропускную способность, а также повысить скорость реагирования.
Начиная с .NET Framework 4, для многопоточности рекомендуется использовать библиотеку параллельных задач (TPL) и Parallel LINQ (PLINQ). Дополнительные сведения см. в разделе Параллельное программирование.
Библиотека параллельных задач и PLINQ полагаются на потоки ThreadPool. Класс System.Threading.ThreadPool предоставляет приложения .NET с пулом рабочих потоков. Также можно использовать потоки из пула потоков. Дополнительные сведения см. в разделе Управляемый пул потоков.
Наконец, можно использовать класс System.Threading.Thread, который представляет управляемый поток. Дополнительные сведения см. в разделе Использование потоков и работа с потоками.
Несколько потоков могут требовать доступ к общему ресурсу. Чтобы сохранить ресурс в неповрежденном состоянии и избежать состояния гонки, необходимо синхронизировать доступ к нему потоков. Вы также можете координировать взаимодействие нескольких потоков. Платформа .NET предоставляет ряд типов для синхронизации доступа к общему ресурсу или координации взаимодействия потоков. Дополнительные сведения см. в разделе Обзор примитивов синхронизации.
Исключения следует обрабатывать в потоках. Необработанные исключения в потоках, как правило, приводят к завершению процесса. Дополнительные сведения см. в статье Исключения в управляемых потоках.
Что такое поток?
Внутри программы поток — это отдельный путь выполнения. Это легкий процесс, который операционная система может планировать и запускать одновременно с другими потоками. Операционная система создает потоки и управляет ими, и они совместно используют ту же память и ресурсы, что и создавшая их программа. Это позволяет нескольким потокам сотрудничать и эффективно работать в рамках одной программы.
Почему многопоточность?
Поток также известен как упрощенный процесс. Идея состоит в том, чтобы добиться параллелизма путем разделения процесса на несколько потоков. Например, в браузере несколько вкладок могут быть разными потоками. MS Word использует несколько потоков: один поток для форматирования текста, другой поток для обработки входных данных и т. д. Другие преимущества многопоточности обсуждаются ниже.
Процесс против потока:
Основное различие заключается в том, что потоки внутри одного и того же процесса выполняются в общей области памяти, а процессы выполняются в отдельных областях памяти. Потоки не независимы друг от друга, как процессы, и в результате потоки разделяют с другими потоками свой раздел кода, раздел данных и ресурсы ОС (например, открытые файлы и сигналы). Но, как и процесс, поток имеет свой собственный программный счетчик (ПК), набор регистров и пространство стека.
Преимущества потока перед процессом
Типы потоков
Существует два типа потоков:
См. Поток пользователя и поток ядра для получения более подробной информации.
Ниже приведены вопросы по гейтам прошлых лет в темах:
Ссылка: Многопоточность в C
Пожалуйста, пишите комментарии, если вы обнаружите что-то не так, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.
следующий → ← предыдущая Поток — это единый последовательный поток выполнения задач процесса, поэтому он также известен как поток выполнения или поток управления. Существует способ выполнения потока внутри процесса любой операционной системы. Кроме того, внутри процесса может быть более одного потока. Каждый поток одного и того же процесса использует отдельный счетчик программ и стек записей активации и управляющих блоков. Поток часто называют облегченным процессом. Процесс может быть разбит на очень много потоков. Например, , в браузере многие вкладки можно рассматривать как потоки. MS Word использует много потоков — форматирование текста из одного потока, обработка ввода из другого потока и т. д. Нужна нить:
Типы резьбВ операционной системе существует два типа потоков.
Поток уровня пользователяОперационная система не распознает поток пользовательского уровня. Пользовательские потоки могут быть легко реализованы и реализованы пользователем. Если пользователь выполняет операцию блокировки потока на уровне пользователя, блокируется весь процесс. Поток уровня ядра ничего не знает о потоке пользовательского уровня. Поток уровня ядра управляет потоками пользовательского уровня, как если бы они были однопоточными процессами. Примеры: поток Java, потоки POSIX и т. д. Преимущества потоков пользовательского уровня
Недостатки потоков пользовательского уровня
Поток уровня ядраПоток ядра распознает операционную систему. В системе есть блок управления потоком и блок управления процессом для каждого потока и процесса в потоке уровня ядра. Поток уровня ядра реализуется операционной системой. Ядро знает обо всех потоках и управляет ими. Поток уровня ядра предлагает системный вызов для создания и управления потоками из пользовательского пространства. Реализация потоков ядра сложнее, чем пользовательских. Время переключения контекста больше в потоке ядра. Если поток ядра выполняет операцию блокировки, выполнение потока Banky может продолжаться. Пример: Окно Солярис. Преимущества потоков уровня ядра
Недостатки потоков уровня ядра
Компоненты резьбыЛюбой поток имеет следующие компоненты.
Преимущества резьбы
|