| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > ассинхронный ввод-вывод |
| Автор: zss 1.3.2006, 16:35 |
| скажите пожалуйста что лучше использовать 1. асинхронные операции ввода-вывода 2. или синхронные, но в разных потоках (многопоточное приложение) что более предпочтительние ? |
| Автор: Romikgy 1.3.2006, 16:39 |
| для кого?/чего? имхо для проца асинхроность лучше |
| Автор: zss 1.3.2006, 16:47 |
| для удобства и производительности обоснуй |
| Автор: Romikgy 1.3.2006, 17:00 |
| каждый новый поток , кушает часть процессорного времени, асинхроность - ожидание события, проц здесь не задействован ИМХО |
| Автор: Romikgy 1.3.2006, 17:28 | ||
непонял если ф-ция синхроная, то ее и выносят в отдельный поток, чтобы не тормозил основной, если асинхроная, то выполнение программы выполняется дальше, а вызывается ф-ция отдельно прописаная как колбек Или мож я тя не понял? |
| Автор: zss 1.3.2006, 17:37 |
| так я пронее и говорю- ее система вызывает после завершения операции ввода-вывода. Но вызывает в отдельном (системном потоке с повышенным приоритетом) или просто приостанавливает основной код и передает управление на коллбэк функцию ? |
| Автор: Romikgy 1.3.2006, 17:52 |
| Может я и не прав, гуру поправят, но мне кажется , что происходит нечто похожее на обработку сообщений винды, т.е. код постояно опрашивает произошло событие или нет, если произошло , то вызываем колбек, но это имхо делает система |
| Автор: zss 2.3.2006, 09:34 |
| понятно, что система - немного не понятно с помощью каких механизмов у меня все-таки есть подозрение, что в отдельном потоке с повышенным приоритетом может кто точно пояснит ? |
| Автор: 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) |