2. Создание процессов

Создание Win32 процесса осуществляется вызовом одной из таких функций, как CreateProcess, CreateProcessAsUser (для WinNT/2000/Vista) и CreateProcessWithLogonW (начиная с Win2000) и происходит в несколько этапов:

– Открывается файл образа (EXE), который будет выполняться в процессе. Если исполняемый файл не является Win32 приложением, то ищется образ поддержки (support image) для запуска этой программы. Например, если исполняется файл с расширением.bat, запускается cmd.exe и т.п.

В WinNT/2000/Vista для отладки программ реализовано следующее. CreateProcess, найдя исполняемый Win32 файл, ищет в SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Option раздел с именем и расширением запускаемого файла, затем ищет в нем параметр Debugger, и если строка не пуста, запускает то, что в ней написано вместо данной программы.

– Создается объект Win32 «процесс».

– Создается первичная нить (стек, контекст и объект «нить»).

– Подсистема Win32 уведомляется о создании нового процесса и нити.

– Начинается выполнение первичной нити.

– В контексте нового процесса и потока инициализируется адресное пространство (например, загружаются требуемые DLL) и начинается выполнение программы.

3. Завершение процессов

Процесс завершается если:

– Входная функция первичной нити возвратила управление.

– Одна из нитей процесса вызвала функцию ExitProcess.

– Нить другого процесса вызвала функцию TerminateProcess.

Когда процесс завершается, все User- и GDI‑объекты, созданные процессом, уничтожаются, объекты ядра закрываются (если их не использует другой процесс), адресное пространство процесса уничтожается.

Пример: Программа создает процесс «Калькулятор».

#include <windows.h>

int main (int argc, char* argv[])

{

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory (&si, sizeof(si));

si.cb = sizeof(si);

ZeroMemory (&pi, sizeof(pi));

if (! CreateProcess(NULL, «c:\\windows\\calc.exe», NULL, NULL, FALSE,

0, NULL, NULL, &si, &pi))

return 0;

 // Close process and thread handles.

CloseHandle (pi.hProcess);

CloseHandle (pi.hThread);

return 0;

}

4. Создание нитей

Первичная нить создается автоматически при создании процесса. Остальные нити создаются функциями CreateThread и CreateRemoteThread (только в WinNT/2000/XP/Vista).

5. Завершение нитей

Нить завершается если

– Функция нити возвращает управление.

– Нить самоуничтожается, вызвав ExitThread.

– Другая нить данного или стороннего процесса вызывает TerminateThread.

– Завершается процесс, содержащий данную нить.

6. Создание волокон

Волокно может быть создано с помощью системного вызова CreateFiber из основной нити процесса или получено путем преобразования текущей нити с помощью функции ConvertThreadToFiber. Переключение между волокнами может быть организовано с помощью функции SwitchToFiber, но ее вызов можно осуществлять только из волокна.

Пример: Программа создает 4 волокна, каждое из которых выполняет переключение на следующее волокно, если число переключений больше 10, работа завершается.

 // для работы с волокнами следующие 2 строки обязательны!

#define WIN32_LEAN_AND_MEAN

#define _WIN32_WINNT 0x0400

#include «stdio.h»

#include «windows.h»

int Counter;

void *fiber[5];

void WINAPI Func (void *)

{

for(;) {

printf («Fiber Number % d\n», Counter % 4);

if ((Counter++)<10) {

SwitchToFiber (fiber[Counter % 4]);

} else break;

}

}

int main (int argc, char* argv[])

{

Counter=0;

fiber[0]=CreateFiber (0, Func, NULL);

fiber[1]=CreateFiber (0, Func, NULL);

fiber[2]=CreateFiber (0, Func, NULL);

fiber[3]=CreateFiber (0, Func, NULL);

 // для переключения на первое волокно необходимо преобразовать текущую нить в волокно

fiber[4]=ConvertThreadToFiber(NULL);

SwitchToFiber (fiber[0]);

return 0;

}

7. Уничтожение волокон

Для принудительного уничтожения волокна применяется функция DeleteFiber. Также для уничтожения волокна могут быть использованы все функции, предназначенные для уничтожения нитей.

8. Wait-функции

Для приостановки выполнения работы нити можно использовать различные способы.

Функция Sleep() приостанавливает работу нити на заданное число миллисекунд. Если в качестве аргумента вы укажите 0 ms, то произойдет следующее. Нить откажется от своего кванта процессорного времени, однако тут же появится в списке нитей, готовых к выполнению. Иными словами произойдет намеренное переключение нитей (вернее сказать, попытка переключения – ведь следующей для выполнения нитью вполне может стать та же самая).

Пример. Программа создает процесс «Калькулятор» и через 15 секунд его уничтожает.

#include <windows.h>

int main (int argc, char* argv[])

{

STARTUPINFO StartUpInfo;

PROCESS_INFORMATION ProcessInfo;

memset (&StartUpInfo, 0, sizeof(STARTUPINFO));

StartUpInfo.cb=sizeof(STARTUPINFO);

If (CreateProcess (NULL, «c:\\windows\\calc.exe», NULL, NULL, FALSE,

NORMAL_PRIORITY_CLASS, NULL, NULL,&StartUpInfo,&ProcessInfo))

{

Sleep(15000);

TerminateProcess (ProcessInfo.hProcess, 0);

}

ExitProcess(0);

}

Функция WaitForSingleObject() приостанавливает выполнение нити до тех пор, пока не произойдет одно из двух событий:

– истечет таймаут ожидания;

– ожидаемый объект перейдет в сигнальное (signaled) состояние.

По возвращаемому значению можно понять, какое из двух событий произошло. Ожидать с помощью wait‑функций можно большинство объектов ядра, например, объект «процесс» или «нить», чтобы определить, когда они завершат свою работу.

Функции WaitForMultipleObjects передается сразу массив объектов. Можно ожидать срабатывания сразу всех объектов или какого-то одного из них.

Пример. Программа создает две одинаковых нити и ожидает их завершения. Нити просто выводят текстовое сообщение, которое передано им при инициализации.

#include <windows.h>

#include <process.h>

unsigned ThreadFunc (void * arg)

{

char ** str = (char**) arg;

MessageBox (0, str[0], str[1], 0);

ExitThread(0);

return 0;

}

int main (int argc, char* argv[])

{

char * InitStr1 [2] = {«First thread running!», «11111»}; // строка для первой нити

char * InitStr2 [2] = {«Second thread running!», «22222»}; // строка для второй нити

unsigned long uThreadIDs[2];

HANDLE hThreads[2];

hThreads[0] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc,

InitStr1, 0,&uThreadIDs[0]);

hThreads[1] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc,

InitStr2, 0,&uThreadIDs[1]);

 // Ждем, пока нити не завершат свою работу

WaitForMultipleObjects (2, hThreads, TRUE, INFINITE);

 // Закрываем дескрипторы

CloseHandle (hThreads[0]);

CloseHandle (hThreads[1]);

return 0;

}

 


Выводы

В реферате рассмотрены различные WIN API функции и последовательность действий для создания и работы с процесами, нитями и фолокнами при созданиии вминдоуз-приложений, их применение и особенности. Для получения полной информации о назначении, использовании и синтаксисе всех функций WIN32 API необходимо воспользоваться системой помощи MS SDK, входящей в состав сред программирования Borland Delphi или CBuilder, а также MSDN, поставляемым в составе системы программирования Visual C.



Список литературы

 

1.   Бэрри Нанс. Компьютерные сети пер. с англ. – М.: БИНОМ, 1996.

2.   Глоссарий сетевых терминов http://www.bilim.com/koi8/library/glossary/

3.   Компьютерные сети: Учебный курс Microsoft Corporation – М.: Издательский отдел «Русская редакция», 1999.

4.   Основы современных компьютерных технологий под редакцией А.Д. Хомоненко – СПб КОРОНА принт, 1998.

5.   Ресурсы Microsoft Windows NT Workstation 4.0 пер. с англ. яз. BNV – СПб, 1998.

6.   Сетевые операционные системы Н.А. Олифер, В.Г. Олифер, 2001, СПб, Питер, 544 стр.

7.   Синхронизация нитей внутри процесса в ОС Windows, http://subscribe.ru/ archive/comp.soft.win.swodniwgniqaf/200305/23131921.text

8.   Современные операционные системы, Э. Таненбаум, 2002, СПб, Питер, 1040 стр.

9.   Справочник Novell Netware 4 С.Б. Орлов, по заказу ИИЦ «Попурри», 1994.

10.      Титтел Эд, Хадсон Курт, Дж. Майкл Стюард Networking Essentials – СПб ПИТЕР, 1999.

11.      Титтел Эд, Хадсон Курт, Дж. Майкл Стюард TCP/IP – СПб ПИТЕР, 1999.

12.      Якубайтис Э.А. Информационные сети и системы: Справочная книга. – М.: Финансы и статистика, 1996.


Информация о работе «Процессы, нити и волокна в ОС Windows»
Раздел: Информатика, программирование
Количество знаков с пробелами: 14489
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
84062
0
0

... нарушаются элементарные дидактические требования, преобладает пассивное восприятие учебной информации учащимися, нерационально тратится учебное время. Глава 2. Методика использования аудиовизуальных и технических средств обучения при изучении раздела «Технология обработки ткани 5 класс»   2.1 Комплексно-методическое обеспечение раздела 1. Учебно-методическая документация № п/п Наименование ...

Скачать
94155
10
7

... байта, содержание значения синего, зеленого и красного в том же порядке. Каждая строка дополняется нулями до границы 4 байт. Именно этот формат данных используется в разрабатываемой в подсистеме выделения текстильных волокон. 3.2 Преобразование изображения из RGB – представления в HSB Исходное изображение преобразуется из RGB – представления в HSB в случае выбора пунктов 2 либо 3 из главного ...

Скачать
22434
0
0

... и настройку локальной сети для разных операционных систем; исследовать правильное построение и настройку сети интернет; раскрыть проблемные аспекты, возникающие в процессе настройки локальной сети и подключению к сети интернет для разных операционных систем. Глава 1. Настройка локальной сети для Windows XP и Windows 7   1.1  Настройка локальной сети для Windows XP Первый этап настройки ...

Скачать
35095
0
0

... к локальным сетям. Поэтому требования международных стандартов удовлетворяют лишь ряд сетей, выпускаемых ведущими электронными фирмами мира. 2.2. Классификация сетей Локальные сети, широко используемые в научных, управленческих, организационных и коммерческих технологиях, можно классифицировать по следующим признакам: 1. По роли ПЭВМ в сети: - сети с сервером; - одноранговые ( ...

0 комментариев


Наверх