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

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

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

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

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

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

с Википедия:

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

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

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

12 ответов


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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

компьютерная программа становится


Я собираюсь использовать много текста из книги "концепции операционных систем" Абрахама ЗИЛЬБЕРШАЦА, Питера Бера ГЭЛВИНА и Грега Ганя вместе с моим собственным пониманием вещей.


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

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

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


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

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

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

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


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

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

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

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

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

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


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

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


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


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

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

виртуальный

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

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

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

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

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

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


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

" вы знаете, как, когда вы запускаете программу java, она запускает программу сверху вниз? Ну, нить-это в основном способ обойти это. Например, открыть сразу два текстовых поля или запустить таймер одновременно с кучей других вещей."

клянусь, это почти точно то, что он сказал.