- •СПбГУТ им. проф. Бонч- Бруевича )))
- •План
- •Используемый софт
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Объекты ядра
- •Объекты ядра
- •Объекты ядра: Создание
- •Объекты ядра
- •Объекты ядра: Закрытие дескриптора
- •Объекты ядра: Закрытие дескриптора
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Наследование
- •Объекты ядра: Наследование
- •Процессы и потоки
- •Процессы и потоки
- •Процессы и потоки
- •Создание процесса
- •Создание процесса
- •Создание потока
- •Функции ожидания
- •Функции ожидания
- •Функции ожидания
- •События, семафоры и мьютексы
- •Создание события
- •Создание события
- •Создание семафора
- •Создание мьютекса
- •Создание мьютекса
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Windows API подробнее
- •Литература
- •Используемая литература
- •FINAL
События, семафоры и мьютексы
Создание события
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <windows.h>
#define THREADCOUNT 20 /* Количество потоков */ HANDLE hEvent;
DWORD WINAPI SecondThread(PVOID pvParam) { int i; /* Ожидание */
if (WaitForSingleObject(hEvent, INFINITE) == WAIT_OBJECT_!0) { int * iParam = (int *) pvParam;
for (i = 0; i < 250; i++) { /* Вычисления */ *iParam += sin(i) * sin(i) + cos(i) * cos(i);
}
SetEvent(hEvent); /* В сигнальное состояние!*/
}
else { printf("Error...\n");
}
return 0;
}
! — должна быть
проверка
Создание события
|
|
|
SecurityAttr bInitialState |
|
|
bManualReset |
Name |
|
int main() { |
|
|
int i, x = 0; |
|
|
HANDLE hThread[THREADCOUNT]; |
|
! |
hEvent = CreateEvent(NULL, FALSE, TRUE, NULL); /* Создание |
||
события */ |
|
|
printf("[MAIN] X = %d\n", x); /* 0 */ |
! |
|
for (i = 0; i < THREADCOUNT; i++) { /* Создаем потоки */ |
||
hThread[i] = CreateThread(NULL, 0, SecondThread, &x, 0, |
|
|
NULL); |
! |
|
} |
|
|
WaitForMultipleObjects(THREADCOUNT, hThread, TRUE, 5000); |
|
|
! |
|
|
printf("[MAIN] New X = %d (x)\n", x); /* 5000 */ |
|
|
for (i = 0; i < THREADCOUNT; i++) { |
|
|
CloseHandle(hThread[i]); |
|
|
! |
|
|
} |
! — должна быть |
|
CloseHandle(hEvent); |
||
|
проверка |
|
Создание семафора
#include <stdio.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <math.h> |
|
|
|
#include <windows.h> |
|
|
|
#define THREADCOUNT 20 /* Количество потоков */ |
|
||
HANDLE hSemaphore; |
Handle |
PrevCount |
|
|
ReleaseCount |
|
|
DWORD WINAPI SecondThread(PVOID pvParam) { |
|
||
int i; /* Ожидание */ |
|
! |
|
if (WaitForSingleObject(hSemaphore, INFINITE) == |
WAIT_OBJECT_0) { int * iParam = (int *) pvParam;
for (i = 0; i < 250; i++) { /* Вычисления */
*iParam += sin(i) * sin(i) + cos(i) * cos(i);
} ! ReleaseSemaphore(hSemaphore, 1, NULL); /* Увеличение на
1 */
}
else { printf("Error...\n");
}
return 0;
! — должна быть
проверка
}
! — должна быть
проверка
Создание мьютекса
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <windows.h> #define THREADCOUNT 20 HANDLE hMutex;
DWORD WINAPI SecondThread(PVOID pvParam) { |
|
int i; /* Ожидание */ |
! |
if (WaitForSingleObject(hMutex, INFINITE) == |
|
WAIT_OBJECT_0) { |
|
int * iParam = (int *) pvParam;
for (i = 0; i < 250; i++) { /* Вычисления */
*iParam += sin(i) * sin(i) + cos(i) * cos(i); |
|
} |
! |
ReleaseMutex(hMutex); /* Освобождение мьютекса */ |
|
} |
|
else { |
|
printf("Error...\n"); |
|
} |
! — должна быть |
return 0; |
|
} |
проверка |
Создание мьютекса
SecurityAttr
bInitialOwner
Name int main() {
int i, x = 0; HANDLE hThread[THREADCOUNT]; hMutex = CreateMutex(NULL, FALSE, NULL);! printf("[MAIN] X = %d\n", x);
for (i = 0; i < THREADCOUNT; i++) { /* Создаем потоки */ hThread[i] = CreateThread(NULL, 0, SecondThread, &x, 0, NULL);!
}
WaitForMultipleObjects(THREADCOUNT, hThread, TRUE, 5000);! printf("[MAIN] New X = %d (x)\n", x);
for (i = 0; i < THREADCOUNT; i++) { CloseHandle(hThread[i]);!
}
CloseHandle(hMutex);!
}
! — должна быть
проверка
Windows API подробнее
Windows API подробнее
DLL (англ. Dynamic Link Library) — это библиотека содержащая код и данные, которые могут использоваться более чем одной программой одновременно.
Win32 — 32-разрядный API для современных версий Windows. Базовые функции (например,
создание потока) реализованы в динамически подключаемых библиотеках kernel32.dll и advapi32.dll.
Базовые модули графического интерфейса
пользователя (например, MessageBox) — в user32.dll
Windows API подробнее
Решим три вопроса:
1.Что из себя представляет библиотека kernel32.dll?
2.Как можно отследить работу потоков?
3.Как узнать, какие библиотеки или API использует та или иная программа?