OSDev

для всех
Текущее время: 18 ноя 2017, 18:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Fork
СообщениеДобавлено: 25 май 2011, 10:10 
Аватара пользователя

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
Hello world!

Как всегда, извиняюсь за глупый вопрос.
Сейчас читаю Таненбаума для общего развития.
И по прочтению первой главы возник первый вопрос.
В чем смысл такого сложного вызова программ через fork+exec? Почему нельзя просто ExecuteFile, как в Wingdows?
Это просто для совместимости? Или для каких-нибудь финтов ушами? Или это - очень важная часть механизма защиты?
(Я имел не так много дел с *nixами, так что если совсем глупость ляпнул - извините)

Спасибо.

_________________
Found a CPU. LAPIC ID: 00


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Fork
СообщениеДобавлено: 25 май 2011, 11:46 

Зарегистрирован: 04 май 2011, 18:13
Сообщения: 121
Это желание левой пятки Таненбаума. :)

форк делает разветвление процесса. Это такая простая идея потоков и процессов в nix системах.
После вызова этой функции, текущий процесс с его стеком, данными, кодом клонируется и запускается на выполнение на команду после форка. А тем временем в оригинальном родительском процессе тоже происходит возврат, но уже обычный.
Такой финт позволяет держать все процессы например в менеджере процессов. Это как файл svchost.exe в Windows он в себе в буквальном смысле содержит другие exe программы. Ну это конечно мое грубое описание.

На самом деле так могло и не быть.

Таненбаум рекламирует свою ОСь в своей книге.
Ты почитай из его книги выборочно про файловые системы, планирование задач, методико разделение на компоненты, что такое микроядро. И начинай сам потихоньку писать свою ось. Так будет познавательней.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Fork
СообщениеДобавлено: 25 май 2011, 13:07 
Аватара пользователя

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
StasBaybak - спасибо.
Но если писать свою ОСь без Форка - насколько это хуже (я не про стандарты)?
Что меня больше всего с форком смущает - пусть программа А запускает программу Б
при виндовской загрузке:
загрузить и запустить Б
через Форк:
скопировать данные программы А в процесс А1(куча времени!)
загрузить и запустить Б на место А1
Если программа А - гигант типа фотошопа, а Б - калькулятор :-???
А если оперативки на компе не хватает на вторую копию данных А, но хватает на целую программу Б, Б не загрузится?

_________________
Found a CPU. LAPIC ID: 00


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Fork
СообщениеДобавлено: 25 май 2011, 14:45 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1314
Откуда: Зеленоград
Такого гениТального вызова, как форк, в других встречавшихся мне осях (а их немало было) не попадалось. Были системы, где такое организовать в принципе невозможно, были -- где возможно, причём более гибко, но для запуска нового процесса (задачи) у всех у них были нормальные вызовы, а не это извращение.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Fork
СообщениеДобавлено: 25 май 2011, 15:13 
Аватара пользователя

Зарегистрирован: 20 апр 2011, 10:54
Сообщения: 145
Действительно, извращение...
Спасибо большое!

_________________
Found a CPU. LAPIC ID: 00


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Fork
СообщениеДобавлено: 25 май 2011, 17:39 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
fork() в *NIX системах применяется как метод передачи от родительского процесса дочернему дескрипторов открытых файлов. В родительском процессе может быть создан либо pipe либо 2 соединенных сокета. Затем выполняется fork(), дескрипторы доступны и в родительском и в child процессе. В итоге, то что пишется в родителе доступно в child-е и наоборот. По необходимости. Но у fork() есть недостатки. Child процесс наследует не только дескрипторы, но и, к примеру, копию всего сегмента данных родительского процесса. В итоге, если появляется цепочка порожденных процессов, то как правило, child-процессы становятся все больше и больше. В книге Цирюлика "Анатомия параллелизма" проводился эксперимент. Сколько процессов может быть порождено в QNХ, с помощью fork(). Делался вывод, что мало. Я проанализировал пример и обнаружил что у него в примере fork() вызывался постоянно не в родительском, а в child процессе. Видимо в реализации fork() производятся какие-то распределения памяти.... В итоге порожденный процесс с каждым разом становится больше и больше. Тест с перенесенным повторным fork() в родителя дает совершенно иной результат. Такой же эффект, справедливости ради, наблюдается не только в QNX. Т.о. если вы используете связку fork() - exec() то все порождения по возможности должны делаться из одного процесса. И второе. Ввиду описанных проблем ряд операционок предлагают разновидности версий fork() типа vfork() и т.д. Это приводит к зоопарку. fork() в целом, конечно нужен, если вы реализуете UNIX-совместимую систему. Если же о совместимости речи не идет, то делать можно что угодно.

Статья про эксперимент с fork().


Последний раз редактировалось achesnokov 25 май 2011, 21:22, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Fork
СообщениеДобавлено: 25 май 2011, 20:13 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1025
Откуда: Балаково
Полагаю, что проблема с fork в том, что при отложенном разделении памяти (копирование при записи) требуется, чтобы копируемые для потомка данные были теми, которые были на момент вызова fork. А ведь родитель свои данные мог и изменить к этому времни (наверно это так и происходит), поэтому при создании множества потомков, система должна выполнять дополнительное резервирование памяти для хранения "оригинальных" данных родителя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Fork
СообщениеДобавлено: 26 май 2011, 13:16 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 938
Откуда: Дагоба
418ImATeapot писал(а):
через Форк:
скопировать данные программы А в процесс А1(куча времени!)
загрузить и запустить Б на место А1
Если программа А - гигант типа фотошопа, а Б - калькулятор :-???

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

Himik писал(а):
Полагаю, что проблема с fork в том, что при отложенном разделении памяти (копирование при записи) требуется, чтобы копируемые для потомка данные были теми, которые были на момент вызова fork. А ведь родитель свои данные мог и изменить к этому времни...

Системный вызов fork блокирует работу родителя до завершения копирования. Так что в смысле целостности данных всё должно быть ОК. Не ОК заключается в том, что два процесса разделяют общий доступ ко внешним данным/ресурсам и здесь надо тщательно следить, чтобы не было накладок ни в процессах, ни в ОС.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB