Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 108 стр.

UptoLike

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,