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

Викинг против Threading

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

Я искал Google разницу между ними, и я узнал, что:

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

Но в моем сознании все еще есть некоторые вопросы.

  • Когда вы предпочитаете fork() для потоковой передачи и наоборот?
  • Если я хочу вызвать внешнее приложение в качестве дочернего элемента, то следует ли использовать fork() или потоки для этого?
  • Выполняя поиск в Google, я обнаружил, что люди говорят, что это плохо, чтобы вызвать fork() внутри потока. почему люди хотят вызвать fork() внутри потока, когда они делают подобные вещи?
  • Правда ли, что fork() не может использовать преимущества многопроцессорной системы, поскольку родительский и дочерний процессы не запускаются одновременно?
4b9b3361

Ответ 1

Основное различие между подходами к формованию и потоку - одна из архитектур операционной системы. В те времена, когда была разработана Unix, forking была простой и простой системой, которая отвечала требованиям большинства мэйнфреймов и типов серверов, поэтому она была популярна в системах nix. Когда MS запустила ядро ​​NT с нуля, он больше сосредоточился на модели потоковой передачи. Таким образом, сегодня все еще существует заметная разница с эффективностью nix-систем с forking, а Windows более эффективна с потоками. Вы можете наиболее заметно увидеть это в Apache, который использует стратегию prefork на nix и потоковое использование в Windows.

В частности, на ваши вопросы:

Когда вы предпочитаете fork() над потоками и наоборот?

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

Если я хочу вызвать внешнее приложение в качестве дочернего элемента, то следует ли использовать fork() или потоки для этого?

Если ребенок выполнит идентичную задачу с родителем, с идентичным кодом, используйте fork. Для небольших подзадач используют потоки. Для отдельных внешних процессов не используйте их, просто назовите их соответствующими API-вызовами.

Выполняя поиск по Google, я обнаружил, что люди говорят, что это плохо, чтобы вызвать fork() внутри потока. почему люди хотят вызвать fork() внутри потока, когда они делают подобные вещи?

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

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

Это неверно, fork создает новый процесс, который затем использует все функции, доступные для процессов в планировщике задач ОС.

Ответ 2

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

Ниже приведена разница между ними.

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

Ответ 3

fork() генерирует новую копию процесса, как вы уже отмечали. То, о чем не упоминалось выше, - это вызов exec(), который часто следует. Это заменяет существующий процесс новым процессом (новым исполняемым файлом) и как таковым, fork()/exec() является стандартным средством для создания нового процесса из старого.

например. что ваша оболочка вызовет процесс из командной строки. Вы указываете свой процесс (ls, скажем) и вилки оболочки, а затем execs ls.

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