Во-первых, я должен прояснить некоторую терминологию, в которой вы, кажется, запутались. В POSIX «процесс» - это единое адресное пространство плюс как минимум один поток управления, идентифицируемый идентификатором процесса (PID). Поток - это индивидуально запланированный контекст выполнения внутри процесса.
Все процессы запускают жизнь только с одним потоком, и все процессы имеют минимум один поток. Теперь на вопросы:
- Предположим, что процесс с одним или несколькими потоками. Если процесс прерван / приостановлен, потоки также прерваны или потоки продолжают работать?
Темы планируются независимо. Если поток блокирует такую функцию, как connect()
, тогда другие потоки в этом процессе все еще могут быть запланированы.
Также можно запросить приостановку каждого потока в процессе, например, отправив SIGSTOP
процессу.
- Когда приостановленный процесс переназначается, потоки процесса также планируются? Если у процесса есть процесс, имеющий несколько потоков, какие потоки будут перепланированы и на каком основании?
Это имеет смысл только в том контексте, что был сделан явный запрос на остановку всего процесса. Если вы отправите процесс SIGCONT
, чтобы перезапустить процесс, то любой из потоков, которые не заблокированы, может работать. Если можно запустить больше потоков, чем доступно процессоров для их запуска, то неизвестно, какой из них запускается первым.
- Если поток в процессе запущен и получает сигнал (скажем, Cntrl-C) и действие сигнала по умолчанию - завершить процесс, завершается ли работающий поток или также завершится родительский процесс? Что происходит с потоками, если запущенный процесс завершается из-за какого-то сигнала?
Если поток получает сигнал типа SIGINT
или SIGSEGV
, действие которого заключается в прекращении процесса , то весь процесс завершается. Это означает, что каждый поток в этом процессе бесцеремонно уничтожается.
- Если поток выполняет fork, а затем exec, перекрывает ли программа exece адресное пространство родительского процесса или запущенного потока? Если он перекрывает родительский процесс, что происходит с потоками, их данными, блокировками, которые они удерживают, и тем, как они планируются после завершения exec'd процесса.
Вызов fork()
создает новый процесс, дублируя адресное пространство исходного процесса и дублируя только один поток, вызвавший fork()
в этом новом адресном пространстве.
Если этот поток в новом процессе вызывает execve()
, он заменит новое дублированное адресное пространство программой exec'd. Исходный процесс и все его потоки продолжают работать в обычном режиме.
- Предположим, что процесс имеет несколько потоков, как потоки планируются. Если один из потоков блокирует некоторые операции ввода-вывода, то как другие потоки планируются. Работают ли потоки, запланированные с родительским процессом?
Потоки планируются независимо. Любой из не блокированных потоков может работать.
- Пока поток работает, на что указывает текущая переменная ядра (родительский процесс task_stuct или потоки stack_struct?
Каждый поток имеет свой собственный task_struct
в ядре. То, что пользовательское пространство называет «потоком», называется «процессом» в пространстве ядра. Таким образом, current
всегда указывает на task_struct
, соответствующий текущему выполняющемуся потоку (в смысле этого слова в пользовательском пространстве).
- Если процесс с [вторым] потоком запущен, то при запуске потока родительский процесс вытесняется и как распределяется каждый поток?
Предположительно, здесь вы имеете в виду «основной поток процесса», а не «родительский процесс».Как и прежде, потоки планируются независимо.Не определено, работает ли один раньше другого, и если у вас несколько процессоров, оба могут работать одновременно.
Если процесс, выполняющийся на ЦП, создает несколько потоков, создает ли потоки, созданные родительским процессом, расписание на другом ЦПУ в многопроцессорной системе?
Это действительно зависит от ядра, нопотокам, конечно, разрешено выполняться на других процессорах.