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

Аргумент ctid представляет собой механизм, с помощью которого библиотека NPTL получает уведомление о завершении потока. Это уведомление необходимо для функции pthread_join(), которая позволяет одному POSIX-потоку ждать завершения другого.

При создании потока с помощью функции pthread_join() библиотека NPTL делает вызов clone(), в котором аргументы ptid и ctid указывают на один и тот же участок памяти (именно по этой причине CLONE_CHILD_SETTID не входит в состав NPTL). Благодаря флагу CLONE_PARENT_SETTID этот участок инициализируется идентификатором нового потока. Когда потомок завершает работу, а ctid очищается, данное изменение доступно всем потокам в процессе (поскольку был дополнительно указан флаг CLONE_VM).

Ядро обращается с участком памяти, на который указывает ctid, как с фьютексом — высокопроизводительным механизмом синхронизации (больше подробностей о фьютексах можно узнать на справочной странице futex(2)). Уведомление о завершении потока можно получить с помощью системного вызова futex(), который блокирует ожидание изменения в содержимом участка памяти, связанного с ctid (внутри происходит то же самое, что и в функции pthread_join()). В то же время ядро очищает ctid и возобновляет работу любых единиц планирования ядра (то есть потоков), заблокированных из-за ожидания фьютексом этого адреса (на уровне POSIX-потоков это приводит к разблокированию с помощью вызова pthread_join()).


Локальное хранилище на уровне потока: CLONE_SETTLS

Если указать флаг CLONE_SETTLS, аргумент tls будет указывать на структуру user_desc, описывающую буфер локального хранилища, которое будет использоваться в этом потоке. Этот флаг был добавлен в Linux 2.6 для поддержки локальных хранилищ на уровне потока в библиотеке NPTL (см. раздел 31.4). Подробные сведения о структуре user_desc можно почерпнуть в исходных кодах ядра версии 2.6 и на справочной странице set_thread_area(2).


Отдельные пространства имен файловой системы для каждого процесса: CLONE_NEWNS

Начиная с версии 2.4.19, ядро Linux поддерживает отдельные пространства имен файловой системы для каждого процесса, которые представляют собой набор точек подключения, обслуживаемых вызовами mount() и umount(). Пространство имен файловой системы отвечает за то, каким образом из путей получаются соответствующие файлы, а также за работу таких системных вызовов, как chdir() и chroot().

Родитель и потомок по умолчанию используют общее пространство имен файловой системы. Это означает, что изменения, внесенные с помощью mount() и umount() в одном процессе будут видны другому (как в случае с fork() и vfork()). Привилегированный процесс (CAP_SYS_ADMIN) может указать флаг CLONE_NEWNS, чтобы потомок получил копию пространства имен ФС своего родителя. В результате этого изменения будут доступны только тому процессу, который их вносит (в ядрах версий 2.4.x и ниже можно считать, что все процессы в системе работают с единым системным пространством имен ФС).

С помощью разделения пространств имен ФС можно создавать изолированные среды, похожие на «тюрьмы» chroot() (chroot jails), но более безопасные и гибкие; например, изолированному процессу можно предоставить точку подключения, недоступную для любого другого процесса в системе. Пространства имен ФС также могут пригодиться при создании среды для виртуального сервера.

Одновременное использование флагов CLONE_NEWNS и CLONE_FS в одном и том же вызове clone() не имеет смысла и является недопустимым.


Назначение родителя вызывающего процесса родителем потомка: CLONE_PARENT

Родителем процесса, который создается с помощью clone() (и который соответствует значению, возвращаемому вызовом getppid()), по умолчанию является процесс, вызвавший clone() (как в случае с fork() и vfork()). Но если указать флаг CLONE_PARENT, родителем потомка будет родитель вызывающего процесса. Иными словами, флаг CLONE_PARENT тождественен присваиванию child.PPID = caller.PPID (в стандартной ситуации, без флага CLONE_PARENT, это выглядело бы как child.PPID = caller.PID). Родительским (child.PPID) является процесс, которому приходит сигнал при завершении потомка.

Флаг CLONE_PARENT доступен в Linux 2.4 и выше. Изначально он задумывался для удобства реализации POSIX-потоков, однако в ядре версии 2.6 был сделан акцент на вспомогательных потоках (с применением флага CLONE_THREAD, описанного выше), благодаря чему необходимость в данном флаге отпала.


Назначение потомку идентификатора его родителя: CLONE_PID (устаревший)

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

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

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#.Введите сюда краткую аннотацию

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

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