oom_adj
Да
Да
coredump_filter
Да
Да
См. раздел 22.1
Когда включен учет ресурсов, ядро записывает в файл учетные сведения о каждом завершающемся процессе в системе.
По аналогии с fork(), системный вызов clone() (доступный только в Linux) создает новый процесс, но при этом позволяет более тонко управлять разделением атрибутов между родителем и потомком. Он в основном используется для реализации поточных библиотек.
Мы сравнили скорость создания процессов с помощью fork(), vfork() и clone(). Вызов vfork() опережает fork() по скорости, однако разница между этими системными вызовами небольшая, если сравнивать с временем, которое уходит у потомка на выполнение последующего вызова exec().
Дочерний процесс, созданный с помощью вызова fork(), наследует копии (или в некоторых случаях разделяет) определенные атрибуты своего родителя. Например, потомок наследует от родителя копии таблицы файловых дескрипторов и действия сигналов, но не интервалы таймеров, блокировки записей или набор ожидающих сигналов. Соответственно, когда процесс выполняет exec(), одни его атрибуты остаются без изменений, а другие сбрасываются к значениям по умолчанию. Например, идентификатор процесса сохраняется прежним, файловые дескрипторы остаются открытыми (если не указан флаг FD_CLOEXEC), интервалы таймеров не меняются, а сигналы остаются в режиме ожидания; однако обрабатываемые сигналы сбрасывают свои действия к значениям по умолчанию, а сегменты общей памяти разъединяются.
Ознакомьтесь с источниками, приведенными в разделе 24.6. В книге [Frisch, 2002] в главе 17 описывается управление системой учета ресурсов, а также рассматриваются некоторые отличия между разными реализациями UNIX. В книге [Bovet & Cesati, 2005] описывается реализация системного вызова clone().
28.1. Напишите программу, чтобы увидеть, насколько быстро работают системные вызовы fork() и vfork() на вашем компьютере. Каждый дочерний процесс должен немедленно завершаться, а родитель перед созданием следующего потомка должен ждать этого момента с помощью вызова wait(). Сравните различия между этими двумя вызовами с данными из табл. 28.3. Для измерения времени выполнения программы можно воспользоваться встроенной в оболочку командой time.
29. Потоки выполнения: введение
Эта и несколько следующих глав посвящены POSIX-потокам, известным также как
В данных главах в основном описывается стандартное поведение потоков, предусмотренное программным интерфейсом Pthreads. В разделе 33.5 мы обсудим различия между двумя главными реализациями потоков в Linux — LinuxThreads и NPTL (Native POSIX Threads Library).
В этой главе мы сначала ознакомимся с кратким обзором работы потоков, а затем сосредоточимся на том, как они создаются и завершаются. В конце будут рассмотрены некоторые факторы, которые следует учитывать при выборе между двумя разными подходами к проектирования приложений — многопоточным и многопроцессным.
По аналогии с процессами потоки выполнения представляют собой механизм для одновременного выполнения нескольких параллельных задач в рамках одного приложения. Как показано на рис. 29.1, один процесс может содержать несколько потоков. Все они выполняются внутри одной программы независимо друг от друга, разделяя общую глобальную память — в том числе инициализированные/неинициализированные данные и сегменты кучи (традиционный для UNIX процесс является всего лишь частным случаем многопоточного процесса; он состоит из одного потока).
На рис. 29.1 допущены некоторые упрощения. В частности, местоположение стеков у каждого из потоков может пересекаться с разделяемыми библиотеками и общими участками памяти; это зависит от порядка, в котором создавались потоки, загружались библиотеки и присоединялись общие участки памяти. Кроме того, местоположение стеков у потоков может меняться в зависимости от дистрибутива Linux.
Потоки в процессе могут выполняться одновременно. В многопроцессорных системах возможно параллельное выполнение потоков. Если один поток заблокирован из-за ввода/вывода, другой может продолжать работу (иногда имеет смысл создать отдельный поток, который занимается исключительно вводом/выводом, хотя, часто более подходящими оказываются альтернативные модели ввода/вывода; подробней об этом — в главе 59).