Операционные Системы
.pdfBOOL 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