Читаем Linux API. Исчерпывающее руководство полностью

Если указать флаг CLONE_PID, потомок будет иметь такой же идентификатор, как его родитель. В противном случае родитель и потомок получают разные идентификаторы PID (как в случае с fork() и vfork()). Этот флаг может устанавливать только процесс загрузки системы (тот, чей PID равен 0); он используется во время инициализации мультипроцессорных систем.

Флаг CLONE_PID не предназначен для применения в пользовательских приложениях. Он больше не доступен в Linux 2.6, а ему на замену пришел флаг CLONE_IDLETASK, который приводит к тому, что идентификатор нового процесса равняется 0. Флаг CLONE_IDLETASK доступен только для внутреннего применения в ядре и игнорируется вызовом clone(). Он используется для создания невидимых процессов, находящихся в режиме ожидания; каждый такой процесс отводится для отдельного ЦПУ (в многопроцессорных системах их может быть несколько).


Трассировка процессов: CLONE_PTRACE и CLONE_UNTRACED

Если указать флаг CLONE_PTRACE, потомок трассируемого процесса тоже будет трассироваться. Подробности о трассировке процессов (которая используется при отладке и в команде strace) ищите на справочной странице ptrace(2).

В версиях Linux 2.6 и выше можно указывать флаг CLONE_UNTRACED, который не позволяет трассируемому процессу применить флаг CLONE_PTRACE к своему потомку. Он используется внутри системы для создания потоков ядра.


Приостановка родителя до тех пор, пока потомок не завершится или не выполнит exec: CLONE_VFORK

Если указать флаг CLONE_VFORK, выполнение родителя приостанавливается до тех пор, пока потомок не освободит ресурсы своей виртуальной памяти с помощью вызовов exec() или _exit() (как в случае с vfork()).


Новые флаги вызова clone() для поддержки контейнеров

В Linux 2.6.19 и выше появилась поддержка целого ряда новых флагов для вызова clone(): CLONE_IO, CLONE_NEWIPC, CLONE_NEWNET, CLONE_NEWPID, CLONE_NEWUSER и CLONE_NEWUTS (см. справочную страницу clone(2)).

Большинство из этих флагов обеспечивают поддержку контейнеров ([Bhattiprolu et al., 2008]). Контейнер — это разновидность легковесной виртуализации, при которой группы процессов, выполняющихся на одном ядре, могут быть изолированы друг от друга в средах, напоминающих отдельные компьютеры. Контейнеры также могут быть вложенными, один внутри другого. Данный подход отличается от полноценной виртуализации, при которой каждая виртуальная среда работает на отдельном ядре.

Для реализации контейнеров разработчикам Linux пришлось создать в ядре виртуальный слой вокруг каждого глобального ресурса системы — это, например, касается идентификаторов процессов, сетевого стека, идентификаторов, возвращаемых вызовом uname(), IPC-объектов из System V, а также пространств имен для идентификаторов пользователей и групп. Благодаря этому каждый контейнер может получить собственный экземпляр этих ресурсов.

Контейнеры имеют множество различных применений, включая следующие:

• контроль над выделением ресурсов системы, таких как пропускная способность сети или процессорное время (например, одному контейнеру можно выдать 75 % процессорного времени, а другому — 25 %);

• предоставление нескольких легковесных виртуальных серверов на одном и том же компьютере;

• замораживание контейнера, чтобы приостановить выполнение всех процессов внутри него и позже, возможно после миграции на другой компьютер, запустить их заново;

• возможность сбросить на диск состояние приложения (создав тем самым контрольную точку) и затем восстановить его (возможно, после аварийного завершения программы или плановой/неплановой перезагрузки системы), чтобы продолжить выполнение с того самого места.


Использование флагов вызова clone()

Вызов fork(), грубо говоря, соответствует вызову clone(), аргумент flags которого равен SIGCHLD, тогда как vfork() соответствует clone() со следующими флагами:

CLONE_VM | CLONE_VFORK | SIGCHLD

Обертка fork() библиотеки glibc версии 2.3.3 и выше, которая входит в состав реализации NPTL-потоков, обходит одноименный системный вызов и обращается вместо него к вызову clone(). Эта функция запускает любые обработчики, установленные вызывающим процессом с помощью pthread_atfork() (см. раздел 33.3).

В библиотеке LinuxThreads для создания потоков вызов clone() (но только с первыми четырьмя его аргументами) применяется в сочетании со следующими флагами:

CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_SIGHAND

В библиотеке NPTL вызов clone() (вместе со всеми семью его аргументами) создает потоки с помощью таких флагов:

CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_SIGHAND | CLONE_THREAD | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_SYSVSEM


28.2.2. Расширения к вызову waitpid() для клонированных потомков

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных