3

Почему переключаться между потоками быстрее, чем переключаться между процессами и обмениваться данными между ними? Например, на веб-сервере apache, работающем в Ubuntu, можно использовать либо Prefork MPM (порождая несколько дочерних процессов), либо Worker MPM (создавая несколько потоков для одного процесса).

2 ответа2

3

Быстрый, неполное объяснение:

В переключателе потоков гораздо меньше контекста, который необходимо сохранить / загрузить. В частности, память является общей. Ядро не должно делать никаких выходов страниц из грязных страниц и трюков ВМ, чтобы извлечь всю память для нового процесса (хотя некоторые определенные страницы, возможно, должны быть извлечены). В ядре есть другие специфичные для процесса структуры данных (скажем, таблица дескрипторов открытых файлов), которые не нужно заменять.

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

Да, есть инструменты для разделения памяти (разделяемая память IPC, каналы) между процессами, но ни один из них не является настолько чистым / легким, как общая память в процессе. Вы не можете увеличить общий блок памяти, как вы можете с помощью realloc () и тому подобное. Что угодно, кроме разделяемой памяти, означает, что вам нужно несколько копий структур данных, по одной в каждом процессе, с хитростями для копирования изменений по мере необходимости.

В частности, Apache имеет несколько моделей для разных ОС. Первоначальная модель была предварительной вилкой, обеспечивающей изоляцию процесса в обмен на некоторое тяжелое переключение процессов. Это хорошо работало с UNIX, которые были распространены во время его первого написания, где у некоторых вообще не было потоков. Windows была настолько плоха с многопроцессорностью, что apache пришлось выполнять многопоточность - процессы в Windows (по крайней мере, во время apache 1.2/2.0) были слишком тяжелыми. В Linux очень легкие процессы, где переключение близко к времени переключения потоков, поэтому обычно оно остается предварительным. Solaris имеет модель со сложной резьбой "LWP" и лучше всего подходит для гибридной модели с резьбой /вилкой.

0

Я думаю, что если вы прочитаете эту ссылку StackOverflow здесь, вы поймете, почему быстрее переключаться между потоками, чем переключаться между процессами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .