Подтвердить что ты не робот

Что такое процесс и поток?

Да, я прочитал много материалов, связанных с операционной системой. И я все еще читаю. Но, похоже, все они описывают процесс и поток в "абстрактном" виде, что значительно повышает уровень их поведения и логики. Мне интересно, что они физически? По-моему, это всего лишь некоторые "структуры данных" в памяти, которые поддерживаются и используются кодами ядра для облегчения выполнения программы. Например, операционная система использует некоторую структуру данных процесса (PCB) для описания аспектов процесса, назначенного для определенной программы, например, его приоритета, его адресного пространства и т.д. Все в порядке?

4b9b3361

Ответ 1

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

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

Это довольно упрощенное объяснение. Я мог бы вдаваться в подробности, но, вероятно, накладывался бы на то, что вы найдете в своих учебниках.

EDIT: вы заметите, что в моем объяснении много "обычно", так как иногда появляются редкие программы, которые сильно отличаются друг от друга.

Ответ 2

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

Итак, что такое поток? Ближе всего я могу объяснить, что это состояние выполнения, как в: комбинации регистров процессора, стека, партии. Вы можете убедиться в этом, взломав отладчика в любой момент. Что ты видишь? Стек вызовов, набор регистров. Это в значительной степени. Это поток.

Итак, что такое процесс. Ну, это похоже на абстрактный объект "контейнер" для запуска потоков. Что касается ОС в первом приближении, то OS объекта выделяет некоторую виртуальную машину, назначает некоторые системные ресурсы (например, дескрипторы файлов, сетевые сокеты), & c.

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

Ответ 3

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

Их конкретные реализации сильно различаются.

Сравните, например, процесс Erlang и процесс Windows: процесс Erlang очень легкий, часто менее 400 байт. Вы можете запустить 10 миллионов процессов на не очень недавнем ноутбуке без каких-либо проблем. Они запускаются очень быстро, они умирают очень быстро, и вы ожидаете, что сможете использовать их для очень коротких задач. Каждый процесс Erlang имеет свой собственный сборщик мусора, связанный с ним. Процессы Erlang никогда не могут делиться памятью.

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

Потоки аналогичны: NPTL Linux Thread на x86 может быть как 4 KiByte, и с некоторыми трюками вы можете запустить 800000+ на 32-битной машине x86. Машина, безусловно, будет использоваться с тысячами, а может быть, десятками тысяч потоков. Потоки .NET CLR имеют минимальный размер около 1 мегабайта, а это значит, что всего 4000 из них будут уничтожать все ваше адресное пространство на 32-битной машине. Итак, в то время как 4000 NPTL Linux Threads, как правило, не проблема, вы даже не можете запускать 4000.NET CLR Threads, потому что до этого у вас не хватит памяти.

Процессы ОС и потоки ОС также реализованы по-разному между различными операционными системами. Основные два подхода: ядро ​​знает только о процессах. Темы реализованы библиотекой пользовательского пространства, без каких-либо знаний о ядре. В этом случае снова возникают два подхода: 1:1 (каждый поток сопоставляется одному процессу ядра) или m: n (m Отображает потоки в n Процессах, где обычно m > n и часто n == #CPU). Это был ранний подход, примененный во многих операционных системах после того, как были изобретены Threads. Однако он обычно считается неэффективным и был заменен почти на всех системах вторым подходом: потоки реализованы (по крайней мере частично) в ядре, так что теперь ядро ​​знает о двух разных объектах, потоках и процессах.

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

В зависимости от того, как вы устанавливаете эти флаги, вы получаете либо Thread (разделяете почти все), либо Process (совместно используете все системные ресурсы, такие как системные часы, пространство имен файловой системы, пространство имен в сети, пространство имен идентификаторов пользователей, процесс ID, но не разделяйте адресное пространство). Но вы также можете получить и некоторые интересные интересные вещи. Вы можете тривиально получить листы в стиле BSD (в основном те же флаги, что и процесс, но не разделяют файловую систему или пространство имен в сети). Или вы можете получить то, что другие ОС называют контейнером или зоной виртуализации (например, тюрьмой, но не разделяют пространства имен UID и PID и системные часы). С тех пор как пару лет назад с помощью технологии KVM (Kernel Virtual Machine) вы даже можете получить полномасштабную виртуальную машину (обмениваться ничем, даже таблицами страниц процессора). [Замечательная вещь об этом заключается в том, что вы можете повторно использовать настроенный зрелый планировщик заданий в ядре для всех этих вещей. Одной из причин, по которым часто критиковали Xen Virtual Machine, была низкая производительность его планировщика. У разработчиков KVM есть гораздо лучший планировщик, чем Xen, и лучше всего им даже не нужно писать для него одну строку кода!]

Итак, в Linux производительность потоков и процессов намного ближе, чем к Windows и многим другим системам, потому что в Linux они на самом деле то же самое. Это означает, что шаблоны использования очень разные: в Windows вы обычно решаете между использованием Thread и Process в зависимости от их веса: могу ли я предоставить Process или использовать Thread, хотя я действительно не хочу делиться государство? В Linux (и обычно в Unix в целом) вы решаете на основе их семантики: действительно ли я хочу использовать состояние или нет?

Одна из причин, по которой процессы, как правило, легче в Unix, чем в Windows, - это различное использование: в Unix процессы являются базовым элементом как concurrency, так и функциональности. Если вы хотите использовать concurrency, вы используете несколько процессов. Если ваше приложение может быть разбито на несколько независимых частей, вы используете несколько процессов. Каждый процесс выполняет только одну вещь и только одну вещь. Даже простая однострочная оболочка script часто включает в себя десятки или сотни Процессов. Приложения обычно состоят из многих, часто недолговечных процессов.

В Windows потоки являются базовыми единицами concurrency, а компоненты COM или объекты .NET являются базовыми единицами функциональности. Приложения обычно состоят из одного длительного процесса.

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

В значительной степени единственное, что вы можете сказать о Threads and Processes, состоит в следующем:

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

Ответ 4

Я бы сказал, что:

Процесс имеет пространство памяти, открытые файлы,... и один или несколько потоков.

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

Ответ 5

Взгляните на подробный ответ, который я дал ранее здесь, на fooobar.com/questions/113649/.... Это дает представление о структуре ядра игрушек, которая отвечает за поддержание процессов и потоков...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Ответ 7

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

Процесс включает в себя следующее:

  • Частное виртуальное адресное пространство
  • Программа.
  • Список ручек.
  • Токен доступа.
  • Уникальный идентификатор процесса.
  • Как минимум один поток.
  • Указатель на родительский процесс, независимо от того, существует или нет этот процесс.

При этом процесс может содержать несколько потоков.

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

A thread - это то, что Windows использует для планирования выполнения инструкций на CPU. У каждого процесса есть хотя бы один.

У меня есть пара страниц на моей вики, на которые вы можете взглянуть:

Process

Thread

Ответ 8

Физически:

  • Процесс - это структура, которая поддерживает собственные учетные данные, список потоков и список открытых дескрипторов

  • Тема - это структура, содержащая контекст (т.е. сохраненный набор регистров + место для выполнения), набор PTE, описывающий, какие страницы отображаются в виртуальном адресном пространстве процесса, и владелец.

Это, конечно, чрезвычайно упрощенное объяснение, но оно получает важные бит. Фундаментальной единицей исполнения на Linux и Windows является Thread - планировщик ядра не заботится о процессах (много). Вот почему в Linux поток - это просто процесс, который, как правило, разделяет PTE с другим процессом.

Ответ 9

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

Ответ 10

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

Ответ 11

Это не физические части строки, если это то, о чем вы просите.;)

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

Ответ 12

Трудно дать короткий ответ, который делает этот вопрос справедливым.

И рискуя получить это ужасно неправильно и простое, вы можете сказать, что потоки и процессы - это концепция операционной системы/платформы; и под капотом, вы можете определить однопоточный процесс,

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

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

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

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

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

Изменить: Идеи применяются также в абстрактных платформах, таких как Java.

Ответ 13

Я видел много ответов, но большинство из них недостаточно ясны для новичков ОС.

В любой современной операционной системе один процесс имеет виртуальный процессор, виртуальную память, виртуальный ввод-вывод.

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

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

Виртуальная память: http://en.wikipedia.org/wiki/Virtual_memory вы можете пройти через ссылку.

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

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

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

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

Ответ 14

поток управляется процессом, процесс контролируется операционной системой

Ответ 15

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

Ответ 16

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

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

Ответ 17

Процесс представляет собой контейнер потоков.

Ответ 18

Ну, я еще не видел ответа на вопрос "Что они физически". Поэтому я даю ему попробовать.

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

Ответ 19

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

Если вы просматриваете компьютер в натуральном выражении, вы получаете беспорядок электроника, которая эмулирует то, что делает Turing Machine. Попытка сделать что-нибудь полезное с помощью сырьевой машины Truing превратит ваш мозг в Jell-O в пять минут. Избегать этот неприятный опыт, компьютерные люди разработали набор абстракций для разделения различные аспекты вычислений. Это позволяет сосредоточиться на уровне абстракции, который вас интересует, не беспокоясь о других вещах, поддерживающих его. Некоторые вещи были введены в схему (например, сумматоры и т.п.), Что делает их физическими, но подавляющее большинство того, с чем мы работаем, основано на множестве абстракций. Как правило, абстракции мы используем для них некоторую форму математического обоснования. Вот почему стеки, очереди и "государство" играют такую ​​важную роль в вычислении - есть хорошо обоснованная набор математики вокруг этих абстракций, которые позволяют нам основываться и рассуждать о их манипуляции.

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

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

Программное обеспечение похоже на лук, слои на слоях на слоях, как только вы обмениваете все слои (абстракции), ничего не осталось! Но лук все еще очень велик.

Ответ 20

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

Ответ 21

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

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

Ответ 22

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

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

Например:

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

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

Ответ 23

Process:Program in execution is a process

Thread: Function ( with in program) in execution is a thread

Например: Mozilla firefox - это процесс. Щелчок по другим вкладкам в Mozilla firefox - это потоки.

Процесс имеет отдельный стек. Общий поток с одним файлом.