Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / Презентация. Механизмы ядра. Часть 1.pptx
Скачиваний:
77
Добавлен:
20.09.2019
Размер:
6.57 Mб
Скачать

Процессы и потоки

Процессы и потоки

Задача — набор операций, предназначенных для выполнения логически-законченной функции

системы.

Два типа задач:

процессы (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

 

Установить в

 

сигнальное состояние