- •СПбГУТ им. проф. Бонч- Бруевича )))
- •План
- •Используемый софт
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Ядро операционной системы
- •Объекты ядра
- •Объекты ядра
- •Объекты ядра: Создание
- •Объекты ядра
- •Объекты ядра: Закрытие дескриптора
- •Объекты ядра: Закрытие дескриптора
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Именованные объекты
- •Объекты ядра: Наследование
- •Объекты ядра: Наследование
- •Процессы и потоки
- •Процессы и потоки
- •Процессы и потоки
- •Создание процесса
- •Создание процесса
- •Создание потока
- •Функции ожидания
- •Функции ожидания
- •Функции ожидания
- •События, семафоры и мьютексы
- •Создание события
- •Создание события
- •Создание семафора
- •Создание мьютекса
- •Создание мьютекса
- •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
Процессы и потоки
Процессы и потоки
Задача — набор операций, предназначенных для выполнения логически-законченной функции
системы.
Два типа задач:
—процессы (Process).
—потоки (Thread).
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы.
Поток — ветвь выполнения процесса. Каждый процесс содержит как минимум один поток (одну
ветвь).
Процессы и потоки
Процесс
|
CODE |
|
DATA |
|
… |
|
|
|
|
|
|
|
|
|
Register |
|
|
|
|
|
|
|
|
|
STACK |
|
|
|
s |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Поток 1 |
|
|
|
Процесс
|
CODE |
|
|
DATA |
|
|
|
|
… |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Registe |
|
|
|
Registe |
|
|
|
|
|
Registe |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
rs |
|
|
|
rs |
|
|
|
|
|
rs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STACK |
|
|
|
STACK |
|
|
|
|
|
STACK |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Поток 1 |
|
|
Поток 2 |
|
|
|
|
Поток 3 |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Однопоточное Многопоточное приложение приложение
(3 потока)
Создание процесса
|
CMDLINE |
Thread |
Flags |
CurrentDir |
|
|
|
SecurityAttr |
|
PROC_INFO |
|
|
Process |
Inherit |
|||
int main() { |
SecurityAttr |
Handles EnvironmentSTARTUPINFO |
|||
STARTUPINFO cif; /* Структура с параметрами создаваемого процесса */ |
|||||
ZeroMemory(&cif, sizeof(STARTUPINFO)); /* Заполняет блок памяти нулями */ |
PROCESS_INFORMATION pi; /* Структура для получения информации о процессе */
if (CreateProcess( /* Блокнот */ |
|
||
&cif, &pi |
"C:\\Windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, |
||
) |
|
||
) |
10 параметров |
||
|
|||
|
|
{
printf("Process handle: %d\n", pi.dwProcessId); Sleep(4000); /* Ждем 4 секунды */
TerminateProcess(pi.hProcess, NO_ERROR); /* Закрываем блокнот */
}
return 0;
}
Создание процесса
Уровень пользователя |
|||
Процесс-создатель |
|||
kernel32.dll |
|
CreateProcessAsU |
|
CreateProcess |
|||
ser |
|||
|
|
||
|
CreateProcessInter |
||
|
|
nal |
|
NtDll.dll |
NtCreateUserProces |
||
|
|
s |
NtCreateUserProces
s
Уровень ядра
Создание потока
/* Вторичный поток */
DWORD WINAPI SecondThread(PVOID pvParam) { /* Выполняется обработка */ int * iParam = (int *) pvParam;
*iParam += 49;
printf("[Thread] New X = %d (pvParam)\n", * (int *) pvParam); /* 50 */
printf("[Thread] New X = %d (iParam)\n", *iParam); /* 50 */ |
||||
return 0; |
SecutiryAttr Function |
ID Thread |
||
} |
|
Parameter |
|
|
int main() { |
StackSize |
Может быть |
|
|
int x = 1; /* 1 */ |
|
|||
DWORD dwThreadId; |
|
структурой |
|
|
printf("[MAIN] X = %d\n", x); |
|
|
|
|
/* Создаем новый поток */ |
|
|
|
|
HANDLE hThread = CreateThread(NULL, 0, SecondThread, &x, 0, |
||||
&dwThreadId); |
|
|
|
На деле вызывается |
printf("Thread ID: %d\n", dwThreadId); |
|
|
||
/* Даем 5 с на выполнение */ |
|
функция NtCreateThreadEx |
||
WaitForSingleObject(hThread, 5000); |
|
Flags |
и её друзья |
|
printf("[MAIN] New X = %d (x)\n", x); /* 50 */ |
||||
/* Закрываем дескриптор этого потока */ |
|
|
(библиотека NtDll.dll) |
CloseHandle(hThread);
}
Функции ожидания
Функции ожидания
DWORD WaitForSingleObject(
HANDLE hHandle, /// Дескриптор
DWORD dwMilliseconds /// Время ожидания
);
DWORD WaitForMultipleObjects(
DWORD Count, /// Количество объектов ядра
HANDLE * hHandles, /// Указатель на массив дескрипторов BOOL bWaitAll, /// Все ли объекты должны перейти в сигнальное
состояние?
DWORD dwMilliseconds /// Время ожидания
);
Функции ожидания
Thread 1
Пытаются получить доступ к ресурсу
Thread 2
Thread 3
Средство |
|
синхронизации |
Установить в |
Mutex |
|
Semaphore |
несигнальное |
Event |
состояние |
Или другие… |
NON-SIGNAL |
WaitForSingleObject |
Object |
|
SIGNAL |
|
Установить в |
|
сигнальное состояние |