Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ассинхронный ввод-вывод


Автор: zss 1.3.2006, 16:35
скажите пожалуйста что лучше использовать
1. асинхронные операции ввода-вывода
2. или синхронные, но в разных потоках (многопоточное приложение)

что более предпочтительние ?

Автор: Romikgy 1.3.2006, 16:39
Цитата(zss @ 1.3.2006, 15:35 Найти цитируемый пост)
что более предпочтительние ?

для кого?/чего?
имхо для проца асинхроность лучше smile

Автор: zss 1.3.2006, 16:47
Цитата(Romikgy @ 1.3.2006, 16:39 Найти цитируемый пост)
для кого?/чего?


для удобства и производительности smile



Цитата(Romikgy @ 1.3.2006, 16:39 Найти цитируемый пост)
имхо для проца асинхроность лучше

обоснуй smile

Автор: Romikgy 1.3.2006, 17:00
каждый новый поток , кушает часть процессорного времени,
асинхроность - ожидание события, проц здесь не задействован
ИМХО

Автор: zss 1.3.2006, 17:14
Цитата(Romikgy @ 1.3.2006, 17:00 Найти цитируемый пост)
каждый новый поток , кушает часть процессорного времени,
асинхроность - ожидание события, проц здесь не задействован
ИМХО


мне немного не понятен механизм.
Когда событие произойдет - произойдет вызов отложенной функции.
Этот вызов будет в отдельном потоке, или просто приостановится мой код
до того как отработает отложенная функция ?

Автор: Romikgy 1.3.2006, 17:28
Цитата(zss @ 1.3.2006, 16:14 Найти цитируемый пост)
Когда событие произойдет - произойдет вызов отложенной функции.
Этот вызов будет в отдельном потоке, или просто приостановится мой код
до того как отработает отложенная функция ?

непонял smile
если ф-ция синхроная, то ее и выносят в отдельный поток, чтобы не тормозил основной, если асинхроная, то выполнение программы выполняется дальше, а вызывается ф-ция отдельно прописаная как колбек
Или мож я тя не понял?

Автор: zss 1.3.2006, 17:37
Цитата(Romikgy @ 1.3.2006, 17:28 Найти цитируемый пост)
а вызывается ф-ция отдельно прописаная как колбек


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

Автор: Romikgy 1.3.2006, 17:52
Может я и не прав, гуру поправят, но мне кажется , что происходит нечто похожее на обработку сообщений винды, т.е. код постояно опрашивает произошло событие или нет, если произошло , то вызываем колбек, но это имхо делает система

Автор: zss 2.3.2006, 09:34
Цитата(Romikgy @ 1.3.2006, 17:52 Найти цитируемый пост)
но это имхо делает система

понятно, что система - немного не понятно с помощью каких механизмов

у меня все-таки есть подозрение, что в отдельном потоке с повышенным приоритетом

может кто точно пояснит ?

Автор: comcon1 2.3.2006, 10:50
В Линухе я бы словил сигнал, пришедший от потока, занимавшегося вводом-выводом...

Автор: adonin 2.3.2006, 13:01
Новый поток при этом не создаётся. Используется механизм APC.

После обработки прерывания (осуществляется в нулевом кольце привилегий)
диспетчер ввода/вывода (часть ядра ОС) ставит в очередь АРС-объект (Asynchronous Procedure Call - асинхронный вызов процедуры) для завершения ввода/вывода в контексте потока - инициатора запроса. (Подсистема ввода/вывода должна скопировать некоторые данные из системной области памяти в виртуальное адресное пространство процесса, поток которого инициировал запрос ввода/вывода, во время исполнения такого потока, это достигается путем пересылки АРС-объекта режима ядра в очередь АРС-объек-тов этого потока.)

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

Процедура АРС режима ядра записывает данные в адресное пространство потока-инициатора запроса, устанавливает описатель файла в состояние «свободен», устанавливает в очередь на исполнение АРС-объект пользовательского режима (если нужно) и удаляет IRP.

APC процедуры ваполняются на уровне IRQL=APC_LEVEL.
APC пользовательского режима выполняется в контексте потока - инициатора запроса ввода-вывода.
См. Рисунок.

Автор: maxim1000 2.3.2006, 13:11
ну еще можно добавить, что это происходит не в любом месте выполнения потока: он должен быть в alertable state (для этого можно использовать, например, функцию SleepEx)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)