8-900-374-94-44
[email protected]
Slide Image
Меню

Операционная система thread: Что такое нити (threads)? / Хабр

Что такое нити (threads)? / Хабр

sysprg

Время на прочтение 3 мин

Количество просмотров

64K

Системное программирование *

Навеяно предыдущей статьей на эту тему.
Для того чтобы, структурировать свое понимание – что представляют собой threads (это слово переводят на русский язык как «нити» почти везде, кроме книг по Win32 API, где его переводят как «потоки») и чем они отличаются от процессов, можно воспользоваться следующими двумя определениями:

  • Thread – это виртуальный процессор, имеющий свой собственный набор регистров, аналогичных регистрам настоящего центрального процессора. Один из наиважнейших регистров у виртуального процессора, как и у реального – это индивидуальный указатель на текущую инструкцию (например, индивидуальный регистр EIP на процессорах семейства x86),
  • Процесс – это в первую очередь адресное пространство. В современной архитектуре создаваемое ядром ОС посредством манипуляции страничными таблицами. И уже во вторую очередь на процесс следует смотреть как на точку привязки «ресурсов» в ОC. Если мы разбираем такой аспект, как многозадачность для того, чтобы понять суть threads, то нам не нужно в этот момент думать о «ресурсах» ОС типа файлов и к чему они привязаны.

Очень важно понять, что thread – это концептуально именно виртуальный процессор и когда мы пишем реализацию threads в ядре ОС или в user-level библиотеке, то мы решаем именно задачу «размножения» центрального процессора во многих виртуальных экземплярах, которые логически или даже физически (на SMP, SMT и multi-core CPU платформах) работают параллельно друг с другом.
На основном, концептуальном уровне, нет никакого «контекста». Контекст – это просто название той структуры данных, в которую ядро ОС или наша библиотека (реализующая threads) сохраняет регистры

виртуального процессора, когда она переключается между ними, эмулируя их параллельную работу. Переключение контекстов – это способ реализации threads, а не более фундаментальное понятие, через которое нужно определять thread.
При подходе к определению понятия thread через анализ API конкретных ОС обычно вводят слишком много сущностей – тут тебе и процессы, и адресные пространства, и контексты, и переключения этих контекстов, и прерывания от таймера, и кванты времени с приоритетами, и даже «ресурсы», привязанные к процессам (в противовес threads). И все это сплетено в один клубок и зачастую мы видим, что идем по кругу, читая определения. Увы, это распространенный способ объяснять суть threads в книгах, но такой подход сильно путает начинающих программистов и привязывает их понимание к конкретике реализации.
Понятное дело, что все эти термины имеют право на существование и возникли не случайно, за каждым из них стоит какая-то важная сущность. Но среди них нужно выделить главные и второстепенные (введенные для реализации главных сущностей или навешанные на них сверху, уже на следующих уровнях абстракции).
Главная идея thread – это виртуализация регистров центрального процессора – эмуляция на одном физическом процессоре нескольких логических процессоров, каждый из которых имеет свое собственное состояние регистров (включая указатель команд) и работает параллельно с остальными.
Главное свойство процесса в контексте этого разговора – наличие у него своих собственных страничных таблиц, образующих его индивидуальное
адресное пространство
. Процесс не является сам по себе чем-то исполнимым.
Можно говорить в определении, что «у каждого процесса в системе всегда есть по крайней мере один thread». А можно сказать иначе –адресное пространство логически лишено смысла для пользователя, если оно не видно хотя бы одному виртуальному процессору (thread). Поэтому логично, что все современные ОС уничтожают адресное пространство (завершают процесс) при завершении работы последнего thread, работающего на данном адресном пространстве. И можно не говорить в определении процесса, что в нем есть «по крайней мере, один thread». Тем более, что на нижнем системном уровне процесс (как правило) может существовать как объект ОС даже не имея в своем составе threads.
Если Вы посмотрите исходники, например, ядра Windows, то Вы увидите, что адресное пространство и прочие структуры процесса конструируются до создания в нем начальной нити (начальной thread для этого процесса). По сути, изначально в процессе не существует threads вообще. В Windows можно даже создать thread в чужом адресном пространстве через user-level API…
Если смотреть на thread как на виртуальный процессор – то его привязка к адресному пространству представляет собой загрузку в виртуальный регистр базы станичных таблиц нужного значения. 🙂 Тем более, что на нижнем уровне именно это и происходит – каждый раз при переключении на thread, связанную с другим процессом, ядро ОС перезагружает регистр указателя на страничные таблицы (на тех процессорах, которые не поддерживают на аппаратном уровне работу со многими пространствами одновременно).

Теги:

  • threads
  • processes
  • процессы
  • нити
  • потоки

Хабы:

  • Системное программирование

Всего голосов 53: ↑41 и ↓12 +29

Комментарии 45

sysprg @sysprg

Пользователь

Комментарии Комментарии 45

Потоки и работа с ними

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

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

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

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

Примечание

Платформа .NET Framework предоставляет способ изоляции приложений в процессе с помощью доменов приложений. (Домены приложений недоступны в .NET Core.) Дополнительные сведения см. в разделе Домены приложений и потоки в статье Домены приложений.

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

Цели применения нескольких потоков

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

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

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

Как использовать многопоточность в .NET

Начиная с .NET Framework 4, для многопоточности рекомендуется использовать библиотеку параллельных задач (TPL) и Parallel LINQ (PLINQ). Дополнительные сведения см. в разделе Параллельное программирование.

Библиотека параллельных задач и PLINQ полагаются на потоки ThreadPool. Класс System.Threading.ThreadPool предоставляет приложения .NET с пулом рабочих потоков. Также можно использовать потоки из пула потоков. Дополнительные сведения см. в разделе Управляемый пул потоков.

Наконец, можно использовать класс System.Threading.Thread, который представляет управляемый поток. Дополнительные сведения см. в разделе Использование потоков и работа с потоками.

Несколько потоков могут требовать доступ к общему ресурсу. Чтобы сохранить ресурс в неповрежденном состоянии и избежать состояния гонки, необходимо синхронизировать доступ к нему потоков. Вы также можете координировать взаимодействие нескольких потоков. Платформа .NET предоставляет ряд типов для синхронизации доступа к общему ресурсу или координации взаимодействия потоков. Дополнительные сведения см. в разделе Обзор примитивов синхронизации.

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

См. также

  • Объекты и функциональные возможности работы с потоками
  • Рекомендации по работе с потоками
  • Процессы и потоки
  • Параллельная обработка в .NET
  • Асинхронные шаблоны программирования в .NET

Поток в операционной системе — GeeksforGeeks

 

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

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

Почему многопоточность?  

Поток также известен как упрощенный процесс. Идея состоит в том, чтобы добиться параллелизма путем разделения процесса на несколько потоков. Например, в браузере несколько вкладок могут быть разными потоками. MS Word использует несколько потоков: один поток для форматирования текста, другой поток для обработки входных данных и т. д. Другие преимущества многопоточности обсуждаются ниже.

Процесс против потока:

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

Преимущества потока перед процессом  

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

Типы потоков  

Существует два типа потоков:

  • Поток уровня пользователя 
  • Поток уровня ядра

См. Поток пользователя и поток ядра для получения более подробной информации.

Ниже приведены вопросы по гейтам прошлых лет в темах:

  • https://www.geeksforgeeks.org/gate-gate-cs-2011-question-16/
  • https://www.geeksforgeeks.org/gate -gate-cs-2007-question-17/ 
  • https://www.geeksforgeeks.org/gate-gate-cs-2014-set-1-question-30/ 

Ссылка: Многопоточность в C 

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

Потоки в операционной системе (ОС)

следующий → ← предыдущая

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

Процесс может быть разбит на очень много потоков. Например, , в браузере многие вкладки можно рассматривать как потоки. MS Word использует много потоков — форматирование текста из одного потока, обработка ввода из другого потока и т. д.

Нужна нить:

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

Типы резьб

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

  1. Поток уровня ядра.
  2. Поток уровня пользователя.

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

Операционная система не распознает поток пользовательского уровня. Пользовательские потоки могут быть легко реализованы и реализованы пользователем. Если пользователь выполняет операцию блокировки потока на уровне пользователя, блокируется весь процесс. Поток уровня ядра ничего не знает о потоке пользовательского уровня. Поток уровня ядра управляет потоками пользовательского уровня, как если бы они были однопоточными процессами. Примеры: поток Java, потоки POSIX и т. д.

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

  1. Пользовательские потоки могут быть реализованы проще, чем поток ядра.
  2. Потоки уровня пользователя могут применяться к таким типам операционных систем, которые не поддерживают потоки на уровне ядра.
  3. Это быстрее и эффективнее.
  4. Время переключения контекста меньше, чем у потоков уровня ядра.
  5. Не требует модификаций операционной системы.
  6. Представление потоков на уровне пользователя очень простое. Блоки управления регистром, ПК, стеком и мини-потоками хранятся в адресном пространстве процесса пользовательского уровня.
  7. Легко создавать, переключать и синхронизировать потоки без вмешательства процесса.

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

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

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

Поток ядра распознает операционную систему. В системе есть блок управления потоком и блок управления процессом для каждого потока и процесса в потоке уровня ядра. Поток уровня ядра реализуется операционной системой. Ядро знает обо всех потоках и управляет ими. Поток уровня ядра предлагает системный вызов для создания и управления потоками из пользовательского пространства. Реализация потоков ядра сложнее, чем пользовательских. Время переключения контекста больше в потоке ядра. Если поток ядра выполняет операцию блокировки, выполнение потока Banky может продолжаться. Пример: Окно Солярис.

Преимущества потоков уровня ядра

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

Недостатки потоков уровня ядра

  1. Поток ядра управляет всеми потоками и планирует их выполнение.
  2. Реализация потоков ядра сложнее, чем пользовательский поток.
  3. Поток уровня ядра медленнее, чем поток уровня пользователя.

Компоненты резьбы

Любой поток имеет следующие компоненты.

  1. Счетчик программ
  2. Набор регистров
  3. Место для стека

Преимущества резьбы

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *