- •1) Назначение операционной системы
- •7) Контекст потока
- •13) Завершение потоков
- •19) Наследование дескрипторов
- •25). Аппаратная реализация синхронизации
- •31) Семафоры
- •37)Работа с анонимными каналами в Windows
- •43)Финальная обработка исключений
- •49) Распределение и освобождение памяти из кучи
- •55) Концепция механизма отображения файлов в память
31) Семафоры
Семафоры в операционных системах Windows описываются объектами ядра semaphores. Семафор находится в сигнальном состоянии, если его значение больше нуля. В противном случае семафор находится в несигнальном состоянии. Потоки, ждущие сигнального состояния семафора, обслуживаются в порядке FIFO, т. е. потоки становятся в очередь к семафору с дисциплиной обслуживания "первый пришел, первый вышел". Однако если поток ждет наступления асинхронного события, то функции ядра могут исключить поток из очереди к семафору для обслуживания наступления этого события. После этого поток становится в конец очереди семафора.
Создаются семафоры посредством вызова функции CreateSemaphore, которая имеет следующий прототип:
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES IpSemaphoreAttribute, // атрибуты защиты LONG UnitialCount, // начальное значение семафора
LONG IMaximumCount, // максимальное значение семафора
LPCTSTR lpName // имя семафора);
В случае успешного завершения функция createsemaphore возвращает дескриптор семафора, в случае неудачи — значение NULL. ЕСЛИ семафор с заданным именем уже существует, то функция createsemaphor возвращает дескриптор этого семафора, а функция GetLastError, вызванная после функции Createsemaphor, вернет Значение ERROR_ALREADY_EXISTS.
37)Работа с анонимными каналами в Windows
Анонимным каналом называется объект ядра операционной системы, который обеспечивает передачу данных между процессами, выполняющимися на одном компьютере. Процесс, который создает анонимный канал, называется сервером анонимного канала. Процессы, которые связываются с анонимным каналом, называются клиентами анонимного канала. Другими словами можно сказать, что анонимный — это такой канал передачи данных между процессами, который не имеет имени. Следовательно, доступ к такому каналу имеют только родительский процесс-сервер и дочерние процессы-клиенты этого канала.
Перечислим характеристики анонимных каналов, которые необходимо учитывать при их использовании для обмена данными между параллельными процессами:
□ не имеют имени;
□ полудуплексные;
□ передача данных потоком;
□ синхронный обмен данными;
□ возможность моделирования любой топологии связей.
Примеры работы с анонимными каналами
15Л. Программа процесса-клиента анонимного канала
#include <windows.h>
#include <conio.h>
int main(int argc, char *argv[]){
HANDLE hWritePipe;
hWritePipe = (HANDLE)atoi(argv[l]);
_cputs("Press any key to start communication.\n");
_getch();
// пишем в анонимный канал for (int i = 0; i < 10; i++){
DWORD dwBytesWritten; if (!WriteFile( hWritePipe,
&i,
sizeof(i) ,
&dwBytesWr i t ten,
NULL)){
_cputs("Write to file failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();}
__cprintf("The number %d is written to the pipe.Xn", i);
Sleep(500);}
CloseHandle(hWritePipe);
_cputs("The process finished writing to the pipe.\n");
_cputs("Press any key to exit.\n");
_getch();
return 0;}
43)Финальная обработка исключений
Финальные блоки фрейма
В операционных системах Windows существует еще один способ обработки исключений, суть которого заключается в следующем. Код, при исполнении которого возможен выброс исключения, как и в случае с фреймовой обработкой исключений, заключается в блок try. Но только теперь за блоком try следует код, который заключается в блок finally. Система гарантирует, что при любой передаче управления из блока try, независимо от того, произошло или нет исключение внутри этого блока, предварительно управление будет передано блоку finally. Такой способ обработки исключений называется финальная обработка исключений.
Финальная обработка исключений используется для того, чтобы при любом исходе исполнения блока try освободить ресурсы, которые были захвачены внутри этого блока. Такими ресурсами могут быть память, файлы, критические секции и т. д.
#include <windows.h> #include <iostream.h>
int main()
{
char c;
int *p = NULL;
cout « "Input 'у' to allocate memory:
cin » с;
if (с == 'у') р = new int;
_try{
*р = 10; }
finally{
delete р;
cout << "The finally block finished." « endl;}
return 0;}
