Что такое «нить» (на самом деле)?


238

Я пытался найти хорошее определение и понять, что такое поток .

Кажется, что я, должно быть, упускаю что-то очевидное, но каждый раз, когда я читаю о том, что такое поток, это почти круговое определение, а именно «поток - это поток выполнения» или «способ делиться на выполняемые задачи». Э-э-э А?

Из того, что я прочитал, кажется, что поток не является чем-то конкретным, как процесс. На самом деле это просто концепция. Из того, что я понимаю пути это работает, процессор выполняет некоторые команды для программы (которая была названа в поток исполнения ), а затем , когда он должен переключиться на обработку для какой - либо другой программы для немного, он сохраняет состояние в программа, которую она в данный момент выполняет для чего-то (Thread Local Storage), а затем начинает выполнять инструкции другой программы. И туда и обратно. Таким образом, поток на самом деле является просто концепцией «одного из путей выполнения» программы, которая в данный момент выполняется.

В отличие от процесса, который действительно является чем-то - это скопление ресурсов и т. Д.

Как пример определения, которое не очень мне помогло. , ,

Из Википедии :

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

Так я прав? Неправильно? Что это за нить на самом деле?

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


6
«Процесс» - не менее абстрактный термин.
Хоббс

Является ли локальное хранилище потока просто стеком вызовов для потока?
совершиландройдер


3
Ответы ниже являются ... абстрактными. Проще говоря (и скрывая некоторые детали): однажды компьютерная программа могла сделать только одну вещь одновременно. Так и сделал А, потом после этого Б, потом С, потом ... В современных системах это не идеально; например, вы хотите продолжать просматривать веб-страницы во время загрузки файла. Таким образом, программы теперь имеют один или несколько «потоков». Каждый «поток» может делать только одну вещь одновременно, но разные потоки могут делать вещи одновременно . Поток 1 может сделать A, затем B, затем C; поток 2 может выполнить X, затем Y, затем Z. B не может начаться, пока не закончится A, но A и X могут произойти одновременно.
Мохан

@ Мохан, это здорово, но чем это отличается от процесса?
Эрик

Ответы:


154

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

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

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


10
+1. Поток не является чем-то более «конкретным», чем набор значений регистра.
Грег Хьюгилл

6
Какой «набор ценностей»? Кто они такие? Как они определяют поток ?
Ричард

20
@Richard: точный список регистров процессора зависит от архитектуры, но указатель инструкций и указатель стека в значительной степени универсальны. Они определяют поток, поскольку когда этот поток (набор значений регистров) загружается в ядро ​​процессора, поток работает . Процессор выбирает инструкции, требуемые потоком, и обновляет регистры потока. Когда требуется переключение контекста, процессор сохраняет этот набор значений регистров в память и загружает набор, принадлежащий другому потоку, как правило, как часть логики обслуживания прерываний.
Бен Фойгт

4
Спасибо Бен. Это очень полезно.
Ричард

2
Привет, спасибо @BenVoigt. Несколько уточнений о том, что такие нубы, как я, могут наткнуться: что означает «регистры процессора»? Что подразумевается под «указателем инструкций» и «указателем стека»?
BKSpurgeon

216

Поток - это контекст выполнения, представляющий собой всю информацию, необходимую ЦП для выполнения потока инструкций.

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

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

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

На техническом уровне контекст выполнения (следовательно, поток) состоит из значений регистров ЦП.

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

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


20
Лучшая аналогия - приравнять человека к процессору (оба что- то делают ) и приравнять книгу к адресному пространству (оба просто существуют). Таким образом, закладки в разных книгах похожи на потоки в разных процессах. Одна книга с несколькими закладками будет аналогом многопоточного процесса, который обычно имеют в виду, когда говорят «темы». Он работает на однопроцессорной машине, но несколько ломается, когда вы говорите о многопроцессорной обработке. Никого не волнует, какой процессор выполняет функцию f (), но имеет значение, кто из них читает главу 11.
Соломон Слоу

@pwnall, большое спасибо за усвоение сложных понятий для таких, как я! Включает ли многопоточность многопроцессорность (или параллельное выполнение процесса на многих процессорах, если я использую неправильный термин)?
aerijman

51

Чтобы определить поток формально, мы должны сначала понять границы того, где работает поток.

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

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

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

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

Явная поддержка операционной системы требуется для запуска многопоточных программ. К счастью, большинство современных операционных систем поддерживают потоки, такие как Linux (через NPTL), варианты BSD, Mac OS X, Windows, Solaris, AIX, HP-UX и т. Д. Операционные системы могут использовать различные механизмы для реализации поддержки многопоточности.

Здесь графически представлена ​​концепция.

Здесь вы можете найти больше информации по теме. Это был также мой источник информации.

Позвольте мне добавить предложение из « Введения в встроенную систему » Эдварда Ли и Сешии :

Потоки являются обязательными программами, которые запускаются одновременно и совместно используют пространство памяти. Они могут получить доступ к переменным друг друга. Многие специалисты в этой области используют термин «потоки» более узко для обозначения конкретных способов конструирования программ, которые совместно используют память, [других], чтобы широко ссылаться на любой механизм, когда императивные программы работают одновременно и совместно используют память. В этом широком смысле потоки существуют в виде прерываний почти на всех микропроцессорах, даже без какой-либо операционной системы (голое железо).


45

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

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

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

Я думаю, что ключевые вещи, чтобы понять это:

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

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

@committedandroider: Хороший звонок. Я отредактировал свой ответ, сказав, что процессы не разделяют память (по умолчанию), но потоки разделяют всю память.
Джои Адамс

36

Я собираюсь использовать много текста из книги «Концепции операционных систем» Абрахама Силберша, Питера Баера Галвина и Грега Гагна, а также мое собственное понимание вещей.

Обработать

Любое приложение находится на компьютере в виде текста (или кода).

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

Когда мы запускаем приложение, мы создаем экземпляр выполнения. Этот экземпляр выполнения называется процессом. РЕДАКТИРОВАТЬ: (Согласно моей интерпретации, аналог класса и экземпляра класса, экземпляр класса является процессом.)

Примером процессов является Google Chrome. Когда мы запускаем Google Chrome, появляются 3 процесса:

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

Renderer процессы содержат логику для рендеринга веб - страниц. Таким образом, они содержат логику для обработки HTML, Javascript, изображений и так далее. Как правило, для каждого веб-сайта, открываемого на новой вкладке, создается новый процесс визуализации, поэтому одновременно могут быть активны несколько процессов визуализации.

• Процесс плагина создается для каждого используемого типа плагина (например, Flash или QuickTime). Процессы плагина содержат код для плагина, а также дополнительный код, который позволяет плагину взаимодействовать со связанными процессами визуализации и процессом браузера.

Нить

Чтобы ответить на этот вопрос, я думаю, вы должны сначала знать, что такое процессор. Процессор - это аппаратная часть, которая фактически выполняет вычисления. РЕДАКТИРОВАТЬ: (Вычисления, такие как добавление двух чисел, сортировка массива, в основном выполнение кода, который был написан)

Теперь перейдем к определению потока.

Поток - это базовая единица загрузки процессора ; он содержит идентификатор потока, счетчик программ, набор регистров и стек.

РЕДАКТИРОВАТЬ: определение потока с веб-сайта Intel:

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

Таким образом, если процесс Renderer из приложения Chrome сортирует массив чисел, сортировка будет выполняться в потоке / потоке выполнения. (Грамматика, относящаяся к темам, меня смущает)

Моя интерпретация вещей

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

РЕДАКТИРОВАТЬ: Другая информация, которую я нашел полезным, чтобы дать больше контекста

Все современные дневные компьютеры имеют более одного потока. Количество потоков в компьютере зависит от количества ядер в компьютере.

Параллельное Computing :

Из Википедии:

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

Итак, я мог бы написать программу, которая рассчитывает сумму из 4 чисел:

(1 + 3) + (4 + 5)

В программе для вычисления этой суммы (это будет один процесс, выполняющийся в потоке выполнения), я могу разветвить другой процесс, который может выполняться в другом потоке, для вычисления (4 + 5) и вернуть результат в исходный процесс, в то время как Исходный процесс вычисляет сумму (1 + 3).


5
это реальный ответ сделки
Suhail Mumtaz

1
Очень помогло. Вот как выглядит объяснение.
Динеш Кумар

Большое значение этого ответа, что он предоставляет справочник, где вы можете найти более подробную информацию, если это необходимо. Спасибо @chatuur!
деша

7

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

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf


1
Что делает это «чем-то осязаемым»? Это просто те данные, которые хранятся в TLS и его стеке вызовов?
Ричард

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

Просветите меня . , , так каков ответ?
Ричард

@Richard, не желающий вступать в дискуссию о семантике, просто сформулировал мой ответ, чтобы попытаться прояснить концептуально OP.
Орбита

@ Ричард, что такое TLS?
совершиландройдер

6

Поток - это не что иное, как контекст памяти (или, как лучше выразился Таненбаум, группировка ресурсов) с правилами выполнения. Это программная конструкция. Процессор понятия не имеет, что такое поток (за некоторыми исключениями, у некоторых процессоров есть аппаратные потоки), он просто выполняет инструкции.

Ядро вводит концепцию потоков и процессов для управления памятью и порядком инструкций осмысленным образом.


5

Это было взято из Yahoo Ответ:

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

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

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

Говорят, что процессоры Intel имеют «гиперпоточность» (она есть и у AMD), и предполагается, что она способна выполнять несколько «потоков» или многозадачность намного лучше.

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


Как процессоры Intel лучше обрабатывают несколько потоков? С одним ядром одновременно должен выполняться только один поток. Я согласен с процессором, идущим туда-сюда. Вы не можете сделать это лучше, не так ли?
совершиландройдер

Это оптимизация, которая дает лучшую производительность для некоторых случаев использования. Вы можете прочитать о гиперпоточности здесь: en.wikipedia.org/wiki/Hyper-threading
Джереми Фризнер

5

Ответ варьируется в очень разных системах и различных реализаций, но наиболее важные части:

  1. Поток имеет независимый поток выполнения (т. Е. Вы можете переключиться с него на контекст, а затем обратно, и он возобновит работу там, где он был).
  2. Поток имеет время жизни (он может быть создан другим потоком, и другой поток может ожидать его завершения).
  3. К нему, вероятно, прикреплено меньше багажа, чем к «процессу».

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

В нескольких современных системах Unix, включая Linux, с которым я больше всего знаком, все потоки - процесс - это просто тип потока, который относительно мало разделяет свой родительский объект (т.е. он получает свои собственные отображения памяти, свою собственную таблицу файлов). и разрешения, и т. д.) Чтение man 2 clone, особенно список флагов, здесь действительно поучительно.


Переключение контекста происходит только тогда, когда процессор переходит из одного потока в другой (в том же процессе или в другом)?
совершиландройдер

-1

Я не очень доволен ни одним из этих ответов, поэтому я собираюсь добавить свой собственный здесь :) Поток - это абстракция ядра для планирования работы над процессором, поток - это то, что ядро ​​дает вам для управления временем процессора и делиться работой с другими


1
-1 Потоки не должны быть созданы ядром. Потоки с поддержкой уровня ядра действительно планируются ядром (где выдается какой-то системный вызов). Но есть также потоки с поддержкой на уровне пользовательских библиотек, причем таблица потоков находится в пользовательском пространстве.
АлександрH

-1

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

Процесс может иметь количество потоков {1..N}. Небольшое объяснение виртуальной памяти и виртуального процессора.

Виртуальная память

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

Виртуальный процессор

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

ОС позаботится о выделении виртуальной памяти и виртуального процессора для процесса и выполнении обмена между процессами и выполнением.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.