Что такое «нить» (на самом деле)? - PullRequest
203 голосов
/ 05 марта 2011

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

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

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

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

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

From Wikipedia :

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

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

Редактировать: Очевидно, что потоку также предоставляется собственный стек вызовов, так что это нечто вроде вещь .

Ответы [ 12 ]

173 голосов
/ 05 марта 2011

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

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

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

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

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

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

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

131 голосов
/ 05 марта 2011

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

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

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

42 голосов
/ 05 марта 2011

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

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

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

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

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

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

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

A thread - это последовательность таких инструкций в программе, которая может выполняться независимо от другого кода. На рисунке показана концепция: enter image description here

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

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

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

Here, graphically, the concept is rapresented.

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

24 голосов
/ 14 апреля 2016

Я собираюсь использовать много текста из книги «Концепции операционных систем» АБРАХАМА СИЛЬБЕРШАТЦА, ПЕТРА БАЕРА ГАЛВИНА и ГРЕГА ГАГНА вместе с моим собственным пониманием вещей.

Процесс

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

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

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

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

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

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

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

Thread

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

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

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

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

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

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

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

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

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

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

Параллельные вычисления :

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

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

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

(1 + 3) + (4 + 5)

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

5 голосов
/ 05 марта 2011

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

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

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

4 голосов
/ 05 марта 2011

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

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

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

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

3 голосов
/ 05 марта 2011

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

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

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

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

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

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

2 голосов
/ 13 апреля 2016

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

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

0 голосов
/ 10 марта 2018

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

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

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

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

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

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

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

Таким образом, экономя память, а также используя ЦП в полном объеме.

...