Почему мы должны разветвиться для создания новых процессов?

Ссылающийся домен передается как часть заголовка запроса. Wget печатает его при включении отладки с -d. Затем используйте grep для нахождения "referer" (обратите внимание, что вывод отладки, вероятно, записан в stderr).

96
25.11.2018, 16:14
7 ответов

Размещение другого решения, так как файл написан случайным образом, ломает мою хвостовую идею. Мысль rsync может быть многообещающей здесь, поскольку rsync может работать с использованием алгоритма дельта-передачи, экономя время передачи, только отправляя измененные части файла. При запуске rsync для двух локальных файлов по умолчанию используется режим --whole-file , который не является нужным.

Предложение

rsync -av --inplace --no-whole-file /your/local/file.dat /your/remote/file.dat

... или (если монтирование CIFS не согласовано с дельта-передачей) используйте чистый rsync :

rsync -av --inplace --no-whole-file /your/local/file.dat remoteserver:/your/directory/file.dat

Поэтому вы бы запустили это несколько раз, пока ваш файл 200 ГБ наполнять. Каждый раз, когда вы запускаете его, он постепенно обновляет удаленный файл. Это должно работать даже при случайном обновлении исходного файла. Может, ты сможешь запустить это каждые 15 минут. Затем, когда ваш pid заканчивается, вы будете запускать его еще раз, и это будет просто быстрая инкрементная дельта.

-121--83288-

Когда вы используете /etc/passwd и /etc/shadow для учетных записей пользователей (как указано в /etc/nsswitch.conf и PAM), то записи в этих двух файлах вполне достаточно для создания учетной записи. (/etc/group также может потребоваться для их групп).

Все действия useradd заключаются в изменении этих файлов. Если вы сами отредактируете их с помощью vipw & vigr и добавите пользователя, вы создадите учетную запись.

useradd также (необязательно) создаст домашний каталог, в основном выполняя следующие действия:

cp -p /etc/skel /home/newuser
chown -R newuser:newgroup /home/newuser

Это говорит, что без домашнего каталога ваши пользователи столкнутся с большим количеством проблем, поскольку там хранится много файлов -

  • Файлы конфигурации редактора
  • Авторизованные ключи для ssh
  • Сценарии запуска оболочки
  • Файлы конфигурации случайных программ

Можно установить все их домашние каталоги в один корневой метод 0755 (не может быть записан пользователями) с разумными значениями по умолчанию

-121--161597-

Короткий ответ: вилка находится в Unix, потому что она была легко вписана в существующую систему в то время, и потому, что система-предшественница в Беркли использовала концепцию вилок.

Из Эволюция системы разделения времени Unix (соответствующий текст выделен ):

Управление процессом в его современном виде было разработано и реализовано в течение пары дней. Поразительно, насколько легко она вписывается в существующую систему; в то же время легко увидеть, как некоторые из немного необычных особенностей дизайна присутствуют именно потому, что они представляли собой небольшие, легко кодированные изменения того, что существовало . Хорошим примером является разделение функций вилки и exec. Наиболее распространенная модель создания новых процессов включает в себя определение программы для выполнения процесса; в Unix форсированный процесс продолжает выполнять ту же программу, что и родительский процесс, пока не выполнит явное выполнение.Разделение функций, конечно, не является уникальным для Unix, и фактически оно присутствовало в системе разделения времени Беркли, которая была хорошо известна Томпсону . Тем не менее, представляется разумным предположить, что он существует в Unix главным образом из-за простоты, с которой вилка может быть реализована, не изменяя многое другое . Система уже обработала несколько (т.е. два) процессов; имелась таблица процессов, и процессы менялись местами между основной памятью и диском. Первоначальное внедрение вилки требовало только

1) Расширение таблицы процессов

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

Фактически вызов вилки PDP-7 требовал точно 27 строк кода сборки. Конечно, требовались и другие изменения в операционной системе и пользовательских программах, причем некоторые из них были довольно интересными и неожиданными. Но комбинированная форк-exec была бы значительно сложнее хотя бы потому, что exec как таковой не существовал; его функция уже выполнялась, с использованием явного ввода-вывода, оболочкой.

С тех пор, как эта статья, Unix эволюционировал. форк , за которым следует exec , больше не является единственным способом запуска программы.

  • vfork был создан в качестве более эффективной вилки для случая, когда новый процесс намерен выполнить exec сразу после вилки. После выполнения vfork родительский и дочерний процессы совместно используют одно и то же пространство данных, и родительский процесс приостанавливается до тех пор, пока дочерний процесс не выполнит программу или не завершит работу.

  • posix _ spawn создает новый процесс и выполняет файл в одном системном вызове. Требуется набор параметров, позволяющих выборочно предоставлять общий доступ к открытым файлам вызывающего абонента и копировать в новый процесс его параметры обработки сигналов и другие атрибуты.

62
27.01.2020, 19:30

Я думаю, что причина, по которой Unix имел только функцию fork для создания новых процессов, является результатом философии Unix

Они строят одну функцию, которая делает одно хорошо. Она создает дочерний процесс.

Что делать с новым процессом, зависит от программиста. Он может использовать одну из функций exec* и запустить другую программу, или же он не может использовать выполнение и использовать два экземпляра одной и той же программы, что может быть полезно.

Таким образом, вы получаете большую степень свободы, поскольку можете использовать

  1. fork без exec*
  2. fork с exec* или
  3. просто exec* без fork

и, кроме того, вам нужно будет запомнить только вызовы fork и exec* функции, которые в 1970-х годах вам приходилось делать.

6
27.01.2020, 19:30

Функция fork() не только копирует процесс-родитель, но и возвращает значение, указывающее на то, что процесс - это процесс-родитель или процесс-потомок, изображение ниже объясняет, как можно использовать функцию fork() как процесс-родитель и процесс-потомок:

enter image description here

, как показано на рисунке, когда процесс является родительским процессом fork() возвращает идентификатор дочернего процесса PID, в противном случае он возвращает 0

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

SO, ни один запуск копии процесса не является точной вещью, как fork().

2
27.01.2020, 19:30

[Я повторю часть своего ответа из здесь .]

Почему бы просто не иметь команду, которая создает новый процесс с нуля? Разве не абсурдно и неэффективно копировать тот, который будет заменен сразу же?

На самом деле, это, вероятно, не так эффективно по нескольким причинам:

  1. «Копия», созданная fork () - это немного абстракция, поскольку ядро ​​использует систему копирования при записи ; все, что действительно нужно создать, - это карта виртуальной памяти. Если копия затем немедленно вызывает exec () , большая часть данных, которые были бы скопированы, если бы они были изменены активностью процесса, никогда не нужно копировать / создавать, потому что процесс ничего не делает. требуя его использования.

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

Чтобы объяснить №1 немного дальше, память, которая «копируется», но никогда не используется впоследствии, на самом деле никогда не копируется, по крайней мере, в большинстве случаев. Исключением в этом контексте может быть , если вы разветвили процесс, а затем родительский процесс завершился до того, как дочерний процесс заменил себя на exec () . Я говорю, что может , потому что большая часть родительского элемента может быть кэширована, если имеется достаточно свободной памяти, и я не уверен, в какой степени это может быть использовано (что будет зависеть от реализации ОС).

Конечно, это на первый взгляд не делает использование копии более более эффективным, чем использование чистого листа - за исключением того, что «чистый лист» не является буквально ничем и должен включать размещение. В системе может быть общий пустой / новый шаблон процесса, который она копирует таким же образом, 1 , но в этом случае на самом деле ничего не сохранит по сравнению с вилкой копирования при записи. Итак, №1 просто демонстрирует, что использование «нового» пустого процесса не будет более эффективным.

Пункт № 2 действительно объясняет, почему использование вилки, вероятно, более эффективно. Дочерняя среда наследуется от своего родителя, даже если это совершенно другой исполняемый файл. Например, если родительский процесс является оболочкой, а дочерний - веб-браузером, $ HOME по-прежнему одинаково для них обоих, но поскольку каждый из них может впоследствии изменить его, это должны быть две отдельные копии. Тот, что в дочернем, создается исходной fork () .

1. Стратегия, которая может не иметь большого буквального смысла, но я считаю, что создание процесса включает в себя нечто большее, чем просто копирование его образа в память с диска.

35
27.01.2020, 19:30

Существует две философии создания процесса: вилка с наследованием и создание с аргументами. Очевидно, что Unix использует fork.(OSE, например, и VMS используют метод create.) Unix имеет МНОЖЕСТВО наследуемых характеристик, и периодически добавляются новые. Посредством наследования эти новые характеристики могут быть добавлены БЕЗ ИЗМЕНЕНИЯ СУЩЕСТВУЮЩИХ ПРОГРАММ! При использовании модели create-with-arguments добавление новых характеристик будет означать добавление новых аргументов к вызову create. Модель Unix проще.

Он также предоставляет очень полезную модель fork-without-exec, в которой процесс может разделиться на несколько частей. Это было жизненно важно, когда еще не было формы асинхронного ввода-вывода, и было полезно при использовании нескольких процессоров в системе. (Предварительные обсуждения.) Я делал это много лет, даже в последнее время. По сути, это позволяет объединять несколько «программ» в одну программу, поэтому нет абсолютно никакого места для повреждения, несовпадения версий и т. Д.

Модель fork / exec также дает возможность конкретному потомку наследовать радикально странная среда, созданная между вилкой и exec. Особенно такие вещи, как унаследованные файловые дескрипторы. (Расширение stdio fd.) Модель create не предлагает возможности наследовать что-либо, что не было предусмотрено создателями вызова create.

Некоторые системы также могут поддерживать динамическую компиляцию собственного кода, когда процесс фактически пишет свою собственную программу с машинным кодом. Другими словами, ему нужна новая программа, которую он пишет на лету, БЕЗ необходимости проходить цикл исходного кода / компилятора / компоновщика и занимая дисковое пространство. (Я считаю, что существует языковая система Verilog, которая делает это.Модель вилки поддерживает это, а модель создания обычно нет.

5
27.01.2020, 19:30

Перенаправление ввода-вывода проще всего реализовать после fork и перед exec. Дочерний, зная, что он дочерний, может закрывать файловые дескрипторы, открывать новые, dup () или dup2 (), чтобы переместить их на правильный номер fd и т. Д., И все это не затрагивает родителя. После этого и, возможно, изменения любой желаемой переменной среды (также не затрагивающей родительский элемент), он может выполнить новую программу в адаптированной среде.

0
27.01.2020, 19:30

Я думаю, все здесь знают, как работает fork, но вопрос в том, зачем нам нужно создавать точный дубликат родителя с помощью fork? Ответ==>Взять пример сервера (без форка), в то время как клиент-1 обращается к серверу, если в то же время прибыл второй клиент-2 и хочет получить доступ к серверу, но сервер не дает разрешения вновь прибывшему клиенту-2, потому что сервер занят обслуживанием клиента-1, поэтому клиенту-2 приходится ждать. Теперь рассмотрим, если в это же время прибывает клиент-3, то клиент-3 должен ждать, пока не закончатся все услуги для клиента-2. Возьмем сценарий, когда тысячи клиентов нуждаются в доступе к серверу одновременно... тогда все клиенты должны ждать (сервер занят!!).

Этого можно избежать, создавая (используя fork) точную копию (т.е. дочернюю) сервера, где каждый дочерний сервер (который является точной копией своего родителя, т.е. сервера) предназначен для вновь прибывшего клиента, таким образом, одновременно все клиенты получают доступ к одному и тому же серверу.

-2
27.01.2020, 19:30

Теги

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