oom_adj

Да

Да

coredump_filter

Да

Да

См. раздел 22.1

28.5. Резюме

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

По аналогии с fork(), системный вызов clone() (доступный только в Linux) создает новый процесс, но при этом позволяет более тонко управлять разделением атрибутов между родителем и потомком. Он в основном используется для реализации поточных библиотек.

Мы сравнили скорость создания процессов с помощью fork(), vfork() и clone(). Вызов vfork() опережает fork() по скорости, однако разница между этими системными вызовами небольшая, если сравнивать с временем, которое уходит у потомка на выполнение последующего вызова exec().

Дочерний процесс, созданный с помощью вызова fork(), наследует копии (или в некоторых случаях разделяет) определенные атрибуты своего родителя. Например, потомок наследует от родителя копии таблицы файловых дескрипторов и действия сигналов, но не интервалы таймеров, блокировки записей или набор ожидающих сигналов. Соответственно, когда процесс выполняет exec(), одни его атрибуты остаются без изменений, а другие сбрасываются к значениям по умолчанию. Например, идентификатор процесса сохраняется прежним, файловые дескрипторы остаются открытыми (если не указан флаг FD_CLOEXEC), интервалы таймеров не меняются, а сигналы остаются в режиме ожидания; однако обрабатываемые сигналы сбрасывают свои действия к значениям по умолчанию, а сегменты общей памяти разъединяются.

Дополнительная информация

Ознакомьтесь с источниками, приведенными в разделе 24.6. В книге [Frisch, 2002] в главе 17 описывается управление системой учета ресурсов, а также рассматриваются некоторые отличия между разными реализациями UNIX. В книге [Bovet & Cesati, 2005] описывается реализация системного вызова clone().

28.6. Упражнение

28.1. Напишите программу, чтобы увидеть, насколько быстро работают системные вызовы fork() и vfork() на вашем компьютере. Каждый дочерний процесс должен немедленно завершаться, а родитель перед созданием следующего потомка должен ждать этого момента с помощью вызова wait(). Сравните различия между этими двумя вызовами с данными из табл. 28.3. Для измерения времени выполнения программы можно воспользоваться встроенной в оболочку командой time.

<p>29. Потоки выполнения: введение</p>

Эта и несколько следующих глав посвящены POSIX-потокам, известным также как Pthreads. Однако мы не ставим перед собой цели рассмотреть весь программный интерфейс Pthreads, поскольку он довольно объемный. В конце этой главы будут представлены различные источники дополнительной информации о потоках.

В данных главах в основном описывается стандартное поведение потоков, предусмотренное программным интерфейсом Pthreads. В разделе 33.5 мы обсудим различия между двумя главными реализациями потоков в Linux — LinuxThreads и NPTL (Native POSIX Threads Library).

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

29.1. Краткий обзор

По аналогии с процессами потоки выполнения представляют собой механизм для одновременного выполнения нескольких параллельных задач в рамках одного приложения. Как показано на рис. 29.1, один процесс может содержать несколько потоков. Все они выполняются внутри одной программы независимо друг от друга, разделяя общую глобальную память — в том числе инициализированные/неинициализированные данные и сегменты кучи (традиционный для UNIX процесс является всего лишь частным случаем многопоточного процесса; он состоит из одного потока).

На рис. 29.1 допущены некоторые упрощения. В частности, местоположение стеков у каждого из потоков может пересекаться с разделяемыми библиотеками и общими участками памяти; это зависит от порядка, в котором создавались потоки, загружались библиотеки и присоединялись общие участки памяти. Кроме того, местоположение стеков у потоков может меняться в зависимости от дистрибутива Linux.

Потоки в процессе могут выполняться одновременно. В многопроцессорных системах возможно параллельное выполнение потоков. Если один поток заблокирован из-за ввода/вывода, другой может продолжать работу (иногда имеет смысл создать отдельный поток, который занимается исключительно вводом/выводом, хотя, часто более подходящими оказываются альтернативные модели ввода/вывода; подробней об этом — в главе 59).

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

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