Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Операционные Системы

.pdf
Скачиваний:
37
Добавлен:
02.03.2016
Размер:
1.94 Mб
Скачать

for (int i=0; i<POOL;i++) PostQueuedCompletionStatus(hio, 0,

CK_EXIT, NULL); break;

// Комманда на выход из потока case CK_EXIT:

return 0; break;

}

}

}

}

int _tmain()

{

HANDLE hPool[POOL];

//Создаѐм порт ввода-вывода и связываем его с

//файлом для чтения

hio = CreateIoCompletionPort(hSrc, NULL, CK_READ, 0);

//связываем созданный порт ввода-вывода с файлом

//для записи

hio = CreateIoCompletionPort(hTgt, hio, CK_WRITE, 0);

// Создаѐм пул потоков

for (int i=0; i< POOL; i++)

hPool[i] = CreateThread(NULL, 0, IoComplete, NULL, 0, NULL);

// Читаем из файла

ReadFile(hSrc, Buf, BUFSIZE, NULL, &ovr);

// Ждѐм завершения всех потоков в пуле

WaitForMultipleObjects(POOL, hPool, TRUE,

INFINITE);

 

for (int i=0; i< POOL; i++)

 

CloseHandle(hPool[i]);

return 0;

}

 

 

 

91

 

Проецируемые в память файлы

Проецируемые в память файлы позволяют работать с файлами на диске так, как будто бы они целиком располагаются в виртуальной памяти. Для поддержки этого механизма операционная система используя менеджер виртуальной памяти и драйвер файловой системы проецирует файл на адресное пространство процесса.

Для работы с проекциями файлов выполните следующие шаги:

1.Создайте объект «файл», вызовом функции CreateFile.

2.Создайте объект «проекция файла», вызовом функции CreateFileMapping. (Таблица 23).

3.Закройте описатель файла, если он вам больше не нужен, вызовом

CloseHandle.

4.Отобразите весь или часть файла на адресное пространство, вызовом функции MapViewOfFile. (Таблица 24).

5.Для отключения отображения воспользуйтесь UnmapViewOfFile.(

6.Таблица 25).

7.После окончания работы с проекцией файла закройте его описатель, вызовом функции CloseHandle.

Таблица 23. Функция Cr ea teF il eM ap p i n g .

HANDLE CreateFileMapping(

//Описатель файла

HANDLE hFile,

//атрибут защиты

LPSECURITY_ATTRIBUTES lpAttributes,

//защита страниц

DWORD flProtect,

//старшие 32 разряда размера файла

DWORD dwMaximumSizeHigh,

//младшие 32 разряда размера файла

DWORD dwMaximumSizeLow,

//название объекта

LPCTSTR lpName

);

HANDLE hFile – описатель файла для отображения.

LPSECURITY_ATTRIBUTES lpAttributes – атрибут защиты. По умолчанию NULL.

DWORD flProtect – атрибут защиты страниц проекции файла: PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY.

DWORD dwMaximumSizeHigh,

DWORD dwMaximumSizeLow – размер проекции файла. Для отображения всего файла передайте 0.

92

LPCTSTR lpName – название объекта для разделения между процессами. Может быть

NULL.

Возвращаемое значение

Описатель объекта «проекция файла» в случае удачи. В случае ошибки – NULL.

Таблица 24. Функция Map Vie wO fF ile .

LPVOID MapViewOfFile(

//описатель объекта «проекция файла»

HANDLE hFileMappingObject,

//режим доступа к проекции

DWORD dwDesiredAccess,

//старшие 32 разряда смещения в файле

DWORD dwFileOffsetHigh,

//младшие 32 разряда смещения в файле

DWORD dwFileOffsetLow,

//число байт файла для проецирования

SIZE_T dwNumberOfBytesToMap );

HANDLE hFileMappingObject – описатель «проекция файла»

DWORD dwDesiredAccess – запрашиваемый доступ к представлению:

FILE_MAP_WRITE, FILE_MAP_READ, FILE_MAP_COPY.

DWORD dwFileOffsetHigh,

DWORD dwFileOffsetLow – позиция в файле для начала проекции. dwNumberOfBytesToMap – число байт для проецирования из файла. 0 для проецирования всего файла.

Возвращаемое значение

В случае удачи виртуальный адрес представления файла. NULL в случае ошибки.

Таблица 25. Функция UnmapViewOfFile.

BOOL UnmapViewOfFile

 

(

 

LPCVOID lpBaseAddress

// Начальный адрес

);

 

 

 

Пример 28. Использование проецируемого в память файла.

int _tmain(int argc, _TCHAR* argv[])

{

HANDLE hFile, hMap;

LPBYTE pData = NULL;

// Открываем файл для чтения и записи

hFile = CreateFile("e:\\Sample.txt", GENERIC_WRITE

93

| GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTAL_SCAN, NULL);

if (hFile != INVALID_HANDLE_VALUE)

{

// Создаѐм проекцию всего файла

hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);

if (hMap)

{

//Получаем размер файла и закрываем его описатель

//за ненадобностью

DWORD dwSize = GetFileSize(hFile, NULL);

CloseHandle(hFile);

//Проецируем представление всего файла на адресное

//пространство

pData = (LPBYTE)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);

if (pData)

{

// Заполняем оптимистичным значком содержимое :)

// !! Код ASCII.

memset(pData, 1, dwSize);

// Закрываем представление файла

UnmapViewOfFile(pData);

}

// Закрываем проекцию файла

CloseHandle(hMap);

}

}

return 0;

}

94

Задачи и упражнения

1.Напишите программу, которая обменивает содержимое двух заданных файлов. Создайте две версии программы: одну с использованием синхронных операций ввода-вывода, другую с использованием асинхронных операций. Для синхронизации примените события.

2.Напишите программу резервного копирования заданного файла. Реализуйте асинхронные операции ввода-вывода с применением порта завершения ввода-вывода.

3.Пусть имеется текстовый файл, где содержаться строки одинаковой длины (записи таблицы базы данных). Пользователь указывает какие строки в файле требуется считать, задавая их номера. Система выполняет асинхронное чтение данных и выводит результаты на экран. Реализуйте задачу с применением оповестительного ввода-вывода.

4.Создайте программу сравнения двух заданных файлов с использованием проецируемых в память файлов.

5.*Напишите программу транспонирования текстового файла с использованием проецируемых в память файлов.

6.Разработайте и реализуйте на языке С++ классы-обѐртки для работы с подсистемой ввода-вывода: файл, проецируемый в память файл, порт завершения ввода-вывода.

Контрольные вопросы

1.Расскажите о модели представления устройств в современных ОС.

2.Какие задачи ставятся перед подсистемой ввода-вывода?

3.Почему создание подсистемы ввода/вывода считается одной из самых сложных областей проектирования операционных систем?

4.Перечислите основные задачи, возлагаемые на диспетчер ввода/вывода.

5.Чем обеспечивается независимость пользовательских программ от устройств ввода/вывода, подключенных к компьютеру?

6.Расскажите о структуре драйвера в ОС Windows NT?

7.Почему операции ввода/вывода в ОС объявляются привилегированными?

8.Какие режимы управления вводом/выводом вы знаете? Опишите каждый из них.

9.Что означает термин «spooling» и что означает термин «swapping»

10.В чѐм отличие виртуального устройства от физического? 11.Зачем в структуру драйвера введены функции ISR и DPC?

95

12.Что такое синхронный и асинхронный ввод/вывод?

13.Какие средства обработки асинхронного ввода-вывода существуют в

Windows NT?

14.Всегда ли оправданы асинхронные операции ввода-вывода? 15.Расскажите о портах ввода-вывода. Дайте сравнительный анализ с

другими механизмами.

16.Какие цели преследует использование модели LIFO для активизации потоков пула порт ввода-вывода?

17.Подумайте, как определить необходимое число потоков в пуле порта ввода-вывода?

18.Что такое отображаемые в память файлы? Какие компоненты ОС участвуют в поддержке этого механизма?

19.Какие преимущества перед обычным файловым вводом-выводом обеспечивают отображаемые в память файлы?

20.Что такое концепция одноуровневой памяти? Насколько она жизнеспособна?

21.Расскажите о кэшировании операций ввода/вывода при работе с накопителями на магнитных дисках.

22.Расскажите о дисциплинах переупорядочивания запросов ввода-вывода. 23.Чем принципиально отличается отображение файла в память от

кэширования файла с помощью средств менеджера виртуальной памяти? 24.Что такое файловая система? Что обеспечивает использование той или

иной файловой системы? Какие файловые системы, используемые в ОС для ПК, вы знаете?

25.Что такое транзакционная файловая система? Как реализуются транзакции в системе NTFS?

26.Проведите сравнительный анализ следующих файловых систем: FAT12, FAT16, FAT32, NTFS.

96

СПИСОК ЛИТЕРАТУРЫ

1.Г.Н. Соловьѐв, В.Д. Никитин “Операционные системы ЭВМ”. Москва “Высшая школа”, 1989.

2.Вильям Столлингс "Операционные системы", 4-е издание. "Вильямс", 2002

3.В.Г. Олифер, Н.А. Олифер “Сетевые операционные системы”. Изд. дом “Питер”, 2002.

4.А.В. Гордеев, А.Ю. Молчанов “Системное программное обеспечение”. Изд. дом

“Питер” 2002.

5.Д. Иртегов “Введение в операционные системы”. Санкт-Петербург “BHV”, 2002.

6.Вильям Столлингс "Структурная организация и архитексура компьютерных систем", 5-е издание. "Вильямс", 2002.

7.Грегори Р. Эндрюс "Основы многопоточного, параллельного и распределѐнного программирования", "Вильямс", 2003.

8.Джеффри Рихтер “Windows для профессионалов”. 3-е изд. “Русская редакция”, 1997.

9.Джеффри Рихтер “Windows для профессионалов”. 4-е изд. “Русская редакция”, 2001.

10.Д. Соломон, М. Руссинович “Внутреннее устройство Microsoft Windows 2000”. Изд. “Питер”, 2001.

11.В.П. Солдатов "Программирование драйверов Windows", "Бином", 2004.

12.Свен Шрайбер "Недокументированные возможности Windows 2000", "Питер" 2002.

13.Гэри Неббет "Справочник по базовым функциям API WIndows NT/2000", "Вильямс",

2002.

14.Питер Нортон, Роб Макгрегор "Windows 95/NT4 программирование с помощью MFC" в 2-х томах."СК-Пресс" 1998.

15.В. В. Воеводин, Вл. В. Воеводин "Параллельные вычисления", "БХВ-Петербург", 2002.

16.Хассан Гома “UML. Проектирование систем реального времени, распределѐнных и параллельных приложений”. Изд. “ДМК”, Москва, 2002.

17.Т. Кормен, Ч. Лейзерсон, Р. Ривест “Алгоритмы. Построение и анализ”. “МЦНМО”, Москва 2001.

18.Роберт Седжвик “Фундаментальные алгоритмы на С++”. 3е издание, “DiaSoft”, 2001.

19.Бъерн Страуструп "Язык программирования С++", "Невский диалект", 2002.

20.П. Брам, Д. Брам “Микропроцессор 80386 и его программирование”. Изд. “Мир”, 1990.

21.В. Юров “ASSEMBLER”. Изд. “Питер”, 2002.

22.Дж. Рихтер, Дж. Кларк “Программирование серверных приложений для Microsoft Windows 2000”. Изд. дом “Питер”, 2002.

23.Петров А.А. “Компьютерная безопасность. Криптографические методы защиты”. Изд. “ДМК”, 2000.

24.http://msdn.microsoft.com

25.http://www.microsoft.com/rus/net/

97

ПРИЛОЖЕНИЕ

Основные функции Windows API

Функция

Описание

Возвращаемое значение

Пример

BOOL CreateProcess(

Функция создаѐт новый процесс.

TRUE – в случае успеха

STARTUPINFO si;

LPCTSTR lpAppName,

lpAppName – путь к исполняемому

создания нового процесса.

PROCESS_INFORMATION pi;

LPTSTR lpCommandLine,

файлу.

FALSE – в случае ошибки

 

LPSECURITY_ATTRIBUTES

lpCommandLine – параметры командной

 

if (CreateProcess(

lpProcessAttributes,

 

строки. Может быть NULL.

 

“c:\\windows\\calc.exe”,

LPSECURITY_ATTRIBUTES

lpProcessAttributes – указатель на

 

NULL, NULL, NULL, FALSE,

lpThreadAttributes, BOOL

структуру с атрибутами безопасности

 

NORMAL_PRIORITY_CLASS, NULL, NULL,

bInheritHandles,

 

процесса. Может быть NULL.

 

&si, &pi))

DWORD dwCreationFlags,

lpThreadAttributes – указатель на

 

{

LPVOID lpEnvironment,

структуру с атрибутами безопасности

 

CloseHandle(pi.hThread);

LPCTSTR lpCurrentDirectory,

главного потока процесса. Может быть

 

CloseHandle(pi.hProcess);

LPSTARTUPINFO lpStartupInfo,

NULL.

 

}

LPPROCESS_INFORMATION

bInheritHandles – TRUE, если новый

 

 

lpProcessInformation);

процесс должен наследовать таблицу

 

 

 

 

описателей родительского.

 

 

 

 

dwCreationFlags – флаги создания

 

 

 

 

процесса. Указывается класс приоритета

 

 

 

 

процесса:

 

 

 

 

IDLE_PRIORITY_CLASS

 

 

 

 

NORMAL_PRIORITY_CLASS

 

 

 

 

HIGH_PRIORITY_CLASS

 

 

 

 

REALTIME_PRIORITY_CLASS

 

 

 

 

lpEnvironment – указатель на переменные

 

 

 

 

окружения для процесса. Может быть

 

 

 

 

NULL.

 

 

 

 

lpCurrentDirectory – текущий каталог для

 

 

 

 

процесса. Может быть NULL.

 

 

 

 

lpStartupInfo – указатель на структуру с

 

 

 

 

информацией о создаваемом процессе1.

 

 

 

 

lpProcessInformation – указатель на

 

 

 

 

структуру с информацией о созданном

 

 

 

 

процессе.

 

 

 

 

 

 

BOOL CloseHandle(

Закрывает описатель объекта ядра:

TRUE в случае удачного

HANDLE hProcess, hThread, hFile;

HANDLE hObj);

 

Процесс, поток, семафор, файл, мъютекс,

закрытия описателя.

hProcess = GetCurrentProcess();

 

 

событие, сокет, проекцию файла и др.

 

hThread = GetCurrentThread();

 

 

hObj – Описатель объекта, полученный

 

hFile = CreateFile(. . . );

 

 

функцией создания или открытия

 

CloseHandle(hFile);

 

 

объекта ядра.

 

CloseHandle(hThread);

 

 

 

 

CloseHandle(hProcess);

LPTSTR GetCommandLine(VOID)

Функция получения командой строки

Указатель на командную строку

cout << GetCommandLine() << endl;

BOOL GetExitCodeProcess( HANDLE

Функция получения кода завершения

TRUE в случае успешной

DWORD dwCode;

hProcess, LPDWORD lpExitCode)

процесса.

работы функции, FALSE в

if (GetExitCodeProcess(

 

 

hProcess – описатель процесса.

противном случае.

hProcess, &dwCode))

 

 

lpExitCode – адрес переменной кода

 

{

 

 

завершения

 

cout << dwCode << endl;

 

 

 

 

}

 

 

 

 

CloseHandle(hProcess);

 

 

 

 

UINT GetSystemDirectory(

Функция получения имени системного

В случае удачи возвращает

TCHAR szBuff[MAX_PATH];

LPTSTR lpBuffer,

UINT uSize)

каталога. lpBuffer – адрес буфера для

количество символов в строке

if ( GetSystemDirectory(

 

 

считывания туда строки с именем

пути. В случае ошибки выдаѐт

szBuff, MAX_PATH) > 0)

 

 

каталога. uSize – размер буфера. Обычно

0.

{

 

 

указывается константа MAX_PATH.

 

cout << szBuff << endl;

 

 

 

 

}

 

 

 

 

UINT GetWindowsDirectory(

Функция получения имени каталога

В случае удачи возвращает

TCHAR szBuff[MAX_PATH];

LPTSTR lpBuffer,

UINT uSize)

Windows. lpBuffer – адрес буфера для

количество символов в строке

if ( GetWindowsDirectory(

 

 

считывания туда строки с именем

пути. В случае ошибки выдаѐт

szBuff, MAX_PATH) > 0)

 

 

каталога. uSize – размер буфера. Обычно

0.

{

 

 

указывается константа MAX_PATH.

 

cout << szBuff << endl;

 

 

 

 

}

 

 

 

 

 

98

DWORD GetCurentDirectory(

Функция получения имени текущего

В случае удачи возвращает

TCHAR szBuff[MAX_PATH];

DWORD dwBufLen,

каталога. lpBuffer – адрес буфера для

количество символов в строке

if ( GetCurrentDirectory(

LPTSTR lpBuffer)

считывания туда строки с именем

пути. В случае ошибки выдаѐт

MAX_PATH, szBuff) > 0)

 

каталога. lpBufLen – размер буфера.

0.

{

 

Обычно указывается константа

 

cout << szBuff << endl;

 

MAX_PATH.

 

}

 

 

 

 

BOOL SetCurrentDirectory(

Функция изменения текущего каталога.

TRUE в случае успешной

SetCurrentDirectory(“C:\\WINDOWS”);

LPCTSTR lpPathName);

lpPathName – новый текущий каталог.

работы функции, FALSE в

 

 

 

противном случае.

 

DWORD GetPriorityClass( HANDLE

Функция возвращает класс приоритета

Возвращает в случае успеха

cout << GetPriorityClass() << endl;

hProcess);

процесса hProcess. Возможные значения:

класс приоритета, в противном

 

 

IDLE_PRIORITY_CLASS

случае 0.

 

 

NORMAL_PRIORITY_CLASS

 

 

 

HIGH_PRIORITY_CLASS

 

 

 

REALTIME_PRIORITY_CLASS

 

 

 

 

 

 

BOOL SetPriorityClass( HANDLE

Функция устанавливает класс приоритета

TRUE в случае успешной

SetPriorityClass(

hProcess, DWORD dwPriorityClass);

процесса.

работы функции, FALSE в

hProcess, IDLE_PRIORITY_CLASS);

 

hProcess – описатель процесса.

противном случае.

 

 

dwPriorityClass – класс приоритета

 

 

 

Возможные значения:

 

 

 

IDLE_PRIORITY_CLASS

 

 

 

NORMAL_PRIORITY_CLASS

 

 

 

HIGH_PRIORITY_CLASS

 

 

 

REALTIME_PRIORITY_CLASS

 

 

 

 

 

 

HANDLE GetCurrentProcess()

Функция возвращает описатель текущего

Описатель текущего процесса.

HANDLE hProcess = GetCurrentProcess();

 

процесса.

 

CloseHandle(hProcess);

 

 

 

 

VOID ExitProcess(UINT uExitCode)

Функция завершает выполнение

Функция не возвращает

ExitProcess(0x10);

 

процесса из которого она вызывается.

управления.

 

 

uExitCode – код завершения процесса.

 

 

 

 

 

 

BOOL TerminateProcess(

Завершение выполнения процесса с

TRUE в случае удачного

TerminateProcess(

HANDLE hProcess,

описателем hProcess.

завершения процесса. FALSE в

GetCurrentProcess(), 0x10);

UINT uExitCode

uExitCode – код завершения процесса.

случае ошибки.

// Завершение текущего процесса.

);

 

 

 

 

 

 

 

HANDLE OpenProcess(

Открывает доступ к объекту процесс.

Описатель открытого объекта

HANDLE hProcess;

DWORD dwDesiredAccess,

dwDesiredAccess – запрашиваемый

«процесс» в случае удачи.

 

BOOL bInheritHandle,

уровень доступа. Для максимального

NULL в случае ошибки.

hProcess =

DWORD dwProcessId

уровня доступа используйте константу

 

OpenProcess(PROCESS_ALL_ACCESS,

);

PROCESS_ALL_ACCESS

 

FALSE, GetCurrentProcessID());

 

bInheritHandle – может ли, возвращѐнный

 

.

 

функцией, описатель процесса

 

. Работа с описателем

 

наследоваться дочерними процессами.

 

.

 

dwProcessId – идентификатор

 

CloseHandle(hProcess);

 

запрашиваемого процесса.

 

 

BOOL GetProcessTimes(

Возвращает статистическую

TRUE – в случае удачного

FILETIME ct, et, kt, ut;

HANDLE hProcess,

информацию о процессе.

вызова функции.

GetProcessTimes(

LPFILETIME

hProcess – описатель процесса

FALSE – в случае ошибки.

GetCurrentProcess(), &ct, &et, &kt, &ut);

lpCreationTime,

lpCreationTime – время создания

 

 

LPFILETIME lpExitTime,

процесса.

 

 

LPFILETIME lpKernelTime,

lpExitTime – время завершения процесса.

 

 

LPFILETIME lpUserTime

lpKernelTime – время работы процесса в

 

 

);

режиме ядра

 

 

 

lpUserTime – время работы процесса в

 

 

 

режиме пользователя.

 

 

BOOL FileTimeToSystemTime(

lpFileTime – время для конвертации.

 

FILETIME ft;

CONST FILETIME *lpFileTime,

lpSystemTime – указатель на структуру

TRUE в случае успешного

SYSTEMTIME st;

LPSYSTEMTIME lpSystemTime );

SYSTEMTIME для результата

преобразования

.

 

конвертации.

FALSE в случае ошибки.

. Заполнение переменной ft

 

 

 

.

 

typedef struct _SYSTEMTIME {

 

FileTimeToSystemTime(&ft, &st);

 

WORD wYear;

 

 

 

WORD wMonth;

 

printf(“%d:%d:%d”, st.wHour,

 

WORD wDayOfWeek;

 

st.wMinute, st.wSecond);

 

WORD wDay;

 

 

 

WORD wHour;

 

 

 

WORD wMinute;

 

 

 

WORD wSecond;

 

 

 

WORD wMilliseconds;

 

 

 

} SYSTEMTIME, *PSYSTEMTIME;

 

 

 

 

 

 

BOOL SetProcessWorkingSetSize(

Задаѐт параметры рабочего набора

TRUE – в случае удачного

SetProcessWorkingSetSize(

HANDLE hProcess,

процесса.

изменения

GetCurrentProcess(), 1024*1024,

SIZE_T

hProcess – описатель процесса

FALSE – в случае ошибки.

2*1024*1024);

dwMinimumWorkingSetSize,

dwMinimumWorkingSetSize –

 

 

SIZE_T

минимальное значение в байтах.

 

 

dwMaximumWorkingSetSize

dwMaximumWorkingSetSize –

 

 

);

максимальное значение в байтах.

 

 

 

 

 

 

99

BOOL GetProcessWorkingSetSize(

Возвращает информацию о рабочем

TRUE – в случае удачного

SISE_T minWS, maxWS;

HANDLE hProcess,

 

наборе процесса.

изменения

GetProcessWorkingSetSize(minWS, maxWS);

PSIZE_T

 

hProcess – описатель процесса.

FALSE – в случае ошибки.

 

lpMinimumWorkingSetSize,

 

lpMinimumWorkingSetSize – указатель на

 

 

PSIZE_T

 

переменную для записи минимального

 

 

lpMaximumWorkingSetSize

 

значения в байтах.

 

 

);

 

lpMaximumWorkingSetSize – указатель на

 

 

 

 

переменную для записи максимального

 

 

 

 

значения в байтах

 

 

BOOL GetProcessIoCounters(

 

Получает информацию об операциях

TRUE – в случае удачного

IO_COUNTERS ioc;

HANDLE hProcess,

 

ввода-вывода, осуществлѐнных

изменения

 

PIO_COUNTERS lpIoCounters

);

процессом.

FALSE – в случае ошибки.

GetProcessIoCounters(

 

 

hProcess – описатель процесса

 

GetCurrentProcess(), &ioc);

 

 

lpIoCounters – указатель на структуру

 

 

 

 

IO_COUNTETRS для приѐма значений.

 

Printf(“байт записано %I64d”,

 

 

typedef struct _IO_COUNTERS {

 

ioc.WriteTransferCount);

 

 

ULONGLONG

 

 

 

 

ReadOperationCount;

 

 

 

 

ULONGLONG

 

 

 

 

WriteOperationCount;

 

 

 

 

ULONGLONG

 

 

 

 

OtherOperationCount;

 

 

 

 

ULONGLONG ReadTransferCount;

 

 

 

 

ULONGLONG WriteTransferCount;

 

 

 

 

ULONGLONG OtherTransferCount;

 

 

 

 

} IO_COUNTERS;

 

 

 

 

typedef IO_COUNTERS

 

 

 

 

*PIO_COUNTERS;

 

 

 

 

 

 

 

HANDLE CreateThread(

 

Функция создаѐт новый поток в

Описатель потока в случае

DWORD __stdcall ThreadProc(LPVOID

LPSECURITY_ATTRIBUTES

 

процессе.

удачи, либо NULL в случае

lpParam)

lpThreadAttributes,

 

lpThreadAttributes – указатель на

ошибки.

{

DWORD dwStackSize,

 

структуру с атрибутами защиты потока.

 

return 0;

LPTHREAD_START_ROUTINE

 

dwStackSize – размер стека потока в

 

}

lpStartAddress,

 

байтах. Можно передать 0 для размера по

 

 

LPVOID lpParameter,

 

умолчанию (1 МБ).

 

DWORD dwThreadId;

DWORD dwCreationFlags,

 

lpStartAddress – указатель на процедуру

 

 

LPDWORD lpThreadId

);

потока3.

 

HANDLE hThread = CreateThread(

 

 

lpParameter – 32х битный параметр для

 

NULL, 0, ThreadProc, NULL, 0, &dwThreadId);

 

 

передачи в процедуру потока. Может

 

 

 

 

быть NULL.

 

if (hThread)

 

 

dwCreationFlags – флаги создания потока.

 

CloseHandle(hThread);

 

 

Возможные значения:

 

 

 

 

CREATE_SUSPENDED – создать

 

 

 

 

приостановленный поток.

 

 

 

 

0 – поток начинает выполнение сразу.

 

 

 

 

lpThreadId – указатель на переменную

 

 

 

 

для получения идентификатора потока.

 

 

 

 

 

 

 

DWORD ExitThread(VOID)

 

Завершает выполнение потока, откуда

Код завершения потока.

DWORD __stdcall ThreadProc(LPVOID

 

 

вызвана функция.

 

lpParam)

 

 

 

 

{

 

 

 

 

if (lpParam == NULL)

 

 

 

 

ExitThread(0x10);

 

 

 

 

}

 

 

 

 

 

BOOL TerminateThread(

 

Завершает выполнение любого потока в

TRUE в случае удачного

HANDLE hThread = CreateThread(..)

HANDLE hThread,

 

системе с описателем hThread.

завершения потока.

.

DWORD dwExitCode);

 

dwExitCode – код завершения потока.

 

.

 

 

 

 

TerminateThread(hThread, 0x10);

 

 

 

 

CloseHandle(hThread);

HANDLE GetCurrentThread(VOID);

Возвращает описатель текущего потока.

Описатель потока в случае

hThread = GetCurrentThread();

 

 

После работы с описателем его нужно

успеха, NULL в противном

.

 

 

закрыть функцией CloseHandle.

сдучае.

.

 

 

 

 

CloseHandle(hThread);

DWORD GetCurrentThreadId()

 

Получение идентификатора текущего

Числовой идентификатор

DWORD dwTID = GetCurrentThreadId();

 

 

потока.

потока в случае успеха.

 

 

 

 

 

 

DWORD SuspendThread(

 

Приостанавливает выполнение потока с

В случае успеха возвращается

HANDLE hThread;

HANDLE hThread);

 

описателем hThread.Система ведѐт

значение счѐтчика остановов

hThread = CreateThread(...);

 

 

счѐтчик остановов/запусков потока.

потока. –1 в случае ошибки.

SuspendThread(hThread);

 

 

Можно вызвать функцию несколько раз,

 

SuspendThread(hThread);

 

 

но столько же раз нужно вызвать

 

 

 

 

функцию возобновления потока.

 

ResumeThread(hThread);

 

 

Возобновить выполнение можно только

 

ResumeThread(hThread);

 

 

из другого не остановленного потока.

 

 

 

 

 

 

CloseHnalde(hThread);

DWORD ResumeThread(

 

Уменьшает счѐтчик остановок потока на

В случае успеха возвращается

См. SuspendThread

HANDLE hThread);

 

единицу. Возобновляет выполнение

значение счѐтчика остановов

 

 

 

приостановленного потока, если счѐтчик

потока. –1 в случае ошибки.

 

 

 

остановок равен 0.

 

 

 

 

 

 

 

100