среда, 21 июля 2010 г.

Почему в Windows есть широковещательная рассылка?

Это перевод Why are there broadcast-based mechanisms in Windows? Автор: Реймонд Чен.

Многие механизмы получения информации в Windows основаны на широковещательной рассылке сообщений, среди них: DDE, WM_FONTCHANGE и смена настроек. Почему эти механизмы используют широковещательную рассылку, если мы знаем, что она может привести к заморозке системы из-за того, что какое-то окно не обрабатывает сообщения?

Потому что в 16-ти битной Windows у вас не было этой проблемы.

Вспомните, что 16-ти битная Windows была системой с кооперативной многозадачностью. Когда программа получала в своё распоряжение процессор, она могла делать что угодно, зная, что никакая другая программа не может выполняться, пока она явно не отдаст контроль за процессором вызовом функции типа GetMessage или PeekMessage. Конечно же, недостаток такой модели в том, что если зависнет одна программа, то зависнет и вся система - потому что зависшая программа никогда не отдаст процессор.

Однако, было и преимущество: если ваша программа работала, то вы знали, априори, что в системе не было зависших программ. Как вы могли это знать? Потому что если бы были зависшие программы, то сейчас бы работали они, а не вы.

Если вещь существует в единственном экземпляре и она у вас, то вы знаете, что ни у кого ещё её нет.

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

Конечно же, когда мы перешли к вытесняющей многозадачности, это предположение больше не работало, но тогда было уже слишком поздно. Широковещательные рассылки уже использовались повсеместно в системе и, соответственно, должны были быть сохранены по соображениям совместимости (было бы ужасно, если бы, скажем, Lotus 1-2-3 перестал работать на Windows NT, потому что DDE более не поддерживался. Если бы команда Windows NT попробовала бы разыграть этот гамбит, то никто не перешёл бы Windows NT, и она не выжила бы, чтобы сделать второй раунд).

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

11 комментариев:

  1. Анонимный22 июля 2010 г., 14:41

    Вижу в комментариях вполне уместный вопрос - почему они не ограничили такие компоненты подсистемой Win16.
    p.s. OpenID в ЖЖ похоже отвалился. :(

    ОтветитьУдалить
  2. Там же в комментах дан и ответ: в Win32 есть другие механизмы для достижения этой цели, которые новые и не имеют таких проблем. К примеру, COM, OLE, etc. Жаль, что их не использовали.

    А если вопрос в том, почему форсированно не запретили Win32 так делать, то (по-моему) ответ очевиден: обратная совместимость.

    Win16-программа зарегистрирована как открывалка файлов .xyz через DDE. Если вы заблокируете широковещательную рассылку - вы не сможете открыть файлы .xyz. Потому что Проводник - 32-х разрядное приложение и (чтобы открыть .xyz) ему нужно использовать DDE, что включает в себя широковещательную рассылку, которую... вы запретили ему делать.

    Результат: программа работала, вы обновились на Windows 95 -> программа не работает. "Не обновляйтесь на Windows 95, на ней не работает программа XYZ! Это заговор Microsoft!"

    P.S. Кроме того, ещё и потому, что программы должны были переноситься в Win32 с минимальными изменениями. В идеале - простой перекомпиляцией кода.

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

    Это снова проблема выживания до версии 2.

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

    ОтветитьУдалить
  3. >>> p.s. OpenID в ЖЖ похоже отвалился. :(

    Не оно?

    ОтветитьУдалить
  4. P.S. Ещё это нельзя сделать, потому что 16-ти разрядные приложения взаимодействуют с 32-х разрядными.

    К примеру, это же является причиной, почему у вас не может быть больше 65'536 окон в системе (потому что иначе 16-ти битные программы не смогут получить доступ к некоторым окнам).

    ОтветитьУдалить
  5. Анонимный23 июля 2010 г., 13:57

    > Не оно?

    Вероятно, хотя мой аккаунт не переименовывался.

    > Ещё это нельзя сделать, потому что 16-ти разрядные приложения взаимодействуют с 32-х разрядными.

    Да, это самый серьёзный аргумент. Остальное более или менее разруливается. Например, explorer мог бы уникально пользоваться dde через недокументированный API.

    ОтветитьУдалить
  6. >>> Остальное более или менее разруливается.

    И как же разруливается перенос программы с Win16 на Win32?

    >>> Например, explorer мог бы уникально пользоваться dde через недокументированный API.

    Во-во, скажите это разработчикам альтернативных оболочек.

    ОтветитьУдалить
  7. Анонимный26 июля 2010 г., 14:04

    > И как же разруливается перенос программы с Win16 на Win32?

    По крайней мере частичным переписыванием на Win32 API. В конце концов - кто от этого выиграл? Авторы программ, которые легко перекомпилировали их на Win32 и получили неустранимые глюки?

    P.S. Почему-то заменить VBX на OCX не постеснялись, не дрогнула рука перед зарезанием обратной совместимости.

    > Во-во, скажите это разработчикам альтернативных оболочек.

    Решается дополнением "только программа, запущенная как оболочка". Хотя и это не нужно. Сколько людей пользуется альтернативными оболочками? Менее сотой процента пользователей? Скольким из них нужны 16-битные приложения? Как-то с трудом представляется, что человек, установивший себе "талисман" запускает шестой ворд. :)

    ОтветитьУдалить
  8. >>> По крайней мере частичным переписыванием на Win32 API

    Ещё раз: заставите переписывать - никто не будет этого делать. Почему вы предлагаете решения, которые очевидно не будут работать?

    Пример у вас перед глазами - в своё время люди перешли на Windows 3.0. Почему на 3.0? Почему не на 1.0? Почему не на 2.0? Потому что у Microsoft заняло несколько версий всё сделать нормально (как об этом любят покричать)? Нет. Потому что только ко времени Windows 3.0 появились процессоры Intel 80386, поддерживающие новые возможности виртуализации, что позволило нормально запускать DOS-программы, не требуя их переписывания под Win16.

    Требовать переписывания - мёртвый путь. Это не будет работать. Это может и работает у Apple (я не очень в курсе), но у Microsoft - нет. И в истории полно этому примеров.

    >>> Авторы программ, которые легко перекомпилировали их на Win32 и получили неустранимые глюки?

    Вы забываете про контекст. В 95-м году ещё не было никаких кривых программ, которые не учитывали бы DDE, и могли подвешивать широковещательные рассылки, засыпая в своих потоках надолго. Да, программа могла просто повиснуть и вы получали свой глюк. Но даже это - всё равно, лучше, чем было: в Win16 зависшая программа означала зависшую систему. Теперь - нет. Тогда DDE был ещё достаточно хорош. Да, он не был безгрешен в мире Win32 (зависание одной программы влияло на другую), как это было бы с другим, более современным интерфейсом, но даже так он показывал лучшие результаты, чем в Win16.

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

    >>> В конце концов - кто от этого выиграл?

    Авторы программ получили возможность сделать перенос программ в Win32 за бесплатно.

    Microsoft получила и разработчиков под Win32 и приложения под Win32 (хорошо: портированные приложения под Win32, но всё же: родные Win32 приложения).

    Пользователи получили кучу родных (а значит: красиво выглядящих) приложений (хорошо: портированных в Win32), который успешно работали.

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

    ОтветитьУдалить
  9. (в один коммент ответ не влез)

    >>> Менее сотой процента пользователей?

    Эк вы здорово принизили пользователей FAR-а и Total Commander-а.

    >>> Скольким из них нужны 16-битные приложения?

    В 95-м году, когда вышла Windows 95 - абсолютно всем. Других программ же не было!

    >>> Как-то с трудом представляется, что человек, установивший себе "талисман" запускает шестой ворд. :)

    В данном случае, "альтернативная оболочка" - это любая программа, открывающая файлы.

    >>> Почему-то заменить VBX на OCX не постеснялись, не дрогнула рука перед зарезанием обратной совместимости.

    К сожалению, я не в курсе этого вопроса. Однако, смею заметить, что приложение одной разрядности просто не может загрузить библиотеку другой разрядности. Не в этом ли дело? (да, с определённой точки зрения, Win32 программа могла загрузить 16-ти разрядный модуль, но там для этого требовался хитро оформленный переходник. Это не подходит для компонент общего назначения)

    В любом случае, я могу вам назвать ещё примеры, когда обратная совместимость не соблюдается. Пример 1: любые DOS программы, использующие недокументированные особенности системы или слишком вольно работающие с оборудованием. Я уверен, что все в курсе, сколько народу кричало про то, какие Microsoft плохие, что их любимая программа не работает в Windows. Пример 2: отказ от GINA в Vista.

    Мне кажется, достаточно очевидно, что обратная совместимость не может быть абсолютной. Всегда найдётся момент, который вы не покрываете. Когда вы не предоставляете обратную совместимость по какому-то моменту - либо это невозможно (первый пример выше с DOS-программами), либо на это есть веская причина (второй пример выше с GINA), либо недосмотр/ошибка (невозможно предусмотреть всё/humans make mistakes, ya know?).

    Краткий пересказ нашего диалога:
    - Почему всё так криво?
    - Это обратная совместимость.
    - Это ужасно, почему нельзя было сделать так?
    - Это не стало бы работать. Обратная совместимость - это хорошо.
    - Ага! А вот тут вы её не соблюдаете!
    - То вы ругаетесь, что она вообще есть, а теперь на то, что где-то её нет?

    Да вам не угодишь.

    Вы же программист. Что, вам никогда не приходилось использовать компромиссы? Trade size for speed, к примеру? Операции с деревьями, одни из которых вы можете сделать быстрыми, но только за счёт других? Постоянно ведь бывают ситуации, когда вы не можете получить всё сразу.

    Поэтому несколько удивительно, как тяжело люди воспринимают такие компромиссы в другой плоскости: между популярностью платформы и чистотой её программ.

    P.S. На самом деле, когда я говорю "вы", я даже, скорее, имею ввиду не вас лично, а всех, кто имеет подобную же точку зрения (а таких вообще не мало). Поэтому, пожалуйста, не воспринимайте сказанное за "персональный наезд" или что-то такое.

    ОтветитьУдалить
  10. Анонимный27 июля 2010 г., 13:06

    > В 95-м году, когда вышла Windows 95 - абсолютно всем. Других программ же не было!

    Ну, 16-битные с 16-битными не имели бы проблемм. Ведь их подсистема-то осталась.

    > да, с определённой точки зрения, Win32 программа могла загрузить 16-ти разрядный модуль, но там для этого требовался хитро оформленный переходник.

    Помню этим вопросом в то время все уши прожужжали. Прямо складывалось впечатление, что более важных дел не было. :)

    > Что, вам никогда не приходилось использовать компромиссы?

    Дык, сам же упоминал, что использовал DDE для обмена с Excel.

    > Поэтому, пожалуйста, не воспринимайте сказанное за "персональный наезд" или что-то такое.

    Да я и не воспринимаю. В конце концов, вы только переводите. "Мопед не ваш". :)

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.