Составители:
Рубрика:
fp = fopen( filename, “rb” );
if ( fp ) {
done = fread( fp, 1, size, buffer );
/* код не будет выполняться, пока чтение не завершится*/
fclose( fp );
} else {
done = 0;
}
buffer[done] = '\0';
return done;
}
Такой подход прост в реализации, как с точки зрения операционной
системы, так и с точки зрения пользователя («пользователем» операцион-
ной системы в данном случае выступает разработчик). Однако во время
выполнения операций ввода-вывода сама программа не выполняется –
она ожидает завершения ввода-вывода. Во многих случаях такие опера-
ции, во-первых, занимают достаточно много времени и, во-вторых, вы-
полняются специализированным оборудованием без участия центрально-
го процессора, который в это время находится в состоянии ожидания и
не выполняет никакой полезной работы (по крайней мере, с точки зрения
данной программы, так как в общем случае начало ожидания приводит к
перепланировке потоков).
Эффективность использования процессора можно было бы повы-
сить, если бы существовала возможность выполнять код программы во
время выполнения операций ввода-вывода. Конечно, это не всегда воз-
можно или целесообразно. Например, если для продолжения работы про-
граммы необходимы данные, которые еще не получены, то нам все равно
надо ожидать завершения ввода-вывода. Более того, структура приложе-
ния должна быть разработана с учетом специфики использования асин-
хронных операций ввода-вывода.
В Windows для реализации асинхронного ввода-вывода предусмотре-
ны функции типа ReadFile, WriteFile, ReadFileEx, WriteFileEx и др. и спе-
циальная структура OVERLAPPED, которая используется для взаимодействия с
асинхронной операцией. Асинхронные операции применяются следую-
щим образом: перед началом операции заполняется структура
OVERLAPPED и вызывается нужная функция для выполнения ввода-вывода,
которая ставит операцию в очередь и немедленно возвращает управление
вызвавшей программе. После этого программа продолжает свою работу не-
зависимо от хода выполнения операции ввода-вывода. При необходимости
можно выяснить состояние асинхронной операции, дождаться ее заверше-
ния или отменить ее, не дожидаясь завершения. Для этого предназначен
специальный набор функций, например, CancelIo, GetOverlappedResult,
Основы многозадачности
203
• Взаимодействие между процессами одного компьютера.
Чуть более сложный случай – необходимость взаимодействия
различных процессов в рамках одной вычислительной системы.
Особенность этого случая связана с тем, что разные процессы
работают в изолированных друг от друга адресных пространст-
вах, однако при этом существует возможность осуществить об-
мен данными через общую, разделяемую несколькими процес-
сами, память. Диспетчер памяти операционной системы должен
предусмотреть средства организации разделяемой между про-
цессами памяти. Кроме того, многие операционные системы
предоставляют дополнительные средства межпроцессного взаи-
модействия; многие из них являются надстройками над средст-
вами работы с разделяемой памятью.
В данной книге рассматриваются базовые средства для организа-
ции разделяемой памяти, так как большая часть остальных
средств либо является надстройкой над ними (например, обмен
оконными сообщениями), либо использует обмен данными через
файловые объекты (к примеру, почтовые ящики, каналы и пр.).
• Взаимодействие между процессами разных компьютеров.
В общем случае память разных компьютеров можно рассматри-
вать как изолированную друг от друга. В этом случае для взаимо-
действия разных процессов потребуется пересылка сообщений,
содержащих данные и некоторую управляющую информацию,
между разными компьютерами (узлами сети). Операционная
система должна предоставить некоторый базовый набор функ-
ций по пересылке данных по коммуникационной сети и, зачас-
тую, богатый набор различных средств, работающих «поверх»
этого базового уровня.
В данной книге межузловое взаимодействие не рассматривается.
6.2.1. Асинхронный ввод-вывод
Обычные операции ввода-вывода происходят в синхронном режиме.
Например, в приведенном ниже примере все операции выполняются
строго последовательно: файл открывается, вызывается операция чтения
данных, и только после того как все данные прочитаны, продолжается вы-
полнение задачи:
#include <stdio.h>
int sequential_io( char *filename, char *buffer, int size )
{
FILE *fp;
int done;
202
CIL и системное программирование в Microsoft .NET
202 CIL и системное программирование в Microsoft .NET Основы многозадачности 203 • Взаимодействие между процессами одного компьютера. fp = fopen( filename, “rb” ); Чуть более сложный случай – необходимость взаимодействия if ( fp ) { различных процессов в рамках одной вычислительной системы. done = fread( fp, 1, size, buffer ); Особенность этого случая связана с тем, что разные процессы /* код не будет выполняться, пока чтение не завершится*/ работают в изолированных друг от друга адресных пространст- fclose( fp ); вах, однако при этом существует возможность осуществить об- } else { мен данными через общую, разделяемую несколькими процес- done = 0; сами, память. Диспетчер памяти операционной системы должен } предусмотреть средства организации разделяемой между про- buffer[done] = '\0'; цессами памяти. Кроме того, многие операционные системы return done; предоставляют дополнительные средства межпроцессного взаи- } модействия; многие из них являются надстройками над средст- Такой подход прост в реализации, как с точки зрения операционной вами работы с разделяемой памятью. системы, так и с точки зрения пользователя («пользователем» операцион- В данной книге рассматриваются базовые средства для организа- ной системы в данном случае выступает разработчик). Однако во время ции разделяемой памяти, так как большая часть остальных выполнения операций ввода-вывода сама программа не выполняется – средств либо является надстройкой над ними (например, обмен она ожидает завершения ввода-вывода. Во многих случаях такие опера- оконными сообщениями), либо использует обмен данными через ции, во-первых, занимают достаточно много времени и, во-вторых, вы- файловые объекты (к примеру, почтовые ящики, каналы и пр.). полняются специализированным оборудованием без участия центрально- • Взаимодействие между процессами разных компьютеров. го процессора, который в это время находится в состоянии ожидания и В общем случае память разных компьютеров можно рассматри- не выполняет никакой полезной работы (по крайней мере, с точки зрения вать как изолированную друг от друга. В этом случае для взаимо- данной программы, так как в общем случае начало ожидания приводит к действия разных процессов потребуется пересылка сообщений, перепланировке потоков). содержащих данные и некоторую управляющую информацию, Эффективность использования процессора можно было бы повы- между разными компьютерами (узлами сети). Операционная сить, если бы существовала возможность выполнять код программы во система должна предоставить некоторый базовый набор функ- время выполнения операций ввода-вывода. Конечно, это не всегда воз- ций по пересылке данных по коммуникационной сети и, зачас- можно или целесообразно. Например, если для продолжения работы про- тую, богатый набор различных средств, работающих «поверх» граммы необходимы данные, которые еще не получены, то нам все равно этого базового уровня. надо ожидать завершения ввода-вывода. Более того, структура приложе- В данной книге межузловое взаимодействие не рассматривается. ния должна быть разработана с учетом специфики использования асин- хронных операций ввода-вывода. 6.2.1. Асинхронный ввод-вывод В Windows для реализации асинхронного ввода-вывода предусмотре- Обычные операции ввода-вывода происходят в синхронном режиме. ны функции типа ReadFile, WriteFile, ReadFileEx, WriteFileEx и др. и спе- Например, в приведенном ниже примере все операции выполняются циальная структура OVERLAPPED, которая используется для взаимодействия с строго последовательно: файл открывается, вызывается операция чтения асинхронной операцией. Асинхронные операции применяются следую- данных, и только после того как все данные прочитаны, продолжается вы- щим образом: перед началом операции заполняется структура полнение задачи: OVERLAPPED и вызывается нужная функция для выполнения ввода-вывода, которая ставит операцию в очередь и немедленно возвращает управление #includeвызвавшей программе. После этого программа продолжает свою работу не- int sequential_io( char *filename, char *buffer, int size ) зависимо от хода выполнения операции ввода-вывода. При необходимости { можно выяснить состояние асинхронной операции, дождаться ее заверше- FILE *fp; ния или отменить ее, не дожидаясь завершения. Для этого предназначен int done; специальный набор функций, например, CancelIo, GetOverlappedResult,
Страницы
- « первая
- ‹ предыдущая
- …
- 106
- 107
- 108
- 109
- 110
- …
- следующая ›
- последняя »