Почему подобные Unix системы выполняют новый процесс при вызывании новой функции?

Необходимо будет загрузить необходимый источник Linux с kernel.org.
Установите средства разработки. Для, например, в Fedora

конфетка groupinstall "Средства разработки"
вкусная установка ncurses-devel
вкусный qt-devel установки

Затем untar исходный код и место это в/usr/src/kernels/
Затем войдите в источник и сделайте a

сделайте menuconfig

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

заставьте && сделать модули &&, делают modules_install &&, делают установку

Теперь проверьте свой grub.conf под/boot/grub/grub.conf и удостоверьтесь, что у Вас есть конфигурация для Вашего ядра в нем.

Теперь можно добавить программу, которая делает к изображению initrd.
initrd имеет функцию init... изменяют функцию init, для включения пользовательской функции.

2
01.05.2012, 17:00
1 ответ

Подобные Unix системы "не вызывают функции путем выполнения новых процессов". Они (теперь) совместно использовали библиотеки как в значительной степени все другие относительно современные операционные системы.

Оболочки, с другой стороны, выполняют другие процессы, чтобы сделать определенные задачи. Но не все. У них есть сборка - в функциях, реализованных непосредственно в оболочке (или через общие библиотеки) для наиболее распространенных и простых задач (echo например, реализован как встроенное большим количеством оболочек).
(Окна cmd оболочка не отличается от оболочек Unix в этом отношении, BTW.)

Создание процесса в современных подобных Unix системах является, конечно, более дорогим, чем выполнение незавершенного вызова функции, но не таким огромным полем. Ядра оптимизированы для быстрого разветвления, использования методов как копия на записи для управления адресным пространством для ускорения "клонирования" процессов и совместного использования текста (код) страницы динамических библиотек.

Если каждый исполняемый файл на Вашей машине, которую можно было бы назвать из сценария оболочки, был реализован как общая библиотека, также:

  • запуск Вашей оболочки занял бы много времени (и память) только для загрузки всего этого впереди (даже с кэшированием, у динамического компоновщика есть нетривиальная работа, чтобы сделать, и библиотеки имеют разделы данных, не только текстовые разделы - мы говорим сотни если не тысячи библиотек здесь),
  • необходимо было бы загрузить каждую необходимую библиотеку, по запросу – возможно немного быстрее, чем запуск процесса, но преимущество здесь является действительно тонким. И часть данных Ваших общих библиотек становится действительно твердой справиться (глобальное состояние Вашей оболочки теперь зависит от состояния большого количества несвязанного кода и данных, загруженных в его адресном пространстве).

Таким образом, Вы, вероятно, не получили бы много для типичного использования, и устойчивость/сложность становится большим количеством проблемы.

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

Что-то еще: ниже связь. Когда я смотрю на то, что находится в моем /usr/bin каталог прямо сейчас, я имею:

  • Исполняемые файлы ELF 64 битов,
  • Исполняемые файлы ELF 32 битов,
  • Сценарии Perl,
  • Сценарии оболочки (некоторые из тех запущенных программ Java),
  • Ruby пишет сценарий и
  • Python пишет сценарий

... и у меня, вероятно, нет самой необычной системы там. Вы просто не можете смешать первые два типа в том же процессе. Наличие интерпретатора, незавершенного для всех других просто, не практично.
Даже при рассмотрении только "собственного двоичного" формата файла имение интерфейса между "утилитами", являющимися простыми потоками и кодами выхода, делает вещи более простыми.
Единственные требования к утилитам состоят в том, чтобы реализовать ABI операционной системы и системные вызовы. Вы не получаете (почти) зависимости между различными утилитами. Это или чрезвычайно трудно, или невозможная плоскость, для незавершенного интерфейса, если Вы не налагаете вещи как "все, должен быть скомпилирован с версией X компилятора Y, с такой и такие флаги/настройки.

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

14
27.01.2020, 21:49
  • 1
    Очень хороший ответ, особенно точка о фатальной ошибке в библиотеке, изолируемой от родительского процесса. –  Patrick 01.05.2012, 15:16
  • 2
    Очень хороший ответ, особенно точка о фатальной ошибке в библиотеке, изолируемой от родительского процесса. –  Patrick 01.05.2012, 15:16

Теги

Похожие вопросы