Нельзя управлять запущенной задачей и даже обнаружить факт ее завершения.



УПРАВЛЕНИЕ ПРОЦЕССАМИ И ПОТОКАМИ В ОС WINDOWS

Лабораторная работа № 1

ЦЕЛЬ РАБОТЫ

Изучение организации мультипрограммирования в ОС Windows, приобретение практических навыков использования средств API Windows для создания процессов и потоков.

ОСНОВНЫЕ СВЕДЕНИЯ

Многозадачность в ОС Windows

Мультипрограммирование или мультизадачность – это способ организации вычислительного процесса, при котором на одном процессоре попеременно выполняются сразу несколько программ. Эти программы совместно используют не только процессор, но и другие ресурсы компьютера. Мультипрограммирование призвано повысить эффективность использования вычислительной системы. Наиболее часто используемыми критериями эффективности являются:

· Пропускная способность – количество задач, выполняемых системой в единицу времени;

· Удобство работы пользователей – возможность интерактивной работы одновременно с несколькими приложениями на одном компьютере;

В зависимости от выбранного критерия эффективности ОС делятся на системы пакетной обработки, системы разделения времени и системы реального времени.

Одной из основных подсистем мультипрограммной ОС является подсистема управления процессами и потоками, которая занимается их созданием и уничтожением, поддерживает между ними взаимодействие, а также распределяет процессорное время между несколькими процессами и потоками. Эта подсистема отвечает также за обеспечение процессов необходимыми ресурсами и за синхронизацию потоков и процессов.

Процесс в системах разделения времени может находиться в одном из следующих состояний:

· Выполнения – все затребованные процессом ресурсы выделены. В однопроцессорной вычислительной системе в каждый момент времени может находиться только один процесс;

· Готовности к выполнению – ресурсы могут быть предоставлены, тогда процесс перейдет в состояние выполнения;

· Блокирования или ожидания – затребованные ресурсы не могут быть предоставлены, или не завершена операция ввода/вывода.

Как правило, процесс появляется при запуске программы. За время своего существования процесс может неоднократно совершать переходы из одного состояния в другое. Это обусловлено обращениями к ОС для выделения ресурсов и выполнением системных функций, взаимодействием с другими процессами, появлением сигналов от периферийных устройств.

Для того, чтобы ОС могла управлять процессами, она должна располагать всей необходимой для этого информацией. Поэтому для каждого процесса в ядре  заводится специальная структура, которая содержит, в частности, следующую информацию:

· Идентификатор процесса;

· Тип (или класс) процесса, который определяет для супервизора некоторые правила предоставления ресурсов;

· Приоритет процесса, в соответствии с которым супервизор предоставляет ресурсы. В рамках одного класса процессов в первую очередь обслуживаются более приоритетные процессы.

· Переменную состояния, которая определяет, в каком состоянии находится процесс.

· Адрес области памяти, в которой хранится контекст процесса.

· Информацию о ресурсах, которыми процесс владеет и/или имеет право пользоваться.

· Адрес процесса на диске в его исходном состоянии и адрес на диске, куда он выгружается из оперативной памяти, если его вытеснит другой процесс.

 

Windows является многозадачной операционной системой, когда на одном процессоре с разделением во времени выполняется несколько программ. Для каждой выполняемой программы (процесса) ОС выделяет необходимую область оперативной памяти, а также предоставляет процессорное время и доступ к таким ресурсам, как файлы, устройства ввода-вывода и др.

Процесс – это совокупность исполняемой программы и выделенных ей системных ресурсов. Часть процессов являются прикладными или пользовательскими, другая часть инициализируется самой ОС и называется системными. Каждый процесс выполняется в собственном адресном пространстве. Процессы могут одновременно нуждаться в одних и тех же ресурсах, поэтому ОС выполняет планирование, управление и защиту ресурсов.

За время существования процесса его выполнение может быть многократно прервано и продолжено. Для продолжения выполнения процесса необходимо восстановить состояние операционной среды. Это состояние определяется значениями регистров, программного счетчика, указателями на открытые файлы, информацией о незавершенных операциях ввода-вывода и т.д. Эти данные называются контекстом процесса. При смене процесса происходит переключение контекста.

В Windows реализован принцип вытесняющей многозадачности. Каждому потоку процесса система выделяет определенный квант времени, по истечении которого происходит переключение на выполнение другого потока. Величина кванта времени зависит от ОС и типа процессора, для Windows ХР она составляет примерно 20 мс. Реализация данного принципа обеспечивает не только параллельное выполнение программ, но и устойчивость среды к зависаниям, так как ни одно приложение не может получить неограниченный доступ к ресурсам компьютера.

Каждый экземпляр программы соответствует только одному процессу. Windows рассматривает процесс как потребитель всех ресурсов, кроме одного, самого главного, - процессорного времени. Этот важнейший ресурс ОС распределяет между потоками. Поток (thread) представляет собой последовательность (поток выполнения) команд. В Windows процесс не исполняется, исполняются потоки процесса.

 

       Процесс ничего не исполняет, он просто служит контейнером потоков.

    Все потоки процесса размещены в едином виртуальном адресном пространстве.

        

При запуске процесса система создает его главный поток (primary thread). Программист кроме главного потока может создать ещё несколько потоков, принадлежащих процессу. Это дает возможность процессу получать больше процессорного времени и выделять требующие больших затрат времени операции (например, печать текста) в отдельный поток. При этом главный поток может выполняться параллельно. Так реализуется потоковая многозадачность.

Смена активного потока при вытесняющей многозадачности происходит, если:

- поток завершился и покинул систему,

- произошла ошибка выполнения,

- исчерпан квант времени, предоставленный потоку,

- поток перешел в состояние ожидания завершения ввода-вывода.

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

Для запуска внешнего приложения из работающей программы нужно создать новый процесс. В Win32 API для этого предусмотрен стандартный системный вызов CreateProcess (), однако эта функция имеет громоздкий синтаксис из-за множества аргументов. Более простыми, но и более ограниченными по возможностям являются функции WinExec () и ShellExecute ().

 

Функция WinExec ()

 

UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);

Примечание:

LPCSTR = = const char *

UINT  = = unsigned int

lpCmdLine – указатель на строку с нулевым символом в конце, содержащую имя выполняемого файла (возможно, с путем и доп. аргументами). Если имя находится в AnsiString str, то нужно приводить тип: str.c_str();

uCmdShow - определяет вид окна запускаемого приложения. Наиболее употребительные значения параметра приведены в таблице:

 

Значение                                  Действие
SW_HIDE Окно делается невидимым, а фокус передается другому окну. В этом режиме можно запускать программы, не требующие пользовательского ввода, иначе спрятанное приложение зависнет, ожидая данных
SW_MINIMIZE Минимизировано
SW_MAXIMIZE Максимизировано
SW_RESTORE

Активизирует и отображает окно

SW_SHOWNORMAL

 

Если имя запускаемого приложения указано без пути, то его поиск производится в следующей последовательности:

- каталог запускающего приложения;

- текущий каталог;

- системный каталог Windows (по GetSystemDirectory())

- каталог Windows (по GetWndowsDirectory());

- перечень каталогов, указанных в переменной окружения PATH.

 

При успешном запуске приложения функция возвращает целое число больше 31, а иначе – код ошибки, в частности:

Возвращаемое значение  Символическое имя Причина неудачи
        0   Нехватка памяти или ресурсов системы
        11 ERROR_BAD_FORMAT Ошибочный формат файла (например, не Win32-приложение)
        2 ERROR_FILE_NOT_FOUND Файл не найден
        3 ERROR_PATH_NOT_FOUND Каталог не существует

 

Использование WinExec() имеет недостатки:

Нельзя управлять запущенной задачей и даже обнаружить факт ее завершения.

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

2. Считается устаревшей и не рекомендуется к использованию в новых программах.

 

Достоинства:

1. Простота (короткий список аргументов).

2. Совместима с ранними версиями Windows.

Функция ShellExecute ()

 

Способна отобразить любой документ, для которого зарегистрировано расширение имени файла и ассоциированная с ним программа. Функция может сама отыскать приложение, связанное с типом открываемого файла, и запустить его.

 

Примечание.  Для использования в Builder необходимо добавить заголовочный файл:  

#include “ShellAPI.h”

 

Прототип функции имеет вид:

 

Void ShellExecute( HWND hWnd,

                              const char *Operation,

                              const char *FileName,

                              const char *Parameters,

                              const char *Directory,

                              unsigned int CmdShow )

 

hWnd - дескриптор родительского окна (можно указать Handle);

FileName - имя файла (или папки)

                  Параметр Operation      Действие
“open”  Открыть файл FileName
“print” Распечатать файл FileName
“explore” Открыть папку в проводнике
NULL По умолчанию – «open»

 

Parameters – для задания дополнительных аргументов командной строки.

Directory – каталог по умолчанию (при NULL – текущий каталог)

CmdShow – как для WinExec().

 

Примеры использования:

1. Запуск Word c открытием файла:

           ShellExecute(Handle, NULL, “file.doc”, NULL, NULL, SW_RESTORE);

2. Запуск калькулятора:

           ShellExecute(Handle, “open”, “Calc”, NULL, NULL, SW_RESTORE);

3. Открывает в Проводнике указанную папку:

            ShellExecute(Handle, “open”, “c:\\Program Files\\Borland”, NULL, NULL,

                                   SW_RESTORE);

 

Функция не возвращает значения. Если нужно диагностировать ошибку, то вызывается

GetLastError(). Ее нулевое значение говорит о нормальном завершении, ненулевое дает код ошибки.

 

int i = GetLastError();

if(i >0) ShowMessage(“Код ошибки - ” + IntToStr(i));

Дополнение.

 

Если текст метки Label создать как гиперссылку (например, http :// www . nstu . ru ), то можно открыть указанный сайт, если в ее обработчике OnClick записать:

 

AnsiString adres = Label1->Caption;

ShellExecute(Handle, “open”, adres.c_str(), NULL, NULL, SW_SHOW);

 

Аналогично можно запустить почтовую программу, если в метке указать свой e-mail:

 

AnsiString adres = “mailto:” + Label1->Caption;

ShellExecute(Handle, “open”, adres.c_str(), NULL, NULL, SW_SHOW);

 

 

Функция   CreateProcess

 

Новый процесс создается при вызове приложением функции CreateProcess

 

BOOL CreateProcess(

               LPCSTR lpApplicationName,
               LPSTR lpCommandLine,
               LPSECURITY_ATTRIBUTES lpProcessAttributes,
               LPSECURITY_ATTRIBUTES lpThreadAttributes,
               BOOL bInheritHandles,
               DWORD dwCreationFlags,
               LPVOID lpEnvironment,
               LPCSTR lpCurrentDirectory,
               LPSTARTUPINFO lpStartupInfo,
               LPPROCESS_INFORMATION lpProcessInformation

             );

 

При этомсистема создает объект ядра "процесс" с начальным значением счетчика числа его пользователей, равным 1. Этот объект - не сам процесс, а структура данных, через которую операционная система управляет процессом. Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные как для исполняемого файла, так и для любых DLL (если таковые требуются).

Далее система формирует объект ядра "поток" (со счетчиком, равным 1) для первичного потока нового процесса. Объект ядра "поток" — это также структура данных, через которую система управляет потоком. Если системе удается создать новый процесс и его первичный поток, Create Process возвращает true.

 


Дата добавления: 2019-07-15; просмотров: 180; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!