Викинг против Threading
Я использовал потоки ранее в своих приложениях и хорошо знаю его концепции, но недавно в моей лекции операционной системы я наткнулся на fork(). Что-то похоже на резьбу.
Я искал Google разницу между ними, и я узнал, что:
- Вилка - не что иное, как новый процесс, который выглядит точно так же, как старый или родительский процесс, но все же это другой процесс с другим идентификатором процесса и собственной памятью.
- Нитки - это легкий процесс, который имеет меньше накладных расходов
Но в моем сознании все еще есть некоторые вопросы.
- Когда вы предпочитаете fork() для потоковой передачи и наоборот?
- Если я хочу вызвать внешнее приложение в качестве дочернего элемента, то следует ли использовать fork() или потоки для этого?
- Выполняя поиск в Google, я обнаружил, что люди говорят, что это плохо, чтобы вызвать fork() внутри потока. почему люди хотят вызвать fork() внутри потока, когда они делают подобные вещи?
- Правда ли, что fork() не может использовать преимущества многопроцессорной системы, поскольку родительский и дочерний процессы не запускаются одновременно?
Ответы
Ответ 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 запускает несколько строк выполнения внутрипроцесса. Викинг - это способ создания новых процессов.