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

UptoLike

средства взаимной синхронизации, а также организация локаль-
ной для потоков памяти. По большей части .NET Framework пре-
доставляет надстройку над средствами операционной системы.
Работа с различными процессами и доменами приложений.
В основном это надстройки над абстракциями высокого уровня,
такими как RPC, COM объекты и пр.
Как и в случае API системы, такое деление не является строгим – ре-
альные средства «пересекают» границы этих категорий. При этом не все ме-
ханизмы, предоставляемые операционной системой, нашли свое отражение
в .NET Framework; равно как многие механизмы, оставаясь внешне схожи-
ми с механизмами операционной системы, существенным образом измени-
лись. Так, например, .NET не поддерживает волокна; операции асинхрон-
ного ввода-вывода основываются на использовании отдельных потоков,
выполняющих фоновые синхронные операции ввода-вывода, и др.
Вообще говоря, использование фоновых потоков для выполнения
специфических задач поддержки инфраструктуры .NET стало общим мес-
том. При запуске .NET приложения автоматически создается пул потоков,
используемый CLR по мере надобности. Этот пул применяется, в частно-
сти, в ситуациях, связанных с обработкой асинхронных запросов и асин-
хронного ввода-вывода, когда в рамках операционной системы реально ис-
пользовался бы основной поток в состоянии ожидания оповещения.
.NET разрабатывался с учетом возможности переноса на другие плат-
формы. Для облегчения этого процесса в архитектуру CLR включен спе-
циальный уровень адаптации к платформе (PAL, Platform Adaptation Layer),
являющийся прослойкой между основными механизмами CLR и уровнем
операционной системы. В случае платформы Windows уровень PAL доста-
точно прост – считается, что PAL должен предоставить для CLR функци-
ональность, аналогичную Win32 API. Однако в случае иных платформ PAL
может оказаться достаточно сложным и многоуровневым. Например, в
случае платформ, не поддерживающих многопоточные приложения, PAL
должен самостоятельно реализовать недостающую функциональность.
В данном курсе рассматриваются основные средства реализации
многопоточных приложений и не затрагиваются вопросы создания ASP,
COM-объектов и многого другого.
7.3.1. Потоки и пул потоков
Потоки в .NET реализованы на основе модели потоков операцион-
ной системы и не предусматривают средств управления волокнами. Если
система не поддерживает многопоточные приложения, то PAL должен бу-
дет реализовать собственный планировщик потоков режима пользователя
(и в этом случае окажется, что потоки .NET являются аналогами волокон,
а не потоков ядра).
Разработка параллельных приложений для ОС Windows
251
si.cb = sizeof(si);
if ( ac != 2 || strcmp( av[1], “slave” ) ) {
for ( i = 0; i < 256; i++ ) shared[i] = 256-i;
/* первый экземляр с общими данными */
CreateProcess(
NULL, “fsec.exe slave”, DEFAULT_SECURITY,
DEFAULT_SECURITY, FALSE, NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi
);
CloseHandle( pi.hThread );
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
} else {
/* второй экземляр с общими данными */
for ( i = 0; i < 256; i++ )
if ( shared[i] != 256-i ) break;
if ( i != 256 ) { /* ОШИБКА! */ }
}
return 0;
}
Некоторое неудобство, связанное с необходимостью использовать од-
но и то же приложение, можно легко обойти, если разделяемый сегмент по-
местить в разделяемую библиотеку – тогда один и тот же образ библиотеки
может быть подключен к разным приложениям, что позволит им обмени-
ваться данными. В этом варианте надо только учитывать, что адреса, в ко-
торые будет помещена библиотека, в разных процессах могут отличаться.
7.3. Параллельные операции в .NET
Реализация параллельного выполнения кода в .NET основана на ба-
зовых механизмах, предоставляемых ядром операционной системы
Windows. Аналогично средствам операционной системы средства .NET
Framework могут быть разделены на следующие группы:
Обработка асинхронных запросов. Сюда относятся средства для
выполнения асинхронных операций ввода-вывода, средства для
работы с очередями сообщений, некоторые надстройки для ра-
боты в сетевой среде (ASP, XML и др.) и средства поддержания
инфраструктуры COM объектов.
Организация многопоточных приложений. Сюда относятся сред-
ства создания потоков, управления ими, включая пулы потоков,
250
CIL и системное программирование в Microsoft .NET
250                         CIL и системное программирование в Microsoft .NET   Разработка параллельных приложений для ОС Windows                    251


       si.cb = sizeof(si);                                                                средства взаимной синхронизации, а также организация локаль-
       if ( ac != 2 || strcmp( av[1], “slave” ) ) {                                       ной для потоков памяти. По большей части .NET Framework пре-
         for ( i = 0; i < 256; i++ ) shared[i] = 256-i;                                   доставляет надстройку над средствами операционной системы.
         /* первый экземляр с общими данными */                                         • Работа с различными процессами и доменами приложений.
         CreateProcess(                                                                   В основном это надстройки над абстракциями высокого уровня,
            NULL, “fsec.exe slave”, DEFAULT_SECURITY,                                     такими как RPC, COM объекты и пр.
           DEFAULT_SECURITY, FALSE, NORMAL_PRIORITY_CLASS,                           Как и в случае API системы, такое деление не является строгим – ре-
            NULL, NULL, &si, &pi                                                альные средства «пересекают» границы этих категорий. При этом не все ме-
         );                                                                     ханизмы, предоставляемые операционной системой, нашли свое отражение
         CloseHandle( pi.hThread );                                             в .NET Framework; равно как многие механизмы, оставаясь внешне схожи-
                                                                                ми с механизмами операционной системы, существенным образом измени-
         WaitForSingleObject( pi.hProcess, INFINITE );                          лись. Так, например, .NET не поддерживает волокна; операции асинхрон-
         CloseHandle( pi.hProcess );                                            ного ввода-вывода основываются на использовании отдельных потоков,
       } else {                                                                 выполняющих фоновые синхронные операции ввода-вывода, и др.
         /* второй экземляр с общими данными */                                      Вообще говоря, использование фоновых потоков для выполнения
         for ( i = 0; i < 256; i++ )                                            специфических задач поддержки инфраструктуры .NET стало общим мес-
           if ( shared[i] != 256-i ) break;                                     том. При запуске .NET приложения автоматически создается пул потоков,
         if ( i != 256 ) { /* ОШИБКА! */ }                                      используемый CLR по мере надобности. Этот пул применяется, в частно-
       }                                                                        сти, в ситуациях, связанных с обработкой асинхронных запросов и асин-
       return 0;                                                                хронного ввода-вывода, когда в рамках операционной системы реально ис-
     }                                                                          пользовался бы основной поток в состоянии ожидания оповещения.
     Некоторое неудобство, связанное с необходимостью использовать од-               .NET разрабатывался с учетом возможности переноса на другие плат-
но и то же приложение, можно легко обойти, если разделяемый сегмент по-         формы. Для облегчения этого процесса в архитектуру CLR включен спе-
местить в разделяемую библиотеку – тогда один и тот же образ библиотеки         циальный уровень адаптации к платформе (PAL, Platform Adaptation Layer),
может быть подключен к разным приложениям, что позволит им обмени-              являющийся прослойкой между основными механизмами CLR и уровнем
ваться данными. В этом варианте надо только учитывать, что адреса, в ко-        операционной системы. В случае платформы Windows уровень PAL доста-
торые будет помещена библиотека, в разных процессах могут отличаться.           точно прост – считается, что PAL должен предоставить для CLR функци-
                                                                                ональность, аналогичную Win32 API. Однако в случае иных платформ PAL
                                                                                может оказаться достаточно сложным и многоуровневым. Например, в
7.3. Параллельные операции в .NET                                               случае платформ, не поддерживающих многопоточные приложения, PAL
                                                                                должен самостоятельно реализовать недостающую функциональность.
    Реализация параллельного выполнения кода в .NET основана на ба-                  В данном курсе рассматриваются основные средства реализации
зовых механизмах, предоставляемых ядром операционной системы                    многопоточных приложений и не затрагиваются вопросы создания ASP,
Windows. Аналогично средствам операционной системы средства .NET                COM-объектов и многого другого.
Framework могут быть разделены на следующие группы:
      • Обработка асинхронных запросов. Сюда относятся средства для             7.3.1. Потоки и пул потоков
         выполнения асинхронных операций ввода-вывода, средства для                   Потоки в .NET реализованы на основе модели потоков операцион-
         работы с очередями сообщений, некоторые надстройки для ра-             ной системы и не предусматривают средств управления волокнами. Если
         боты в сетевой среде (ASP, XML и др.) и средства поддержания           система не поддерживает многопоточные приложения, то PAL должен бу-
         инфраструктуры COM объектов.                                           дет реализовать собственный планировщик потоков режима пользователя
      • Организация многопоточных приложений. Сюда относятся сред-              (и в этом случае окажется, что потоки .NET являются аналогами волокон,
         ства создания потоков, управления ими, включая пулы потоков,           а не потоков ядра).