Процессы и потоки в ОС Windows :06:23 1 Процесс это просто экземпляр выполняемой программы, включая текущие значения счетчика команд, регистров.

Презентация:



Advertisements
Похожие презентации
Учебный курс Основы операционных систем Лекция 3 кандидат физико-математических наук, доцент Карпов Владимир Ефимович.
Advertisements

Учебный курс Основы операционных систем Лекция 2 кандидат физико-математических наук, доцент Карпов Владимир Ефимович.
Структура ОС Windows Подсистема Win32 Объекты ядра Процессы и потоки в ОС Windows Планирование потоков 1 Лекция 4. Управление процессами в ОС Windows NT.
Подпрограммы 1.Принцип модульности 2.Область действия переменных 3.Параметры подпрограмм 4.Модули.
Системы реального времени Лекция 4: процессы. Понятие процесса Процесс - фундаментальное понятие любой операционной системы С помощью процессов происходит.
Процессы и потоки. Процессы В общем представлении, процесс - это программа, выполняющаяся в оперативной памяти компьютера. Реально, все гораздо сложней.
Объекты ядра Дескрипторы объектов ядра Создание и удаление объектов Свободное (signaled) и занятое (non-signaled) состояния События Мьютексы Семафоры Лекция.
Операционная система MS Windows* Развитие ОС: пакетная обработка, интерактивные системы, ОС реального времени, системы с разделением времени. Истинная.
Демидов А.В г. Операционные системы Лекция 3 Процессы.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
Лекция 2 Управление задачами Процессы и потоки. Процесс Выполнение пассивных инструкций компьютерной программы на процессоре ЭВМ. Стандарт ISO 9000:2000.
Планирование и диспетчеризация процессов и задач Операционные системы и среды ВМ-1 3 курс.
Управление процессами и потоками в Microsoft Windows Представление процессов Диспетчеризация процессов и потоков Планирование процессов и потоков.
Операционные системы Процессы и потоки Скрипов Сергей Александрович 2009.
Операционная система. Базовые понятия Операционная система – это комплекс программ, обеспечивающий контроль за существованием, распределением и использованием.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Создание процессов в Windows, часть II BOOL CreateProcess ( LPCTSTR lpApplicationName, // имя исполняемого модуля LPTSTR lpCommandLine, // команда командной.
Лекция 3 Операторы Цикла 1 Российский государственный университет нефти и газа имени И.М. Губкина Кафедра «Информатики»
Управление процессами. Определение процесса. Основные понятия Процесс совокупность машинных команд и данных, которая обрабатывается в рамках вычислительной.
Учебный курс Операционные среды, системы и оболочки Лекция 5 Лекции читает доктор технических наук, профессор Назаров Станислав Викторович.
Транксрипт:

Процессы и потоки в ОС Windows :06:23 1 Процесс это просто экземпляр выполняемой программы, включая текущие значения счетчика команд, регистров и переменных. Концептуально у каждого процесса есть свой, виртуальный, центральный процессор. Процесс является динамическим объектом, описывающим выполнение программы. В Windows NT процесс – это объект, создаваемый и уничтожаемый менеджером объектов. Процесс содержит потоки, учетную информацию и ссылоки на системные ресурсы : закрытое адресное пространство, семафоры, коммуникационные порты, файлы и т. д. Процесс характеризуется текущим состоянием ( выполнение, ожидание, готовность и т. д.), которые обобществляются всеми потоками процесса. Задача ОС состоит в том, чтобы организовать их поддержку, которая подразумевает, что каждый процесс получит все необходимые ему ресурсы ; Независимые процессы не должны влиять друг на друга, а процессы, которым необходимо обмениваться информацией, должны иметь возможность сделать это путем межпроцессного взаимодействия.

Процессы и потоки в ОС Windows :06:23 2 Для описания процесса ОС поддерживает набор структур, главную из которых принято называть блоком управления процессом (PCB, Process control block). Состав PCB: идентификатор процесса ; токен доступа - исполняемый объект, содержащий информацию о безопасности ; базовый приоритет - основа для исполнительного приоритета нитей процесса ; процессорная совместимость - набор процессоров, на которых могут выполняться нити процесса ; предельные значения квот - максимальное количество страничной и не страничной системной памяти, дискового пространства, предназначенного для выгрузки страниц, процессорного времени - которые могут быть использованы процессами пользователя ; время исполнения - общее количество времени, в течение которого выполняются все нити процесса.

Внутреннее устройство процессов в ОС Windows :06:23 3 Блок управления процессом (PCB) реализован в виде набора связанных структур, главная из которых называется блоком процесса EPROCESS. ProcExp

Создание процесса :06:23 4 Обычно процесс создается другим процессом вызовом Win32- функции CreateProcess. Создание процесса осуществляется в несколько этапов : 1)на диске отыскивается нужный файл - образ, после чего создается объект " раздел " памяти для проецирования на адресное пространство нового процесса (kernel32.dll); 2)выполняется обращение к системному сервису NtCreateProcess для создания объекта " процесс ". Формируются блоки EPROCESS, KPROCESS и блок переменных окружения PEB. Менеджер процессов инициализирует в блоке процесса маркер доступа ( копируя аналогичный маркер родительского процесса ), идентификатор и другие поля ; 3)создание первичного потока ( сервис NtCreateThread, библиотека kernel32.dll); 4) kernel32. dll посылает подсистеме Win32 сообщение, которое содержит информацию, необходимую для выполнения нового процесса. Данные о процессе и потоке помещаются, в список процессов и список потоков данного процесса, затем устанавливается приоритет процесса, создается структура, используемая частью Win32, которая работает в режиме ядра, и т. д.; 5)запускается первичный поток, для чего формируются его начальный контекст и стек, и выполняется запуск стартовой процедуры потока режима ядра KiThreadStartup. После этого стартовый код из библиотеки C/C++ передает управление функции main() запускаемой программы.

Создание процесса. Функция CreateProcess :06:23 5 BOOL CreateProcess( PCTSTR pszApplicationName, //имя программы; PTSTR pszCommandLine, //параметры командной строки; SECURITY_ATTRIBUTES psaProcess, //атрибуты безопасности процесса; PSECURITY_ATTRIBUTES psaThread, //атрибуты безопасности главного потока; BOOL bInheritHandles, //- если bInheritHandles == TRUE, то созданный процесс (запущенная программа), наследует дескрипторы (handles) запускающей программы; DWORD fdwCreationFlags, //- параметры создания. Здесь можно указать класс приоритета создаваемого процесса и некоторые дополнительные параметры; PVOID pvEnvironment, // - указатель на блок окружения или NULL, тогда используется блок окружения родителя; PCTSTR pszCurDir, // текущая директория или NULL, тогда используется текущая директория родителя; PSTARTUPINFO psiStartInfo, //- указатель на структуру STARTUPINFO, которая определяет положение главного окна; PPROCESS_INFORMATION ppiProcInfo //информация о созданном процессе. );

Создание процесса ( пример ) :06:23 6 #include void main( VOID ) { STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcInfo; TCHAR CommandLine[] = TEXT(format c:"); ZeroMemory( &StartupInfo, sizeof(StartupInfo) ); StartupInfo.cb = sizeof(StartupInfo); ZeroMemory( &ProcInfo, sizeof(ProcInfo) ); if( !CreateProcess( NULL, // Не используется имя модуля CommandLine, // Командная строка NULL, // Дескриптор процесса не наследуется. NULL, // Дескриптор потока не наследуется. FALSE, // Установка описателей наследования 0, // Нет флагов создания процесса NULL, // Блок переменных окружения родит. процесса NULL, // Использовать текущий каталог родит. процесса &StartupInfo, // Указатель на структуру STARTUPINFO. &ProcInfo ) // Указатель на структуру информации о процессе. ) printf( "CreateProcess failed." ); // Ждать окончания дочернего процесса WaitForSingleObject( ProcInfo.hProcess, INFINITE ); // Закрыть описатели процесса и потока CloseHandle( ProcInfo.hProcess ); CloseHandle( ProcInfo.hThread ); } Приложение createprocesscreateprocess

Завершение процесса :06:23 7 Процесс завершается если : Входная функция первичного потока возвратила управление. Один из потоков процесса вызвал функцию ExitProcess. Поток другого процесса вызвал функцию TerminateProcess. Когда процесс завершается, все User- и GDI- объекты, созданные процессом, уничтожаются, объекты ядра закрываются ( если их не использует другой процесс ), адресное пространство процесса уничтожается. Рассмотрим, как это реализуется на практике.

Получение идентификатора процесса :06:23 8 Для получения идентификатора процесса (pid) рассмотрим функцию, которая будет определять PID по имени файла. Для этого необходимо получить snapshot ( снимок ) системных процессов с помощью функции CreateToolhelp32Snapshot(), а затем функциями Process32First() и Process32Next() перебираются все процессы для поиска нужного. Здесь существенную роль играет структура PROCESSENTRY32, которая как раз содержит информацию как об имени файла ( элемент szExeFile), так и об идентификаторе процесса ( элемент th32ProcessID). typedef struct tagPROCESSENTRY32 { DWORD dwSize; // Рамер структуры DWORD cntUsage; // Число ссылок на процесс. Процесс уничтожается, // когда число ссылок становится 0 DWORD th32ProcessID; // Идентификатор процесса DWORD th32DefaultHeapID; // Идентификатор основной кучи DWORD th32ModuleID; // идентификатор модуля DWORD cntThreads; // Число потоков DWORD th32ParentProcessID; // Идентификатор родителя LONG pcPriClassBase; // приоритет по умолчанию DWORD dwFlags; // Зарезервировано CHAR szExeFile[MAX_PATH]; // Собственно имя процесса } PROCESSENTRY32,*PPROCESSENTRY32,*LPPROCESSENTRY32;

Получение идентификатора процесса :06:23 9 procedure TForm1.Button1Click(Sender: TObject); var han : THandle; pi : TProcInfo; // from "tlhelp32" in uses clause sID : string; begin LB.Items.Clear; // Get a snapshot of the system han := CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 ); if han = 0 then exit; pi:=TProcInfo.Create; pi.ProcStruct.dwSize := sizeof( PROCESSENTRY32 ); if Process32First( han, pi.ProcStruct ) then repeat sID := ExtractFileName( pi.ProcStruct.szExeFile ); while length(sID)<50 do sID:=sId+' ; sID:=sID+'|'; sID:=sID+' '+IntToStr(pi.ProcStruct.th32ProcessID); LB.Items.AddObject(sId,pi); pi:=TProcInfo.Create; pi.ProcStruct.dwSize := sizeof( PROCESSENTRY32 ); until not Process32Next( han, pi.ProcStruct); end; Приложение WinProcListWinProcList

Получение списка окон и классов :06:23 10 procedure TForm1.Button2Click(Sender: TObject); var Wnd: hWnd; buff: array[0..127] of Char; classname : array[ ] of Char; s : string; pc : PAnsiChar; nc : integer; begin LB.Clear; Wnd := GetWindow(Handle, gw_HWndFirst); while Wnd <> 0 do begin { Не показываем :} if (Wnd <> Application.Handle) and {- Собственное окно } IsWindowVisible(Wnd) and {- Невидимые окна } (GetWindow(Wnd, gw_Owner) = 0) and {- Дочерние окна } (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) { Окна без заголовков } then begin GetWindowText(Wnd, buff, sizeof(buff)); nc:=GetClassName(Wnd,pc,1023); s:=StrPas(buff); while length(s)<40 do s:=s+' '; s:=s+' | '+StrPas(classname); LB.Items.Add(s); end; Wnd := GetWindow(Wnd, gw_hWndNext); end;

Жизненный цикл потока :06:23 11 Каждый новый процесс содержит, по крайней мере, один поток Потоки составляют основу планирования Готовность. У нити есть все для выполнения, но не хватает только процессора. Первоочередная готовность (standby). Для каждого процессора системы выбирается одна нить, которая будет выполняться следующей. Выполнение. Как только происходит переключение контекстов, нить переходит в состояние выполнения и находится в нем до тех пор, пока либо ядро не вытеснит ее.

Жизненный цикл потока :06:23 12 Ожидание. Нить по своей инициативе ожидает некоторый объект для того, чтобы синхронизировать свое выполнение ; операционная система ( например, подсистема ввода - вывода ) может ожидать в интересах нити ; подсистема окружения может непосредственно заставить нить приостановить себя. Переходное состояние. Нить готова к выполнению, но ресурсы, которые ей нужны, заняты. Завершение. Когда выполнение нити закончилось, она входит в состояние завершения. Находясь в этом состоянии, нить может быть либо удалена, либо не удалена. Код ядра выполняется в контексте текущего потока. Это означает, что при прерывании, системном вызове и т д., то есть когда процессор переходит в режим ядра и управление передается ОС, переключения на другой поток ( например, системный ) не происходит. Контекст потока при этом сохраняется, поскольку операционная система все же может принять решение о смене характера деятельности и переключении на другой поток. Вследствие этого состояние " Выполнение " разделяют на " Выполнение в режиме пользователя " и " Выполнение в режиме ядра. Поэтому у каждого потока два стека, один работает в режиме ядра, другой - в режиме пользователя. Один и тот же стек не может использоваться и в режиме пользователя, и в режиме ядра. Любой поток может делать все что угодно со своим собственным стеком ( стеком режима пользователя ), в том числе организовывать несколько стеков и переключаться между ними. Поток сам может определять размер своего стека.

Внутреннее устройство потоков :06:23 13 Объект - нить имеет следующие атрибуты : Идентификатор клиента - уникальное значение, которое идентифицирует нить при ее обращении к серверу. Контекст нити - содержит текущее состояние регистров, стеков и индивидуальной области памяти, которая используется подсистемами и библиотеками. Динамический приоритет - значение приоритета нити в данный момент. Базовый приоритет - нижний предел динамического приоритета нити. Процессорная совместимость нитей - перечень типов процессоров, на которых может выполняться нить. Время выполнения нити - суммарное время выполнения нити в пользовательском режиме и в режиме ядра, накопленное за период существования нити. Состояние предупреждения - флаг, который показывает, что нить должна выполнять вызов асинхронной процедуры. Счетчик приостановок - текущее количество приостановок выполнения нити.

Планирование потоков :06:23 14 Выбор текущего потока из нескольких активных потоков, пытающихся получить доступ к процессору называется планированием. Выбранный для выполнения поток работает в течение некоего периода, называемого квантом, по истечении которого поток вытесняется Предполагается, что поток не знает, в какой момент он будет вытеснен. Поток также может быть вытеснен даже, если его квант еще не истек. Процедура планирования обычно связана с весьма затратной процедурой диспетчеризации - переключением процессора на новый поток, поэтому планировщик должен заботиться об эффективном использовании процессора. Принадлежность потоков к процессу при планировании не учитывается, то есть единицей планирования в ОС Windows является именно поток. В ОС Windows запуск процедуры планирования вызывается одним из следующих событий. События, связанные с освобождением процессора : (1) Завершение потока (2) Переход потока в состояние готовности в связи с тем, что его квант времени истек (3) Переход потока в состояние ожидания События, в результате которых пополняется или может пополниться очередь потоков в состоянии готовности. (4) Поток вышел из состояния ожидания (5) Поток только что создан (6) Деятельность текущего потока может иметь следствием вывод другого потока из состояния ожидания.

Алгоритмы планирования потоков :06:23 15 В ОС Windows реализовано вытесняющее приоритетное планирование, когда каждому потоку присваивается определенное числовое значение - приоритет, в соответствии с которым ему выделяется процессор. Потоки с одинаковыми приоритетами планируются согласно алгоритму Round Robin ( карусель ). В системе предусмотрено 32 уровня приоритетов. Шестнадцать значений приоритетов (16-31) соответствуют группе приоритетов реального времени, пятнадцать значений (1-15) предназначены для обычных потоков, и значение 0 зарезервировано для системного потока обнуления страниц. Класс приоритета для всех потоков конкретного процесса можно задать с помощью набора констант - параметров функции SetPriorityClass, которые могут иметь следующие значения : реального времени (REALTIME_PRIORITY_CLASS), высокий (HIGH_PRIORITY_CLASS), выше нормы (ABOVE_NORMAL_PRIORITY_CLASS), нормальный (NORMAL_PRIORITY_CLASS), ниже нормы (BELOW_NORMAL_PRIORITY_CLASS) неработающий (IDLE_PRIORITY_CLASS).

Приоритеты потоков :06:23 16 Пользовательские потоки работают с приоритетами от 1 до 15. Устанавливая приоритеты процесса и потока, пользователь может отдавать преимущество тому или иному потоку. Нулевой поток работает в фоновом режиме и съедает все процессорное время, на которое больше никто не претендует. Его работа заключается в обнулении страниц для менеджера памяти. Если и у этого потока нет работы, работает пустой поток. Однако он не является полноценным потоком. Со временем для улучшения производительности системы в базовом алгоритме планирования было сделано несколько усовершенствований. При определенных условиях текущий приоритет пользовательского потока может быть поднят операционной системой выше базового приоритета, но никогда не может быть установлен выше приоритета 15. Для потоков с приоритетами 15 и выше никогда не делается никаких изменений приоритета. Приоритет потока увеличивается : 1) Когда завершается операция ввода - вывода и освобождает ожидающий ее поток, приоритет потока увеличивается, чтобы дать шанс этому потоку быстрее запуститься и снова запустить операцию ввода - вывода. Суть в том, чтобы поддерживать занятость устройств ввода - вывода. Величина, на которую увеличивается приоритет, зависит от устройства ввода - вывода. Как правило, это 1 для диска, 2 для последовательной линии, 6 для клавиатуры и 8 для звуковой карты. 2) Если поток ждал семафора, мьютекса или другого события, то когда он отпускается, к его приоритету прибавляется две единицы, если это поток переднего плана ( то есть процесс, управляющий окном, которому в данный момент направляется ввод с клавиатуры ), и одна единица в противном случае.

Приоритеты потоков :06:23 17 Есть еще один случай, при котором система изменяет приоритеты потоков. Представьте, что два потока работают вместе в задаче типа " производитель - потребитель ". Работа производителя труднее, поэтому он получает более высокий приоритет, например 12, а потребитель получает приоритет 4. В определенный момент производитель заполняет до отказа общий буфер и блокируется на семафоре Прежде чем потребитель снова получит шанс поработать, посторонний процесс с приоритетом 8 приходит в состояние готовности и получает управление. Этот поток сможет работать столько, сколько захочет, так как его приоритет выше приоритета потребителя, а производитель, хоть и с большим приоритетом, заблокирован. При таких условиях производитель никогда снова не получит управления, пока поток с приоритетом 8 не остановится.

Приоритеты потоков :06:23 18 В операционной системе Windows 2000 эта проблема решается при помощи большой кувалды. Система следит, сколько времени прошло с тех пор, когда готовый к работе поток запускался в последний раз. Если какой - либо поток превысит определенный интервал времени, он получает на два кванта времени приоритет 15. Это может помочь разблокировать производителя. После двух квантов прибавка приоритета резко убирается. Вероятно, лучшим решением было бы наказывать потоки, которые полностью используют свои кванты снова и снова. В конце концов, проблему создает не поток, умирающий от голода, а жадный поток. Эта проблема хорошо известна под названием инверсии приоритетов. Классы приоритетов процессов Критичный ко времени Самый высокий Выше нормы Нормаль ный Ниже нормы Самый низкий Неработающ ий Ниже нормы Нормальный Выше нормы Высокий Реального времени