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

0

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

  1. Может ли поток создать другой поток?
  2. Может ли процесс создать другой процесс?
  3. Может ли поток создать процесс?
  4. Может ли процесс создать поток?
Шив
источник
для квеста. 1 и 4 ответ ДА.
Гарри Джой

Ответы:

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

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

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

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

вода
источник
0) В вопросе говорится о окнах, но у вас есть вызовы UNIX 1) clone()Это специфично для Linux, это не универсальный UNIX. 2) fork()это не просто самый распространенный способ, но единственный способ порождать процесс в UNIX (vfork () просто вызывает fork в большинстве систем) 3) да, поток может вызывать fork, но вы путаете ядро ​​проблемы с пользовательскими потоками.
Rich Homolka
Я не помню, чтобы там был тег Windows, когда я отвечал. Я мог пропустить это случайно, извините.
Aqua
0

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

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

Mehrdad
источник
«Любой код, который выполняется, может делать что угодно». ложно на современных архитектурах даже с тривиальными примерами. Например, если страница памяти установлена ​​только для чтения, то никакой бегущий код не сможет записать на эту страницу. Если страница памяти установлена ​​как неисполняемая (NX), то ни один запущенный код не может выполнить переход в эту память, как если бы это был код. Эти методы очень помогают смягчить определенные стили атак на программное обеспечение.
CVn
@ MichaelKjörling: способ полностью вывести ответ из контекста.
Мердад
0

Да для всех.

Это может помочь вам понять, что процессы на самом деле не «работают» в Windows. Темы запускаются. У каждого процесса есть хотя бы один поток. Итак, настоящие вопросы:

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

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

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

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

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

Джейми Ханрахан
источник