5

У меня есть встроенное устройство под управлением Linux.

Я пытаюсь ускорить последовательность загрузки. Будет ли ускорение переписывания больших частей последовательности загрузки на C?

например, у меня есть много скриптов, которые проверяют то или иное, а затем монтируют то или иное. Это /etc/rcS.d/S03sysfs

#!/bin/sh

if [ -e /proc ] && ! [ -e /proc/mounts ]; then
  mount -t proc proc /proc
fi

if [ -e /sys ] && grep -q sysfs /proc/filesystems; then
  mount sysfs /sys -t sysfs
fi

exit 0

Я думаю, что если бы это было в C, это было бы намного быстрее, верно?

Мои вопросы :

Почему это не в C?
Будет ли увеличение скорости, чтобы написать это в C?

3 ответа3

9

Это было бы несколько быстрее в C, но выбор языка не так сильно влияет на производительность. Как правило, более эффективно выполнять различные задачи параллельно, а не ждать, пока они не будут выполнены последовательно, как это делают более простые системы инициализации. Например, sshd и httpd могут быть запущены одновременно, поскольку ни один из них не требует, чтобы другой уже был запущен.


Не существует единой "последовательности загрузки Linux". Каждое распределение имеет свое собственное; у них нет даже ничего общего. Это может быть C, Perl, Haskell, что угодно; единственное требование - чтобы исполняемый файл с именем /init присутствовал в initramfs, или /sbin/init в корневой файловой системе.

Схема /etc/rc?.d является просто продолжением процесса загрузки Unix 20 лет назад, может быть, даже 30 лет. Самые ранние системы Unix перезагружались довольно редко, поэтому у них был простой скрипт /etc/rc или аналогичный, который запускался init и запускал различные демоны последовательно.

Даже сегодня SysV init используется для запуска всех таких сценариев, хотя точный метод может отличаться. Первоначально система запускала все сценарии в /etc/rc?.d по порядку; в настоящее время Debian использует зависимости в стиле Makefile.

Некоторые дистрибутивы - Ubuntu, Chrome OS, Fedora до версии 14 - переключились на Upstart, который написан на C и «основан на событиях», позволяя запускать демоны параллельно. Другая система инициализации, systemd, быстро растет в популярности - она используется по умолчанию в Fedora и OpenSuSE. Это также написано на C. (Обе системы все еще читают текстовые файлы конфигурации, чтобы решить, какие демоны должны быть запущены.)

Те дистрибутивы, которые все еще придерживаются SysVinit, обычно делают это для "простоты"; наиболее часто встречающиеся аргументы [нужда в цитировании], по-видимому, касаются того, что скрипты оболочки проще поддерживать, чем эквивалентный код на С (хотя упомянутые скрипты оболочки состоят из 90% копий), а также смертельный страх введения дополнительных библиотечных зависимостей [субъективных]. Вы можете убедиться в этом, этом, этом и этом обсуждении в списке рассылки Debian от мая 2012 года.

(Отказ от ответственности: я сам системный пользователь.)

5

Почему это не в C?

Для кросс-платформенной совместимости и потому, что она позволяет использовать sh-файлы для описания процесса загрузки. Поддерживать загрузочные скрипты на C было бы PITA.

Будет ли увеличение скорости, чтобы написать это в C?

Немного. Хотя некоторые части будут быстрее, общее увеличение скорости будет незначительным. Большая часть процесса загрузки строго последовательная, особенно шаги в init 1 и 2. Начиная с версии 3 и выше, процессы загрузки могут быть паралеллизированы с использованием чего-то вроде Runit, что даст вам большой прирост скорости.

2

Большая часть того, что он тратит на это время, - это ожидание чего-то одного за другим: файловых систем, сетей и т.д.

Если вы хотите действительно быструю последовательность загрузки, загрузитесь с помощью init =/bin/sh - мгновенная командная строка! Если это встроенная система, вы можете загрузить ее прямо в свое приложение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .