Обратите внимание на формулировку в руководстве Bash :«все переменные помечены для экспорта». Под «средой» процесса мы подразумеваем то, что передается в параметре envp
системного вызова execve
, и только то, что передается через этот параметр. Остальное просто иллюзия. Вызывающий процесс (оболочки или любой другой тип процесса )может делать с полученными переменными все, что захочет, в соответствии с документально подтвержденным поведением. Он может передать полученные переменные подпроцессу или не делать этого.
Во всем этом я стремлюсь к тому, чтобы не было волшебного блока переменных среды, который автоматически передается в тени от родительского процесса к его дочерним. Родительский процесс может делать со своим «окружением» все, что захочет, разбивать его на части, шифровать в памяти, копировать по какому-то другому адресу в пространстве процесса (, что делает Bash )и т. д. Не может быть быть каким-либо внешним механизмом или механизмом ядра для проверки окружения процесса (ждать — читайте комментарий к /proc/PID/environ
ниже ). Единственное, что имеет значение, это то, что экспортирующий процесс должен собирать кусочки и передавать среду своим дочерним процессам в соответствии со своими собственными правилами; в случае Bash правила перечислены в руководстве Bash.
Это означает, что файл /proc/$$/environ
вводит в заблуждение. Он не отражает никаких изменений в окружении оболочки, а просто сообщает, что получила оболочка, когда она была exec
изменена родительским процессом.
Вот факторы, которые приходят мне в голову:
Что касается Clear Linux, они гордятся:
Использование полного набора инструкций, который может предложить ЦП, оказывает значительное влияние.
Для сравнения, Arch Linux (и Manjaro )поставляют ядро, библиотеки и исполняемые файлы, скомпилированные с помощью GCC, для универсального 64-битного -x86-процессора(-march=x86-64 -mtune=generic
). Это дает хорошую производительность, но не такую хорошую, как исполняемые файлы, скомпилированные специально для процессора, на котором они работают.
Использование инструмента elfx86exts в /usr/bin/ls
в Arch Linux показывает, какие инструкции ЦП необходимы, как минимум:
$ elfx86exts /usr/bin/ls
MODE64 (call)
CMOV (cmovne)
SSE2 (movdqa)
SSE1 (movups)
CPU Generation: Intel Core
У меня не было возможности попробовать то же самое в Clear Linux, но я предполагаю, что появится более длинный список инструкций.
Подводя итог, исправление ядра и настройка конфигурации ядра дают хорошие результаты, но, что более важно, поддержка доступных инструкций ЦП имеет большое значение.
Прирост производительности от ручной настройки флагов компиляции сильно переоценен. И стоимость не -тривиальна (, если вы скомпилируете одну конфигурацию, адаптированную для вашей машины, я другую для своей, любые ошибки, на которые вы наткнетесь, будут только вашими, вероятно, у меня будет свой собственный набор, за одного ).
Возьмите книгу Бентли «Написание эффективных программ» (, к сожалению, давно вышедшую из печати )или его «Жемчужины программирования» (, 2-е издание ). Реального прироста производительности добиться гораздо труднее, и он на порядки выше.