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

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

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

BOOL SetThreadPriority(

 

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

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

HANDLE hThread;

HANDLE hThread,

 

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

установки приоритета, FALSE в

hThread = CreateThread(. . .)

int nPriority)

 

Возможные значения параметра nPriority

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

if (hThread)

 

 

(в порядке повышения приоритета):

 

{

 

 

THREAD_PRIORITY_IDLE

 

SetThreadPriority(hThread,

 

 

THREAD_PRIORITY_LOWEST

 

THREAD_PRIORITY_IDLE);

 

 

THREAD_PRIORITY_BELOW_NORMA

 

CloseHandle(hThread);

 

 

L

 

}

 

 

THREAD_PRIORITY_NORMAL

 

 

 

 

THREAD_PRIORITY_ABOVE_NORMA

 

 

 

 

L

 

 

 

 

THREAD_PRIORITY_HIGHEST

 

 

 

 

THREAD_PRIORITY_TIME_CRITICAL

 

 

 

 

Это значение вместе с классом

 

 

 

 

приоритета процесса определяют

 

 

 

 

базовый приоритет потока в системе (см

 

 

 

 

таблицу 2).

 

 

 

 

 

 

 

int GetThreadPriority(

 

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

Приоритет потока в случае

HANDLE hThread;

HANDLE hThread);

 

описателем hThread. Возможные

удачи.

hThread = CreateThread(. . .)

 

 

значения приоритета см. в

THREAD_PRIORITY_ERROR_

if (hThread)

 

 

SetThreadPriority.

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

{

 

 

 

 

if (GetThreadPriority(hThread) ==

 

 

 

 

THREAD_PRIORITY_NORMAL)

 

 

 

 

SetThreadPriority(hThread,

 

 

 

 

THREAD_PRIORITY_IDLE);

 

 

 

 

CloseHandle(hThread);

 

 

 

 

}

VOID Sleep(DWORD

 

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

 

Sleep(1000);

dwMilliseconds);

 

потока на заданное число миллисекунд.

 

// Останавливает выполнение потока на 1

 

 

 

 

секунду

 

 

 

 

 

LPVOID VirtualAlloc(

 

Функция резервирует или выделяет

Указатель в диапазоне

LPSTR szBuff;

LPVOID lpAddress,

 

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

0x00100000..231 на выделенный

 

SIZE_T dwSize,

 

lpAddress – желательный адрес

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

szBuff = (LPSTR) VirtualAlloc(

DWORD flAllocationType,

 

выделяемой памяти. Можно передать

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

NULL, 1024*1024, MEM_COMMIT,

DWORD flProtect

 

NULL для автоматического определения

 

PAGE_READWRITE);

);

 

адреса.

 

 

 

 

dwSize – размер выделяемой или

 

if (szBuff){

 

 

резервируемой памяти в байтах. размер

 

.

 

 

автоматический округляется до

 

.

 

 

кратности страницы (4кб на Intel x86).

 

.

 

 

flAllocationType – флаги выделения:

 

VirtualFree(szBuff, 0,

 

 

MEM_COMMIT – выделение

 

MEM_RELEASE);

 

 

виртуальной памяти.

 

}

 

 

MEM_RESERVE – резервирование

 

 

 

 

памяти.

 

 

 

 

flProtect – тип выделения памяти:

 

 

 

 

PAGE_READONLY – Выделить память

 

 

 

 

только для чтения.

 

 

 

 

PAGE_READWRITE – Выделяется

 

 

 

 

память для чтения и для записи.

 

 

 

 

PAGE_NOACCESS -- К выделенной

 

 

 

 

памяти нет никакого доступа.

 

 

BOOL VirtualFree(

 

Функция освобождения выделенной или

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

см. VirtualAlloc

LPVOID lpAddress,

 

зарезервированной памяти.

освобождения памяти. FALSE в

 

SIZE_T dwSize,

 

lpAddress – адрес выделенной или

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

 

DWORD dwFreeType);

 

зарезервированной памяти.

 

 

 

 

dwSize – размер освобождаемого

 

 

 

 

региона. Если параметр dwFreeType

 

 

 

 

включает MEM_RELEASE, то этот

 

 

 

 

параметр должен равняться нулю.

 

 

 

 

dwFreeType – тип освобождения памяти:

 

 

 

 

MEM_DECOMMIT – освобождает

 

 

 

 

выделенную память, оставляя регион

 

 

 

 

зарезервированным.

 

 

 

 

MEM_RELEASE – полностью

 

 

 

 

освобождает выделенную память.

 

 

 

 

 

 

 

HANDLE CreateMutex(

 

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

Описатель объекта «мьютекс» в

hMutex = CreateMutex(NULL, TRUE, NULL);

LPSECURITY_ATTRIBUTES

 

«мъютекс».

случае удачи. NULL в случае

if (hMutex)

lpMutexAttributes,

 

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

ошибки создания.

{

BOOL bInitialOwner,

 

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

 

.

LPCTSTR lpName

);

мъютекса. Может быть NULL.

 

.

 

 

hInitialOwner – TRUE, мьютекс должен

 

ReleaseMutex(hMutex);

 

 

находится в занятом состоянии

 

.

 

 

(принадлежать текущему потоку).

 

.

 

 

FALSE, если мъютекс «рождается»

 

CloseHandle(hMutex);

 

 

свободным.

 

}

 

 

lpName – имя создаваемого объекта.

 

 

 

 

Может быть NULL.

 

 

 

 

 

 

 

101

BOOL ReleaseMutex(

 

Переводит объект ядра «мъютекс»,

 

TRUE в случае удачи, FALSE в

см. CreateMutex

HANDLE hMutex);

 

заданный описателем hMutex, в

 

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

 

 

 

 

свободное состояние.

 

 

 

 

 

 

 

 

 

HANDLE CreateSemaphore(

 

Функция создаѐт объект ядра семафор.

 

Описатель объекта «семафор» в

HANDLE hSem;

LPSECURITY_ATTRIBUTES

Объект ядра находится в свободном

 

случае успеха. NULL в случае

LONG lComPorts = 2;

lpSemaphoreAttributes, LONG

состоянии, когда свободно больше чем 0

 

ошибки.

hSem = CreateSemaphore(NULL, lComPorts,

lInitialCount,

LONG

ресурсов.

 

 

lComPorts, NULL);

lMaximumCount,

 

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

 

 

 

LPCTSTR lpName

);

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

 

 

 

 

 

 

семафора. Может быть NULL.

 

 

 

 

 

 

lInitialCount – число свободных ресурсов

 

 

 

 

 

 

на момент создания. Должен быть от 0 до

 

 

 

 

 

 

lMaximumCount.

 

 

 

 

 

 

lMaximumCount – максимальное число

 

 

 

 

 

 

ресурсов. Должно быть больше 0.

 

 

 

 

 

 

lpName – имя создаваемого объекта.

 

 

 

 

 

 

Может быть NULL.

 

 

 

 

 

 

 

 

 

BOOL ReleaseSemaphore(

 

Освобождает объект ядра «семафор» с

 

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

HANDLE hSem;

HANDLE hSemaphore,

 

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

 

освобождения семафора.

LONG lComPorts = 2;

LONG lReleaseCount,

 

lReleaseCount – Число освобождаемых

 

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

hSem = CreateSemaphore(NULL, lComPorts,

LPLONG lpPreviousCount

);

ресурсов.

 

 

lComPorts, NULL);

 

 

 

lpPreviousCount – адрес переменной для

 

 

.

 

 

 

записи количества свободных ресурсов

 

 

.

 

 

 

после выполнения функции. Может быть

 

 

ReleaseSemaphore(hSem, 1, NULL);

 

 

 

NULL.

 

 

 

 

 

 

 

 

DWORD WaitForSingleObject(

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

 

WAIT_OBJECT_0 – если

//1//

HANDLE hHandle,

 

потока до освобождения объекта ядра с

 

произошло освобождение

if (CreateProcess(.., &pi))

DWORD dwMilliseconds );

 

описателем hHandle. Функция ждѐт

 

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

{

 

 

 

освобождения заданное в миллисекундах

 

WAIT_ TIMEOUT – время

CloseHandle(pi.hThread);

 

 

 

время (параметр dwMilliseconds). Если во

 

ожидания освобождения

WaitForSingleObject(pi.hProcess);

 

 

 

втором параметре передаѐтся константа

 

объекта закончилось.

CloseHandle(lp.hProcess);

 

 

 

INFINITE, ожидание длиться до

 

WAIT_ABANDONED –

}

 

 

 

освобождения без ограничений по

 

ожидаемый объект является

//2//

 

 

 

времени.

 

мъютексом и поток завершился

HANDLE hMutex = CreateMutex(..);

 

 

 

 

 

раньше освобождения

WaitForSingleObject(hMutex);

 

 

 

 

 

мьютекса.

CloseHandle(hMutex);

 

 

 

 

 

DWORD GetLastError(VOID);

Возвращает код ошибки последней

 

Код ошибки.

hMutex = CreateMutex(..);

 

 

 

операции. 0 означает отсутствие ошибки.

 

 

if (hMutex == NULL)

 

 

 

 

 

 

cout << GetLastError() << endl;

 

 

 

 

 

 

else CloseHandle(hMutex);

 

 

 

 

typedef struct _STARTUPINFO {

typedef struct _PROCESS_INFORMATION {

 

DWORD

cb; // размер структуры

HANDLE hProcess; // Описатель процесса

 

LPTSTR lpReserved;

 

HANDLE hThread; // Описатель потока

 

LPTSTR lpDesktop;

 

DWORD dwProcessId; // Идентификатор процесса

LPTSTR lpTitle;

 

DWORD dwThreadId; // Идентификатор потока

DWORD

dwX;

 

} PROCESS_INFORMATION;

 

DWORD

dwY;

 

 

 

 

 

DWORD

dwXSize;

 

DWORD __stdcall ThreadProc(LPVOID lpParameter)

DWORD

dwYSize;

 

 

 

 

 

DWORD

dwXCountChars;

t y p e d e f s t r u c t _ S Y S T E M _ I N F O {

 

DWORD

dwYCountChars;

u n i o n {

 

 

DWORD

dwFillAttribute;

 

D W O R D

dwOemId;

 

DWORD

dwFlags;

 

s t r u c t {

 

 

WORD

wShowWindow;

 

W O R D wProcessorArchitecture;

 

WORD

cbReserved2;

 

W O R D wReserved;

 

LPBYTE lpReserved2;

 

} ;

 

 

 

HANDLE hStdInput;

 

} ;

 

 

 

HANDLE hStdOutput;

 

D W O R D dwPageSize;

 

HANDLE hStdError;

 

L P V O I D lpMinimumApplicationAddress;

 

} STARTUPINFO, *LPSTARTUPINFO

L P V O I D lpMaximumApplicationAddress;

 

 

 

 

D W O R D dwActiveProcessorMask;

 

 

 

 

D W O R D dwNumberOfProcessors;

 

 

 

 

D W O R D dwProcessorType;

 

D W O R D dwAllocationGranularity; W O R D wProcessorLevel;

W O R D wProcessorRevision;

} S Y S T E M _ I N F O , * L P S Y S T E M _ I N F O ;

102

Таблица 26 Базовый приоритет потока

 

 

Базовый

Класс приоритета процесса

Приоритет потока

приоритет

 

 

потока

IDLE_PRIORITY_CLASS

THREAD_PRIORITY_IDLE

1

BELOW_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_IDLE

1

NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_IDLE

1

ABOVE_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_IDLE

1

HIGH_PRIORITY_CLASS

THREAD_PRIORITY_IDLE

1

 

 

 

IDLE_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

2

IDLE_PRIORITY_CLASS

THREAD_PRIORITY_BELOW_NORMAL

3

IDLE_PRIORITY_CLASS

THREAD_PRIORITY_NORMAL

4

BELOW_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

4

IDLE_PRIORITY_CLASS

THREAD_PRIORITY_ABOVE_NORMAL

5

BELOW_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_BELOW_NORMAL

5

Background NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

5

IDLE_PRIORITY_CLASS

THREAD_PRIORITY_HIGHEST

6

BELOW_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_NORMAL

6

Background NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_BELOW_NORMAL

6

BELOW_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_ABOVE_NORMAL

7

 

 

 

Background NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_NORMAL

7

Foreground NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

7

BELOW_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_HIGHEST

8

NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_ABOVE_NORMAL

8

Foreground NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_BELOW_NORMAL

8

ABOVE_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

8

NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_HIGHEST

9

Foreground NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_NORMAL

9

ABOVE_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_BELOW_NORMAL

9

Foreground NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_ABOVE_NORMAL

10

ABOVE_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_NORMAL

10

 

 

 

Foreground NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_HIGHEST

11

 

 

 

ABOVE_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_ABOVE_NORMAL

11

HIGH_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

11

ABOVE_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_HIGHEST

12

HIGH_PRIORITY_CLASS

THREAD_PRIORITY_BELOW_NORMAL

12

HIGH_PRIORITY_CLASS

THREAD_PRIORITY_NORMAL

13

HIGH_PRIORITY_CLASS

THREAD_PRIORITY_ABOVE_NORMAL

14

HIGH_PRIORITY_CLASS

THREAD_PRIORITY_HIGHEST

15

HIGH_PRIORITY_CLASS

THREAD_PRIORITY_TIME_CRITICAL

15

IDLE_PRIORITY_CLASS

THREAD_PRIORITY_TIME_CRITICAL

15

BELOW_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_TIME_CRITICAL

15

NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_TIME_CRITICAL

15

 

 

 

ABOVE_NORMAL_PRIORITY_CLASS

THREAD_PRIORITY_TIME_CRITICAL

15

REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_IDLE

16

REALTIME_PRIORITY_CLASS

-7

17

REALTIME_PRIORITY_CLASS

-6

18

REALTIME_PRIORITY_CLASS

-5

19

REALTIME_PRIORITY_CLASS

-4

20

REALTIME_PRIORITY_CLASS

-3

21

REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

22

REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_BELOW_NORMAL

23

REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_NORMAL

24

REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_ABOVE_NORMAL

25

 

 

 

REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_HIGHEST

26

REALTIME_PRIORITY_CLASS

3

27

REALTIME_PRIORITY_CLASS

4

28

REALTIME_PRIORITY_CLASS

5

29

REALTIME_PRIORITY_CLASS

6

30

REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_TIME_CRITICAL

31

103