Некоторые вопросы по потокам и процессам

Некоторые вопросы по потокам и процессам

Мне задали эти вопросы на собеседовании (собеседование по C++). Я не уверен в ответах и ​​хотел бы узнать больше.

  1. Может ли поток создать другой поток?
  2. Может ли процесс создать другой процесс?
  3. Может ли поток создать процесс?
  4. Может ли процесс создать поток?

решение1

  1. Да, поток может создать другой поток. В UNIX это делается (на низком уровне) через команду clone(), а на более высоком уровне, в кодировании на языке C, через библиотеку pthread.

  2. Да, процесс может запустить другой процесс. Это происходит постоянно. Наиболее распространенный тип процесса -> процесс — через fork().

  3. В этом я не уверен. На данный момент я хотел бы упомянуть, что есть два основных типа потоков: потоки уровня ядра и потоки уровня пользователя. Потоки уровня ядра (в целом) привязаны к основным процессам, в то время как потоки уровня пользователя порождаются этими процессами (то есть потоками уровня ядра).Есть исключения.Может быть, кто-то сможет дать лучший ответ на тему ветка -> процесс.

  4. Да. См. комментарий в 3.

решение2

Любой исполняемый код может делать что угодно.

При этом процессы не являются кодом — потоки — это то, что фактически запускается, а процессы — это их окружающая среда. Следовательно, (1) и (3) истинны, остальное ложно.

решение3

Да для всех.

Это может помочь вам понять, что процессы на самом деле не "запускаются" в Windows. Запускаются потоки. Каждый процесс имеет по крайней мере один поток. Итак, настоящие вопросы:

  • может ли выполнение кода создать другой поток? Да.

В Windows это делается с помощью API CreateThread или одного из его кузенов. Длинная версия будет выглядеть так: «может ли код, работающий в контексте потока, создать другой поток?» Конечно, но посколькувсекод выполняется в контексте некоторого потока, нет необходимости в дополнительных выражениях. CreateThread принимает аргумент, который является адресом функции, которая становится функцией верхнего уровня для нового потока — по сути, «главной» нового потока.

  • может ли выполнение кода создать другой процесс? Да.

Аналогично предыдущему: когда вы работаете в контексте потока, вы также работаете в контексте процесса, которому принадлежит поток. Так что да, есть API CreateProcess, и вы можете использовать его для создания другого процесса.

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

Связанный контент