Для каждого процесса ОС выделяет необходимые ресурсы, и он выполняется на отдельной виртуальной машине.
Средства защиты системы обеспечивают невмешательство одного процесса в другой. Для каждого процесса ОС выделяет свое адресное пространство. Термин «мультизадачность» применим в тех случаях, когда необходимо обеспечить взаимодействие между вычислениями. Мультизадачность позволяет задействовать внутренний параллелизм, который реализуется в самих процессах.
Например, если программные модули выполняют медленные операции ввода/вывода, то выделив их в виде самостоятельного подпроцесса, можно значительно ускорить вычисления.
ОС реализует такой механизм в виде нитей или потоков.
Понятие потока введено для того, чтобы распределять процессор. При этом другие вычислительные ресурсы не затрагиваются. Каждый процесс состоит из одного потока. Все потоки одного процесса выполняются в одном адресном пространстве, поэтому между ними можно организовать взаимодействие. При этом за распределение ресурсов между потоками отвечает программист. Для этих целей используются такие средства синхронизации потоков, как критические секции, семафоры и мьютексы.
|
|
Создание процесса:
STARTUINFO si = {sizeof(si)};
PROCESS_INFORMATION po;
TCHAR CommandLine[] = TEXT(“NOTEPAD.exe”);
CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
Void ExitProcess(UINT code); //освобождает системные ресурсы, но память под объекты, созданная в //процессе, не освобождается. Либо процесс сам завершается после выполнения.
BOOL TerminateProcess(HANDLE, UINT); //ресурсы не освобождаются.
Функции потока. Поток начинает выполнение некоторой функции. В первичном потоке это WIN MAIN, во вторичном нужно определить функцию потока:
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
DWORD dwResult = 0;
return(dwResult);
}
Создание потока:
HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa, DWORD cbStack,
PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam, DWORD fdwCreate, PDWORD pdwThreadID);
Завершение потока:
VOID ExitThread(DWORD dwExitCоde);
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);