Использование слотов задач с GNU make
GNU make может выполнять несколько рецептов параллельно (см. Параллельное выполнение) и ограничивать общее количество параллельных задач даже при рекурсивных вызовах make (см. Передача опций подзадаче make). Инструменты, которые make вызывает и также способны выполнять несколько операций параллельно, используя несколько потоков или процессов, могут быть расширены для участия в механизме управления задачами GNU make, чтобы гарантировать, что общее количество активных потоков/процессов, работающих в системе, не превышает максимальное количество слотов, предоставленных GNU make.
GNU make использует метод, называемый «сервером задач», для управления количеством активных задач при рекурсивных вызовах. Фактическая реализация сервера задач варьируется в зависимости от операционной системы, но некоторые фундаментальные аспекты всегда остаются неизменными.
Во-первых, make предоставит информацию, необходимую для доступа к серверу задач через среду своим дочерним процессам, в переменной среды MAKEFLAGS. Инструменты, которые хотят участвовать в протоколе сервера задач, должны будут разобрать эту переменную среды и найти слово, начинающееся с --jobserver-auth=. Значение этого параметра будет описывать, как взаимодействовать с сервером задач. Интерпретация этого значения описана в следующих разделах.
Обратите внимание, что переменная MAKEFLAGS может содержать несколько экземпляров параметра --jobserver-auth=. Только последний экземпляр имеет значение.
Во-вторых, каждый запущенный make командой процесс имеет один неявный слот задачи, зарезервированный за ним перед запуском. Любой инструмент, который хочет участвовать в протоколе сервера задач, должен предполагать, что он всегда может запустить одну задачу, не обращаясь к серверу задач вообще.
Наконец, крайне важно, чтобы инструменты, участвующие в протоколе сервера задач, возвращали точное количество слотов, полученных от сервера задач, обратно серверу задач перед завершением работы, даже при возникновении ошибок. Помните, что неявный слот задачи не должен возвращаться серверу задач! Возврат слишком малого количества слотов означает, что эти слоты будут потеряны для остальной части процесса сборки; возврат слишком большого количества слотов означает, что дополнительные слоты будут доступны. Команда make верхнего уровня выведет сообщение об ошибке в конце сборки, если обнаружит неверное количество слотов, доступных в сервере задач.
В качестве примера, предположим, что вы реализуете компоновщик, который предоставляет возможность многопоточной работы. Вы хотите улучшить компоновщик, чтобы, если его вызывает GNU make, он мог участвовать в протоколе сервера задач, чтобы контролировать количество потоков, используемых во время компоновки. Сначала вам нужно будет изменить компоновщик, чтобы определить, установлена ли переменная среды MAKEFLAGS. Затем вам нужно будет разобрать значение этой переменной, чтобы определить, доступен ли сервер задач и как к нему получить доступ. Если он доступен, то вы можете получить доступ к нему, чтобы получить слоты задач, контролирующие, сколько параллелизма может использовать ваш инструмент. После этого ваш инструмент должен вернуть эти слоты обратно серверу задач.
| • Сервер задач POSIX | Использование сервера задач в системах POSIX. | |
| • Сервер задач Windows | Использование сервера задач в системах Windows. |
Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Job-Slots.html