OSDev

для всех
Текущее время: 30 апр 2024, 05:48

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




Начать новую тему Ответить на тему  [ Сообщений: 179 ]  На страницу Пред.  1 ... 14, 15, 16, 17, 18  След.
Автор Сообщение
СообщениеДобавлено: 14 фев 2012, 00:17 

Зарегистрирован: 25 май 2010, 20:58
Сообщения: 136
Химик, ну почему только для событийной модели? Чем плохо её использование в объектных моделях на основе обмена сообщениями, да и в любых других? Можешь привести в пример хоть одну задачу, которую нельзя решить кооперативкой+сообщениями (как для однапроцессорных систем, так и для параллельных/распределённых)? Убеждён, что вытеснение нужно только для потоков реального времени. А его повсеместное использование во всех современных системах обосновано только обратной совместимостью костылей. Разве ни так?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 16:13 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Mr.McD. писал(а):
Химик, ну почему только для событийной модели? Чем плохо её использование в объектных моделях на основе обмена сообщениями, да и в любых других?

И объекты хорошо работают. В Windows большинство COM объектов выполняются в режиме Single-Threaded-Apartment. Это однопоточная событийная модель.

С параллельностью конечно тоже нет проблем. Действительно можно несколько кооперативных потоков запустить на нескольких процессорах, и они могут обычными средствами синхронизации обмениваться друг с другом сообщениями, выполняя общую задачу. Но сложности синхронизации тут точно такие же. Или ты хочешь отказаться от блокировок, используя только почтовый ящик сообщений? В системах с вытесняющей многозадачностью это тоже легко организуется, как Single-Threaded-Apartment, но при этом приложениям не требуется следить за разделением времени, за них это делает система - вот что хорошо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 17:30 

Зарегистрирован: 25 май 2010, 20:58
Сообщения: 136
Цитата:
http://www.introligator.org/articles/3/84
Однопоточные апартаменты.
В STA каждый поток, который использует OLE, находится в отдельном апартаменте и COM синхронизирует все входящие вызовы с помощью очереди оконных сообщений. Для этого COM неявно создает окно и при вызове любого метода объекта посылает этому окну сообщение с помощью функции PostMessage. (Функция PostMessage создает MSG структуру для сообщения и копирует ее в очередь сообщений окна.) Процесс с единственным потоком выполнения может служить иллюстрацией этой модели.
STA апартаменты имеют в точности один поток, так что все объекты, которые «живут» в однопоточном апартаменте, могут получать вызовы методов только от одного потока, который принадлежит этому апартаменту.
Главным достоинством апартамента STA является то, что разработка объекта COM и клиентской части проста в том смысле, что нет нужды заботиться о синхронизации вызовов методов и их выполнения: следующий метод начнет выполняться только после того, как закончится выполнение предыдущего. Аналогично не нужно заботиться о синхронизации доступа к данным объекта.
Главным недостатком апартамента STA является его неэффективность. Даже если синхронизация вызовов методов и не нужна, она все равно выполняется.

То-есть, не неэффективность, а аналогичная эффективность апартаменту МТА, при возможной большей эффективности. С такой реализацией вся соль пропадает..
Но, не смотря на это..
Цитата:
Несмотря на это, предпочтительнее всегда использовать апартамент STA за исключением тех случаев, когда реализация конкретного сервера в рамках модели STA попросту невозможна.

Чем ближе знакомлюсь с СОМ, тем больше различных "НО" и "ЕСЛИ". Погуглю, пожалуй..
Himik писал(а):
Или ты хочешь отказаться от блокировок, используя только почтовый ящик сообщений?

Видел у Танненбаума на этот счёт... Найду - процитирую. Там как стихотворение:)


Последний раз редактировалось Mr.McD. 14 фев 2012, 17:35, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 17:35 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Mr.McD. писал(а):
То-есть, не неэффективность, а аналогичная эффективность апартаменту МТА, при возможной большей эффективности. С такой реализацией вся соль пропадает..

Однопоточные объекты вызывают методы друг друга напрямую, минуя систему сообщений.
У каждого объекта есть основной интерфейс для прямых вызовов, и так называемый proxy интерфейс используется только при контакте с многопоточными объектами.


Последний раз редактировалось Himik 14 фев 2012, 17:41, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 17:39 

Зарегистрирован: 25 май 2010, 20:58
Сообщения: 136
Himik писал(а):
Однопоточные объекты вызывают методы друг друга напрямую, минуя систему сообщений. Автор наверно имеет ввиду что-то другое, напрмер вызовы между STA и MTA.

Согласен, для асинхронных придётся использовать очередь сообщений. Только почему это должно влиять на эффективность вызовов STA - STA?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 17:44 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Mr.McD. писал(а):
Согласен, для асинхронных придётся использовать очередь сообщений. Только почему это должно влиять на эффективность вызовов STA - STA?

Я и говорю, что автор о чём-то другом. Нет там ни каких издержек. В этом и вся суть STA. Иначе б небыло разницы между STA и MTA, и можно было бы просто всегда использовать MTA.


Последний раз редактировалось Himik 14 фев 2012, 17:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 17:45 

Зарегистрирован: 25 май 2010, 20:58
Сообщения: 136
Видимо потому, что сами по себе они STA, а друг для друга вполне себе нормальные MTA:)
Цитата:
В STA каждый поток, который использует OLE, находится в отдельном апартаменте и COM синхронизирует все входящие вызовы с помощью очереди оконных сообщений. Для этого COM неявно создает окно и при вызове любого метода объекта посылает этому окну сообщение с помощью функции PostMessage.

Это и логично. Отсутствие вытеснения ещё не предполагает синхронного исполнения потоков. Ведь потоки могут исполняться на разных компьютерах, например. И вызовы, в силу их асинхронности придётся буферизировать. Хорошо, что этим занимается система.. А обмен сообщениями действительно может решить проблему блокировок, т.к. захват объекта происходит явно, с посылкой синхронизирующего сообщения оппонентам. В отличии от мутекса, захват которого происходит неявным для "конкурентов" образом.


Последний раз редактировалось Mr.McD. 14 фев 2012, 18:06, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 18:02 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Это верно, но система оптимизирует режим работы. Когда соединяются два однопоточных объекта, то используется основной интерфейс, а когда подключается многопоточный, то используется так называемый proxy интерфейс, который использует сообщения. Вот можешь в реестре Windows посмотреть конфигурацию любого объекта, там будет прописан дополнительный файлик proxy dll. Хотя всех подробностей уж не помню. Но вроде так.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 18:09 

Зарегистрирован: 25 май 2010, 20:58
Сообщения: 136
Himik писал(а):
Это верно, но система оптимизирует режим работы. Когда соединяются два однопоточных объекта, то используется основной интерфейс, а когда подключается многопоточный, то используется так называемый proxy интерфейс, который использует сообщения

Теперь понял. Отличная штука!:) А как ты говорил система реализует разделение времени? Внешне для STA, простым вытеснением его другими потоками, или сами STA-объекты как-то хитро устроены, что справедливо время разделяют между собой?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 фев 2012, 22:24 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Я бы сказал, что они не разделяют времени, а обрабатывают события. Дело в том, что у объекта нет главной рабочей процедуры. Есть только интерфейс с набором методов, которые выполняются в непредсказуемой (для объекта) последовательности - только когда их кто-то вызывает извне. И обычно модули являются DLL-ками, а DLL-ки не являются самостоятельными программами. Хотя можно делать и серверные компоненты в виде EXE-шников.

Все объекты в STA работают в едином цикле приёма и диспетчеризации сообщений - в этом и подобие кооперативной многозадачности. Цикл сообщений объединён с циклом приложения, обрабатывающего главное окно. Так что если приложение не будет крутить GetMessage/DispatchMessage, то загруженные компоненты не будут реагировать на внешние вызовы.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 179 ]  На страницу Пред.  1 ... 14, 15, 16, 17, 18  След.

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


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

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


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

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