- •СПбГУТ им. проф. Бонч- Бруевича )))
- •План
- •Используемый софт
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Объекты ядра
- •Объекты ядра
- •Объекты ядра: Создание
- •Объекты ядра
- •Объекты ядра: Закрытие дескриптора
- •Объекты ядра: Закрытие дескриптора
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Наследование
- •Объекты ядра: Наследование
- •Процессы и потоки
- •Процессы и потоки
- •Процессы и потоки
- •Создание процесса
- •Создание процесса
- •Создание потока
- •Функции ожидания
- •Функции ожидания
- •Функции ожидания
- •События, семафоры и мьютексы
- •Создание события
- •Создание события
- •Создание семафора
- •Создание мьютекса
- •Создание мьютекса
- •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
Windows API подробнее
Всякий раз, когда программист создает поток
(CreateThread) или другой механизм ядра, он
реализует вызов одной из функции Windows API
(конкретно для потока: одной из функций файла kernel32.dll).
Windows API подробнее
Посмотрим |
файл |
C:\Windows\System32\kernel32.dll.
Для этого воспользуемся декомпилятором Reko (freeware).
Сделаем копию kernel32.dll и декомпилируем файл…
Windows API подробнее
Windows API подробнее
Теперь отследим, что делает многопоточная программа во время работы.
В качестве программы-шпиона выберем Process Explorer.
Windows API подробнее
Заранее создадим простую программу на С89
(C90)#include. <stdio.h> |
|
|
|
|
#include <windows.h> |
|
|
int main() { |
|
int a; /* a = 0 */ |
|
|
|
HANDLE hThread = CreateThread(NULL, 0, |
|
|
|
(LPTHREAD_START_ROUTINE) &function, NULL, |
|
void function() { |
|
|
|
0, NULL); |
|
|
|
printf("%d\n", a); /* 0 */ |
|
int i; |
|
|
|
WaitForSingleObject(hThread, INFINITE); |
Sleep(10000); |
/* |
10 |
sec. |
printf("%d\n", a); /* 200 */ |
*/ |
|
|
|
CloseHandle(hThread); |
for (i = 0; i |
< 100; |
i++) |
hThread = NULL; |
|
{ |
|
|
|
getchar(); getchar(); |
a += 1 + 1; |
|
|
|
} |
} |
|
|
|
|
Sleep(10000); |
/* |
10 |
sec. |
|
*/ |
|
|
|
|
} |
|
|
|
|
Windows API подробнее
Запустим программу и посмотрим, что происх1. Вторичныйдит: поток начал свою работу (ID:
2748).
Количество
дескрипторов: (вкладка Performance)
Windows API подробнее
2. Поток отработал и пошел на завершение (ID:
Windows API подробнее
3. Поток завершился (ID: 2748).
Количество
дескрипторов:
Performance)
Windows API подробнее
А теперь посмотрим, какие DLL-модули использует наше приложение.
Для этого воспользуемся стандартными средствами Windows — Монитор ресурсов
(Администрирование).
Запустим нашу программу и посмотрим в
мониторе ресурсов (раздел “Центральный процессор —> Связанные модули”) используемые модули.
Windows API подробнее
<—