Системный вызов Linux для создания процесса и потока - PullRequest
11 голосов
/ 28 февраля 2012

Я прочитал в газете , что основной системный вызов для создания процессов и потоков фактически одинаков, и, следовательно, стоимость создания процессов поверх потоков не так велика.

  • Во-первых, я хочу знать, каков системный вызов, который создает процессы / потоки (возможно, пример кода или ссылку?)
  • Во-вторых, автор прав, предполагая, что созданиепроцессы вместо потоков стоят недорого?

РЕДАКТИРОВАТЬ:
Цитировать статью:

Замена pthreads процессами на удивление недорога, особенно в Linuxгде и потоки, и процессы вызываются с использованием одного и того же системного вызова.

Ответы [ 3 ]

20 голосов
/ 28 февраля 2012

Процессы обычно создаются с fork, потоки (облегченные процессы) обычно создаются с clone в настоящее время.Однако, как это ни странно, существуют также модели потоков 1: N, которые тоже этого не делают.

Обе fork и clone отображаются на одну и ту же функцию ядра do_fork внутри.Эта функция может создать облегченный процесс, который разделяет адресное пространство со старым или отдельный процесс (и многие другие параметры), в зависимости от того, какие флаги вы ему подаете.Системный вызов clone является более или менее прямой передачей этой функции ядра (и используется библиотеками потоков более высокого уровня), тогда как fork включает do_fork в функциональность 50-летней традиционной функции Unix.

Важное отличие состоит в том, что fork гарантирует, что будет сделана полная, отдельная копия адресного пространства.Это, как правильно указывает Василий, в настоящее время выполняется с копированием при записи и, следовательно, не так дорого, как можно подумать.
Когда вы создаете поток, он просто повторно использует исходное адресное пространство и ту же память.

Однако, не следует предполагать, что создание процессов, как правило, «облегчено» в unix-подобных системах из-за копирования при записи.Он несколько менее тяжелый, чем, например, в Windows, но его далеко не бесплатно.
Одна из причин заключается в том, что, хотя реальные страницы не копируются, новому процессу все равно требуется копия таблицы страниц.Это может быть от нескольких килобайт до мегабайт памяти для процессов, которые используют большие объемы памяти.Другая причина заключается в том, что хотя копирование при записи невидимо и является разумной оптимизацией, оно не является бесплатным и не может творить чудеса.Когда данные модифицируются любым из процессов, что неизбежно происходит, происходит сбой затронутых страниц.

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

3 голосов
/ 28 февраля 2012

Основной системный вызов для создания потоков: clone (2) (это специфично для Linux).Кстати, список системных вызовов Linux находится на syscalls (2) , и вы можете использовать команду strace (1) , чтобы понять системные вызовы, выполняемые каким-либо процессом или командой.Процессы обычно создаются с помощью fork (2) (или vfork (2) , что не очень полезно в наши дни).Тем не менее, вы могли бы (и некоторые стандартные библиотеки C могли бы сделать это) создавать их с определенной формой clone.Я предполагаю, что ядро ​​совместно использует некоторый код для реализации clone, fork и т. Д. (Поскольку некоторые функции, например управление виртуальным адресным пространством , являются общими). ​​

Действительно, процесс создания (а также создание потоков), как правило, довольно быстро в большинстве систем Unix (потому что они используют копирование при записи механизм для виртуальной памяти ), обычно небольшойдоля миллисекунды.Но у вас могут быть патологические случаи (например, thrashing ), которые делают это намного длиннее.

Поскольку большинство реализаций C стандартной библиотеки являются свободными программами onВ Linux вы можете изучить исходный код того, что есть в вашей системе (часто GNU glibc , но иногда musl-libc или что-то еще).

0 голосов
/ 28 февраля 2012

Если вы используете C, вот некоторые вещи, которые могут вам помочь:

Fork - для создания процесса: http://en.wikipedia.org/wiki/Fork_(operating_system)

Pthreads Библиотека для потоков: http://en.wikipedia.org/wiki/POSIX_Threads

Если вы знакомы с C ++, вы можете зайти в библиотеку Boost Threads.

Классическим примером, когда многопоточная технология считалась более подходящей, чем многопоточная, является браузер Google Chrome.

...