fork() и все-все-все

From
Denis Sotchenko (2:5020/118.112)
To
Boris Rudakov ()
Date
2003-06-09T09:12:32Z
Area
CARBON.COPY
 * Forwarded from area 'RU.UNIX.PROG'
Kак-то раз 08 Jun 03 Boris Rudakov написал(a) для меня следующее:

 BR> 1.  Как под i386 в юниксах отрабатываются хардверные (т.е.
 BR> не те что throw) эксепшины?

     Честно говоря, я от C++ и его понятия эксепшенов далёк.  А на хардверные
приходят сигналы: на кривую инструкцию - SIGILL, на попадание не туда - SIGSEGV
и так далее.  Если процесс не повесил обработчик на сигнал - его ждёт
неминуемая смерть, если повесил - получит управление указанная функция. 
Кстати, так юниксы ведут себя на любом проце.

     Или мы о разных вещах?  Со спецификой i386 я не знаком, у меня на
настольной машине вообще не x86...

 BR> 2. Как это делает (если делает) Гнусь

     а это не задача компилятора, это задача libc.  обычные функции.

 BR>>> форка (который есть неконцептуальное зло и пережиток)
 DS>> Обоснуй.
 BR> Лехко !!!
 BR> Форком юзаются чтобы распараллелить вычисления - один процесс
 BR> побег по одной ветке, а его клон ломанулся по другой.  В момент
 BR> форкания создается ИДЕНТИЧНЫЙ клон - копия памяти, дубликаты
 BR> хендлов.  НАХЕРА ?????

     Налицо концептуальное непонимание =)

     Фундаментальной (хорошее слово...:) фичей юниксов является такая вещь, как
COW.  И это не корова, а Copy-On-Write.  Когда процесс форкается,
процесса-клона мапится туда же.  Соответственно, памяти клон будет кушать ровно
столько же.  До тех пор, пока не попытается её менять - тут и сработает COW,
изменённые страницы будут скопированы и изменены.  То бишь, те участки памяти,
которые не менялись, в памяти не дублируются.  Хотя для самого процесса это
выглядит именно как "копия памяти".

     А дубликаты хэндлов, как ты их называешь (в юниксах это дескрипторы) нужны
хотя бы для того, чтобы был общий stdin/stdout/stderr.  Иногда требуется и
большее - чтение одного и того же файла, например.

 BR> Реально ведь склонированному процессу ВСЕГО ЭТОГО - НЕ НУЖНО,

     Бывает, что нужно, бывает, что не нужно.  Не нужно - ну не используй,
какие проблемы?  Каши не просит же.

 BR> Ну и плюсом к этому безобразию еще один disadvantage -
 BR> усложняется взаимодействие между родителем и клоном.
 BR> IPC надо.

     Никто тебе не мешает пользоваться нитями.

     Форки хороши ещё возможностью, например, более надёжных решений, когда это
требуется.  Упал один из клонов - ну упал, и всё, отвалился один клиент от
сервера.  Упала нить - упал процесс, рухнули все клиенты.  Вот работу с одним
клиентом делать на нитях совершенно безопасно.

     А когда есть *только* нити - это уж звиняйте, ограничение какое-то
(примечание: данное слово в моих устах является ругательством).  640 килобайт
хватит всем?

 BR> И вот ведь забавная штука: это не исключение, это ПРАВИЛО
 BR> что линуксоидные сырцы нашпигованы ляпами по самые яйца !!!

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

     А что касается мира closet... тьфу, closed-source - не знаю, что там
творится.  Но судя по тому, как ненадёжно большинство программных продуктов из
этой ниши - творится там что-то очень нехорошее.

    __
 __/ /   Powered                                 [pepsi inside]
 \_\/  by MOTOROLA                               [smoking suxx]

--- rdc#lanport.ru http://rdc.lanport.ru/
 * Origin: Куплю "Дихлофос" или продам тараканов (2:5020/118.112)