multithreading - это - ресурсы потока




В чем разница между процессом и потоком? (20)

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

Украдены here .

Какова техническая разница между процессом и потоком?

Я получаю ощущение, что слово «процесс» чрезмерно используется, а также есть потоки аппаратного и программного обеспечения. Как насчет легких процессов на таких языках, как Erlang ? Есть ли определенная причина использовать один термин над другим?


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

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

У нас есть следующее из раздела 2.2.2. Модель классической резьбы в современных операционных системах 3e by Tanenbaum:

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

Он продолжает:

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

Далее он предоставляет следующую таблицу:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

Давайте рассмотрим проблему многопоточности аппаратного обеспечения . Классически процессор поддерживал бы один поток выполнения, поддерживая состояние потока через один счетчик программ и набор регистров. Но что произойдет, если у вас пропал кеш? Для получения данных из основной памяти требуется много времени, и, хотя это происходит, процессор просто сидит там без дела. Поэтому у кого-то была идея иметь два набора состояния потока (регистры PC +), так что другой поток (возможно, в том же процессе, возможно, в другом процессе) может получить работу, пока другой поток ожидает в основной памяти. Существует несколько названий и реализаций этой концепции, таких как HyperThreading и одновременная многопоточность (SMT для краткости).

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

  1. Темы для пользователей
  2. Ядровые нити
  3. Сочетание двух

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

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

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

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


Для тех, кто более удобен в обучении путем визуализации, вот удобная диаграмма, которую я создал для объяснения процессов и потоков.
Я использовал информацию из MSDN - О процессах и потоках


Ниже приводится то, что я получил из одной из статей «Проект кода» . Полагаю, это объясняет все, что нужно четко.

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


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

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


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

Процесс

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

Нить

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

- Взято из операционной системы Galvin


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

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

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


Попытка ответить на него из ОС Linux Kernel's View

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

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


Попытка ответить на этот вопрос, касающийся Java-мира.

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

Например:

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

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


Процесс - это исполняемый экземпляр приложения. Что это значит? Например, когда вы дважды щелкните значок Microsoft Word, вы запускаете процесс, который запускает Word. Поток - это путь выполнения внутри процесса. Кроме того, процесс может содержать несколько потоков. При запуске Word операционная система создает процесс и начинает выполнять основной поток этого процесса.

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

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


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


Чтобы объяснить больше в отношении параллельного программирования

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

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

Имея в виду среднего человека,

На компьютере откройте Microsoft Word и веб-браузер. Мы называем эти два процесса .

В слове Microsoft вы вводите что-то, и оно автоматически сохраняется. Теперь вы заметили бы, что редактирование и сохранение происходит параллельно - редактирование в одном потоке и сохранение в другом потоке.


http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Линус Торвальдс ([email protected])

Вт, 6 авг 1996 12:47:31 +0300 (EET DST)

Сообщения отсортированы по: [дате] [теме] [теме] [автору]

Следующее сообщение: Bernd P. Ziller: «Re: Oops in get_hash_table»

Предыдущее сообщение: Linus Torvalds: «Re: I / O request ordering»

В понедельник, 5 августа 1996 года, Питер П. Эйзерло писал:

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

НЕТ!

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

Оба потока и процессы - это всего лишь одно: «контекст исполнения». Пытаться искусственно различать разные случаи - это просто самоограничение.

«Контекст исполнения», называемый COE, является всего лишь конгломератом всего состояния этого COE. Это состояние включает в себя такие вещи, как состояние процессора (регистры и т. Д.), Состояние MMU (отображения страниц), состояние разрешения (uid, gid) и различные «состояния связи» (открытые файлы, обработчики сигналов и т. Д.). Традиционно разница между «потоком» и «процессом» в основном заключалась в том, что потоки имеют состояние процессора (возможно, какое-то другое минимальное состояние), в то время как весь другой контекст происходит из процесса. Однако это всего лишь один из способов деления общего состояния СЕ, и нет ничего, что говорило бы, что это правильный способ сделать это. Ограничение себя таким образом просто глупо.

То, как Linux думает об этом (и как я хочу, чтобы все работало), заключается в том, что нет такой вещи, как «процесс» или «поток». Существует только совокупность COE (называемая «задача» Linux). Различные COE могут совместно использовать части своего контекста друг с другом, и один поднабор этого совместного использования является традиционной установкой «поток» / «процесс», но это действительно должно рассматриваться как ТОЛЬКО подмножество (это важный поднабор, но это значение имеет значение не от дизайна, а от стандартов: мы, очевидно, хотим запускать программы, соответствующие стандартам, поверх Linux тоже).

Короче говоря: НЕ проектируйте вокруг потока / процесса мышления. Ядро должно быть спроектировано вокруг метода COE, а затем библиотека pthreads может экспортировать ограниченный интерфейс pthreads для пользователей, которые хотят использовать этот способ просмотра COE.

Как пример того, что становится возможным, когда вы думаете, что COE в отличие от потока / процесса:

  • Вы можете сделать внешнюю программу «cd», что традиционно невозможно в UNIX и / или процессе / потоке (глупый пример, но идея в том, что вы можете иметь такие «модули», которые не ограничены традиционной UNIX / threads). Сделайте:

Клон (CLONE_VM | CLONE_FS);

child: execve ("external-cd");

/ * «execve ()» отключит виртуальную машину, поэтому единственной причиной, по которой мы использовали CLONE_VM, было ускорение процесса клонирования * /

  • Вы можете сделать «vfork ()» естественно (он требует минимальной поддержки ядра, но эта поддержка идеально подходит для CUA):

Клон (CLONE_VM);

child: продолжить выполнение, в конце концов execve ()

мать: дождитесь

  • вы можете делать внешние «детекторы IO»:

клон (CLONE_FILES);

child: открыть файловые дескрипторы и т. д.

мать: используйте fd, чтобы ребенок открыл и vv.

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

Размышляя об этом как о проблеме «контекста исполнения», ваши задачи теперь могут выбрать выполнение внешних программ (= отделить адресное пространство от родителя) и т. Д., Если они захотят, или они могут, например, делиться всем с родителем, за исключением файловые дескрипторы (так что суб-«потоки» могут открывать множество файлов без родителя, о котором нужно беспокоиться: они автоматически закрываются, когда суб-поток «выходит», и он не использует fd в родительском элементе) ,

Например, подумайте о резьбовом «inetd». Вам нужен небольшой накладной fork + exec, поэтому с помощью Linux вы можете вместо использования «fork ()» писать многопоточную inetd, где каждый поток создается с помощью только CLONE_VM (обменивайте адресное пространство, но не обменивайтесь файлом дескрипторы и т. д.). Тогда ребенок может выполнить, если это внешняя служба (например, rlogind), или, возможно, это одна из внутренних служб inetd (echo, timeofday), и в этом случае она просто делает это и выходит.

Вы не можете сделать это с помощью «thread» / «process».

Линус


Пример реального мира для процесса и потока Это даст вам основную идею о потоке и процессе

Я заимствовал вышеупомянутую информацию из ответа Скотта Лангхэма - спасибо


Процесс:

  • Исполняемый экземпляр программы называется процессом.
  • Некоторые операционные системы используют термин «задача» для ссылки на исполняемую программу.
  • Процесс всегда сохраняется в основной памяти, также называемой первичной памятью или оперативной памятью.
  • Следовательно, процесс называется активным объектом. Он исчезает, если машина перезагружена.
  • Несколько процессов могут быть связаны с одной и той же программой.
  • В многопроцессорной системе несколько процессов могут выполняться параллельно.
  • В однопроцессорной системе, хотя истинный параллелизм не достигается, применяется алгоритм планирования процесса, и процессор планирует выполнить каждый процесс по очереди, создавая иллюзию параллелизма.
  • Пример: Выполнение нескольких экземпляров программы «Калькулятор». Каждый из экземпляров называется процессом.

Нить:

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

Я заимствовал вышеупомянутую информацию из Quest Quest! блог .


Процесс : исполняемая программа известна как процесс

Тема : Thread - это функциональность, которая выполняется с другой частью программы на основе концепции «один с другим», поэтому поток является частью процесса.


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

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

Нашли это на MSDN здесь:
О процессах и потоках

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


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


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

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







process