Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Общие сведения о процессах и потоках в ОС Windows

Любой процесс в ОС Windows определяется как основа выполняемой программы, стоящей из двух компонентов:

1) Объект ядра ОС – это часть ОС, состоящая из служебных структур данных с помощью которых, а так же с помощью вызова соответствующих системных функций осуществляется управление выполнением программ потоков и процессов;

2) Адресное пространство памяти, в котором представляются программные коды и данные всех exe и dll модулей, относящегося к выполняемым программа.

Существует другое определение объекта ядра:

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

  • Процессы (Process Objects);
  • Файлы;
  • Проекции файлов (File Mapping Objects);
  • Задания (Jet);
  • Мъютексы (Mutex);
  • Семафоры;
  • Каналы байт
  • И др.

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

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

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

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

Все программы, выполняемые под управлением Windows, подготавливаются с помощью соответствующих систем программирования. В большинстве из них основная часть исходного кода выполняемой программы помещается программистом внутри основной или входной функции.

Существует несколько видов этих функций:

1 - main(), wmain()

2 – Winmain(), wWinmain()

1 – для программ в текстовом, консольном режиме

2 – для программ в защищенном режиме работы процессора

Префикс w – используется Unicode

Существует следующая особенность выполнения этих функций:

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

1) Считывает из памяти указатель на полную командную строку указанного процесса;

2) Считывает указатель на переменные системного окружения этого процесса;

3) Инициирует глобальные переменные из библиотеки системы программирования;

4) Инициирует динамически используемую область памяти, отводимую для программы потока;

5) Вызывает конструкторы всех глобальных и статических объектов для соответствующих классов объектно-ориентированной системы программирования;

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

Описатель, командная строка и переменные окружении процесса.

Любому.exe.dll модулю загруженному в адресное пространство процесса присваивается специфические системная характеристика, т.е. единственный описатель процесса (описатель экземпляра процесса). Он передается в программу как первый параметр входной функции первого потока. Значение описателя используется в ходе выполнения процесса при вызовах системных функций загружающих те или иные ресурсы. Конкретное значение описателя равно базовому адресу, той части адресного пространство процесса в которуб загружается образ исполняемого exe или dll файла, значение этого адреса определяется компоновщиком на этапе сздания exe файла программы. Для нескольких широко используемых систем программирования этот адрес имеет фиксированное значение 0x400000. Значение этого адреса можно для любого процесса получить с помощью системной функции GetModuleHandle(). Параметром этой функции является строка символов, описывающая имя exe или dll файла и заканчивающаяся символом ‘0’. Если вызвать эту функцию из адресного пространства процесса с параметром NULL, то будет получен базовый адрес exe файла исполняемой программы в адресном пространстве процесса. При создании новому процессу передается строка символов называемая командной строкой. Она представляет собой полное имя исполняемой программы входного потока. В момент запуска программы стартовая функция считывает эту строку и использует эту информацию. Кроме того командная строка может читаться и анализироваться в программе любого потока процесса. Её можно прочитать с помощью системной функции GetCommandLine(). Параметром является описатель, а функция возвращает адрес командной строки. С любым процессом связывается так же системная структура данных, которая называется блоком переменных системного окружения. Физически это область памяти в которой хранятся текстовые строки описывающие переменные системного окружения. Строки имеют оющий формат: имя переменной 1 = значение 1 ’0’ имя переменной 2 =значение 2’0’

В системе существует исходный набор переменных системного окружения, которые хранятся в файле автозапуска: autoexec.bat. Переменные, описанные в нем доступны для всех процессов которые запускаются в текущем сеансе работы. Переменные системного окружения используются в программах потоков для целей детальной настройки выполнения программ. Например: для получения информации о размещении какого-либо файла во внешней памяти. В системе имеются две функции для работы с переменными системного окружения: GetEnirounmentVariable(), SetEnirounmentVariable() – получение; добавление, модификации и удаление.

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

Любой процесс создается путем вызова в прикладной программе системной функции CreateProcess() формат вызова в общем виде:

CreateProcess(P1,P2,..,P9), где

P1,P2,..,P9 – обобщенное название параметров функции.

В ходе выполнения этой функции система создает объект ядра типа «процесс» с начальными значением (один) одного из параметров, который называется счетчиком числа пользователей процесса. Затем система выделяет для нового процесса область ВАП и далее загружает в него программный код и данные всех exe и dll файлов процесса, затем формируется объект ядра типа «поток» для первичного потока нового процесса. Перед запуском программы этого потока вызывается и выполняется стартовая функция системы программирования, а затем начинает выполняться программные коды основной функции первичного потока.

Параметры данной функции позволяют получить дополнительную информацию о действиях при выполнении функции CreateProcess.

Параметр P1: представляет собой указатель на полную командную строку процесса. При выполнении функции CreateProcess эта строка читается и из неё выделяется имя исполняемого фала программы первичного потока, если в этом имени полный путь доступа не к=указан, то функция осуществялет поиск файла просматривая несколько каталогов в следующем порядке:

1. Каталог содержащий exe файл запускаемого процесса;

2. Текущий каталог создаваемого процесса;

3. Системный каталог Windows;

4. Основной каталог системы;

5. Каталоги перечисляемые в файле автозапуска.

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

Параметр P2, P3: определяют атрибуты защиты объектов типа процесс и поток, они используются для дочерних процессов, запускаемых из исходного. Атрибуты могут устанавливаться системой либо по-умолчанию, либо могут задаваться пользователем с помощью соответствующих структур данных. Эти структуры кроме того могут использоваться и для того чтобы создаваемый объект процесс или поток получил статус наследуемого.

Параметр P4: имеет логический тип и определяет возможность наследования в дочернем процессе описателя родительского процесса, если этот параметр имеет значение true, то система передает дочерним процессам наследуемые описатели родительского процесса и не передает, если параметр false.

Параметр P5: задает флаги, которые определяют некоторые свойства задаваемого процесса.

Примеры:

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

2. Флаг позволяющий создавать новый процесс и в то же время приостанавливать запуск его первичного потока, это позволяет родительскому процессу выполнять какие0либо дополнительные действия. Например: изменять содержимое памяти в адресном пространстве дочернего процесса, изменять приоритет первичного потока дочернего процесса. После выполнения всех предварительных действий выполнения дочернего процесса может быть разрешено;

3. Флаги (2шт) определяют порядок работы с консольными окнами, создаваемыми в родительском или дочерних процесса;

4. Флаги (2шт) определяющие порядок выполнения в системах 16ти разрядных программ. Для таких программ в системе создается специальный режим работы, который называется виртуальной DOS-машиной (Virtual DOS-mashine) – VDM. Флаги определяют является ли эта машина одной для всех 16ти разрядных программ или для каждой из программ создается отдельная VDM. Эти флаги используются в Windows 2000/XP. P5 позволяет кроме того задавать процессу один их 6ти возможных классов приоритета:

1. Простаивающий;

2. Ниже обычного;

3. Обычный;

4. Выше обычного;

5. Высокий;

6. Реального времени.

Классы приоритета влияют на распределение процессорного времени.

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

Параметр P7: устанавливает текущий диск и текущий каталог для дочернего процесса.

Параметр P8: представляет собой указатель на системную структуру данных STARTUPINFO, элементы которой содержат различные дополнительные характеристики процесса, например: имя рабочего стола на котором запускается программа первичного потока, заголовок консольного окна координаты x,y верхнего левого угла окна программы, ширина и высота окна и др.

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

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

Процесс в системе Windows может быть завершен 4мя способами:

1. Путем возврата управления из основной функции первичного потока процесса;

2. Вызовом системной функции завершения процесса ExitProcess(). Функция может вызываться в одном из потоков данного процесса;

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

4. Одновременном выполнении во всех потоках данного процесса функции завершения потока ExitThread() или функции уничтожения потока TerminateThread().

Наиболее правильным и рациональным является 1ый способ завершения, поскольку в этом случае гарантируется нормальное освобождение всех занятых ресурсов принадлежащих первичному потоку процесса. В этом случае система выполняет следующие действия:

1. Все объекты и классы созданные в потоке уничтожаются соответствующими деструкторами;

2. Освобождается память, которую занимал стек первичного потока;

3. Устанавливается код завершения процесса, который возвращается из основной функции программы первичного потока;

4. Счетчик числа пользователей объекта ядра типа процесс уменьшается на 1.

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

Второй способ: функция ExitPRocess() завершает текущий процесс и принимает код его завершения из основной функции первичного потока. Данная функция не имеет возвращаемого значения, она вызывается из исполняемого при нормальном завершении процесса в рамках выполнения стартовой функции после того, как в первичном потоке заканчиваются все оерации. Но самостоятельный вызов этой функции в любом потоке процесса в принципе возможен, но этот вызов имеет особенности. Они состоят в том, что текущий процесс уничтожается, но в то же время выполнение основной функции первичного потока может быть еще не завершено в результате все ранее созданные объектно ориентированные элементы программы будут уничтожаться не их деструкторами, как должно быть в нормальной ситуации, а их функции прекращается за счет внешнего воздействия. Такое почти принудительное завершение может привести к непредсказуемым ошибкам в системе, поэтому применять функцию ExitProcess для самостоятельного завершения выполнения процесса не рекомендуется.

Третий способ: Применение функции TerminateProcess, её отличие от ExitProcess состоит в том что она может быть вызвана в любом потоке другого процесса. Входным параметром этой функции является описатель завершаемого процесса, а выходным код завершения процесса. Обычно эта функция используется в крайних случаях когда требуется экстренное завершение процесса. Как правило действие этой функции оказывается неожиданным для текущего процесса а поэтому он не успевает выполнить все операции по нормальному завершению, например: закрытие объектов, освобождение ресурсов сохранение промежуточных результатов в внешней памяти, все эти операции выполняются системой и при этом увеличивется вероятность потери промежуточных данных процесса.

Четвертый способ: соответствует случаю, когда во всех потоках процесса одновременно выполняются функции закрытия потока ExitThread, либо все они из вне закрываются вызовом функции TerminateThread. В этом случае система обнаруживает, что все потоки процесса не выполняются и она завершает данный процесс, кодом завершения равным коду завершения последнего потока процесса.

Во всех четырех случаях завершение процесса системой дополнительно выполняются следующие действия:

1. Выполнение всех потоков процесса прекращается;

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

3. Формируется код завершения процесса;

4. Объект ядра типа процесс переходит в свободное состояние и значение счетчика пользователей этого объекта уменьшается на 1.

Связанный с завершаемым процессом объект ядра полностью не освобождается до тех пор, пока не буту закрыты ссылки на него из других процессов, если эти ссылки создавались. Это событие произойдет тогда когда все другие процессы, открывшие у себя описатель завершаемого процесса, вызовут функцию CloseHandle(…) и тем самым уведомят систему о том, что ссылки на данный процесс им больше не нужны, когда состояние счетчика объекта ядра станет ранвым нулю этот объект полностью освобождается.

Общие сведения о потоках.

Создание потоков.

Потоки создабтся внутри процессов и определяют последовательность исполнения программного кода в адресном пространстве конкретного процесса. Любой поток состоит из двух частей:

1. Объект ядра типа поток, в котором хранится статистическая информация о потоке и с помощью которого система управляет потоком;

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

В отличие от процессов потоки используют значительно меньше системных ресурсов, это объясняется тем, что образование процесса в отличие от потока связано с выделением ВАП на что требуется дополнительные системные ресурсы. В частности много памяти расходуется для хранения статистических данных о процессах, сведение о файловых ресурсах требуемых для загрузки exe и dll файлов и др. информации. Для потока необходимы лишь ресурсы для создания объекта типа поток и стека. Объем статистических сведений о потоке требует гораздо меньше памяти. При инициализации процесса в системе всегда автоматически создает первичный поток. В ходе выполнения программы основной функции этого потока могут создаваться новые потоки. Любой новый поток создается вызовом в первичном потоке системной функции создания потока CreateThread(P1, P2,…,P6).

<== предыдущая лекция | следующая лекция ==>
Управление процессами и потоками в мультипрограммных ОС | Свойства a-излучения
Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 1295; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.04 сек.