Темы: некоторые вопросы - PullRequest
2 голосов
/ 20 сентября 2010

У меня есть пара вопросов по темам. Не могли бы вы уточнить.

  1. Предположим, что процесс с одним или несколькими потоками. Если процесс предварительно или приостановлен, потоки также прерваны или потоки продолжают работать?

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

  3. если поток в процессе запущен и получает сигнал (скажем, Cntrl-C) и действие сигнала по умолчанию - завершить процесс, завершается ли работающий поток или родительский процесс также завершится? Что происходит с потоками, если запущенный процесс завершается из-за какого-то сигнала?

  4. Если поток выполняет fork fallowed exec, перекрывает ли exece'd адресное пространство родительского процесса или запущенного потока? Если он перекрывает родительский процесс, что происходит с потоками, их данными, блокировками, которые они удерживают, и тем, как они планируются после завершения exec'd процесса.

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

  6. Во время выполнения потока на что указывает текущая переменная ядра (родительский процесс task_stuct или потоки stack_struct?

  7. Если процесс с потоком работает, то при запуске потока родитель делает процесс прерывается, и как каждый поток запланирован?

  8. Если процесс, запущенный на ЦП, создает несколько потоков, создает ли потоки, созданные родительским процессом, расписание на другом ЦПУ в многопроцессорной системе?

Спасибо, Ганеш

Ответы [ 4 ]

5 голосов
/ 21 сентября 2010

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

Все процессы запускают жизнь только с одним потоком, и все процессы имеют минимум один поток. Теперь на вопросы:

  1. Предположим, что процесс с одним или несколькими потоками. Если процесс прерван / приостановлен, потоки также прерваны или потоки продолжают работать?

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

Также можно запросить приостановку каждого потока в процессе, например, отправив SIGSTOP процессу.

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

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

  1. Если поток в процессе запущен и получает сигнал (скажем, Cntrl-C) и действие сигнала по умолчанию - завершить процесс, завершается ли работающий поток или также завершится родительский процесс? Что происходит с потоками, если запущенный процесс завершается из-за какого-то сигнала?

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

  1. Если поток выполняет fork, а затем exec, перекрывает ли программа exece адресное пространство родительского процесса или запущенного потока? Если он перекрывает родительский процесс, что происходит с потоками, их данными, блокировками, которые они удерживают, и тем, как они планируются после завершения exec'd процесса.

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

Если этот поток в новом процессе вызывает execve(), он заменит новое дублированное адресное пространство программой exec'd. Исходный процесс и все его потоки продолжают работать в обычном режиме.

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

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

  1. Пока поток работает, на что указывает текущая переменная ядра (родительский процесс task_stuct или потоки stack_struct?

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

  1. Если процесс с [вторым] потоком запущен, то при запуске потока родительский процесс вытесняется и как распределяется каждый поток?

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

Если процесс, выполняющийся на ЦП, создает несколько потоков, создает ли потоки, созданные родительским процессом, расписание на другом ЦПУ в многопроцессорной системе?

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

1 голос
/ 20 сентября 2010
  1. Зависит. Если поток вытесняется, потому что планировщик ОС решает выделить процессорное время другому потоку, тогда другие потоки в процессе будут продолжать работать. Если процесс приостанавливается (то есть он получает сигнал SIGSTP), тогда AFAIK все потоки будут приостановлены.

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

  3. Процесс завершится, а вместе с ним и потоки.

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

  5. Порядок планирования потоков определяется планировщиком ОС, никаких гарантий относительно какого-либо конкретного заказа не предоставляется.

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

  7. Нет такой вещи, как процесс без единого потока. «Простой процесс» - это просто процесс с одним потоком.

  8. Вероятно, да. Это определяется планировщиком ОС. Обратите внимание, что существуют API и инструменты (numactl), которые можно использовать для принудительной работы некоторых потоков на конкретном ядре ЦП.

0 голосов
/ 20 сентября 2010

Ядро Linux не различает потоки и процессы. Что касается ядра, поток - это просто другой процесс, который совместно использует адресное пространство с другими процессами. (Вы бы назвали набор «процессов» (т.е. потоков ), которые совместно используют одно адресное пространство, «процессом».)

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

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

0 голосов
/ 20 сентября 2010

Если ваши вопросы касаются потоков POSIX, тогда

1a.У процесса, который выгружается из O / S, будут выгружены все его потоки.

1b.O / S приостановит все потоки процесса, который отправил SIGSTOP.

O / S возобновит все потоки приостановленного процесса, отправившего SIGCONT.

По умолчанию SIGINT завершит все потоки в процессе.

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

POSIX позволяет выбирать пользовательский алгоритм планирования потоков.

Я не понимаю вопроса.

Я не понимаю вопроса.

Как отображаются потокиПроцессоры зависят от реализации.Многие реализации будут пытаться распределить потоки среди доступных процессоров для повышения производительности.

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