Информационные потоки

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

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 03.10.2010
Размер файла 186,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

ПОТОКИ

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

Поток (Thread) - это независимый путь выполнения внутри процесса, разделяющий вместе с процессом общее адресное пространство, код и глобальные данные.

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

Потоки делят между собой элементы своего процесса:

? Адресное пространство

? Глобальные переменные

? Открытые файлы

? Таймеры

? Семафоры

? Статистическую информацию.

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

Преимущества использования потоков

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

2. Быстрота создания потока, по сравнению с процессом, примерно в 100 раз.

3. Повышение производительности самой программы, т.к. есть возможность одновременно выполнять вычисления на процессоре и операцию ввода/вывода. Пример: текстовый редактор с тремя потоками может одновременно взаимодействовать с пользователем, форматировать текст и записывать на диск резервную копию.

Реализация потоков в пространстве пользователя и ядра (рис.2)

В случае А ядро о потоках ничего не знает. Каждому процессу необходима таблица потоков, аналогичная таблице процессов.

Преимущества случая А:

? Такую многопоточность можно реализовать на ядре не поддерживающим многопоточность

? Более быстрое переключение, создание и завершение потоков

? Процесс может иметь собственный алгоритм планирования.

Недостатки случая А:

? Отсутствие прерывания по таймеру внутри одного процесса

? При использовании блокирующего (процесс переводится в режим ожидания, например: чтение с клавиатуры, а данные не поступают) системного запроса все остальные потоки блокируются.

? Сложность реализации

Особенности реализации Windows

Используется четыре понятия:

1. Задание - набор процессов с общими квотами и лимитами

2. Процесс

3. Поток

4. Волокно - облегченный поток, управляемый полностью в пространстве пользователя

В исходном состоянии поток находится в приостановленном состоянии.

Основные составляющие потока в исполнительной системе таковы:

? Уникальный указатель, называемый хэндлом потока.

? Содержимое набора регистров, отображающее состояние процессора.

? Два стека: один используется потоком при работе в пользовательском режиме, а другой -- в режиме ядра.

? Собственная область памяти, предназначенная для использования подсистемами, библиотеками периода выполнения и динамически подключаемыми библиотеками (DLL).

Регистры, стек и собственная область памяти называются контекстом (context) потока. Фактические данные, составляющие контекст потока, зависят от типа процессора.

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

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

? идентификатор потока,

? данные о правах доступа и приоритете,

? данные о состоянии потока и др.

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

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

Таблица 1

Атрибуты объекта-потока

Атрибут

Назначение

Идентификатор клиента

Уникальное значение, идентифицирующее поток при вызове им сервера

Контекст потока

Набор значений регистров и других непостоянных данных, определяющих состояние выполнения потока

Базовый приоритет

Нижний предел динамического приоритета потока

Динамический приоритет

Приоритет потока на данный момент

Процессорное сродство потока

Набор процессоров, на которых может исполняться поток, (неполное) подмножество процессорного сродства процесса потока

Время выполнения потока

Общее время выполнения потока в пользовательском режиме и режиме ядра

Статус оповещения

Флаг, указывающий на необходимость отработки потоком асинхронного вызова процедуры (АРС)

Счетчик приостановок

Количество приостановок выполнения потока без последующего возобновления

Маркер имперсонации

Временный маркер доступа, позволяющий потоку выполнять действия от имени другого процесса (используется подсистемами)

Порт завершения

Канал коммуникации между процессами, в который диспетчер процессов посылает сообщение при завершении потока (используется подсистемами)

Код завершения потока

Причина завершения потока

Аналогично, каждый поток имеет базовый уровень приоритета, который лежит в диапазоне от двух уровней ниже базового приоритета процесса до двух уровней выше этого приоритета, как показано на рис.3.

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

Таким образом, каждый процесс должен иметь, по меньшей мере, один поток.

Создание потока в большей степени напоминает программу для Windows, чем создание процесса. Дело в том, что для создания потока используется функция CreateThread() (аналог WinMain()), одним из аргументов которой является указатель на функцию потока (аналог оконной функции). Для создания потока требуется следующая информация:

- Размер стека потока.

- Атрибуты защиты потока. Для указания установленной по умолчанию защиты в NT/XP/2000 либо в среде Windows 9.x, где защита не поддерживается, можно использовано значение NULL.

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

- Дополнительное 32-разрядное значение, которое передается в процедуру потока.

- Флаги, которые, помимо прочего, допускают установку уровня приоритета потока.

- Адрес для хранения идентификатора потока. Идентификатор потока представляет собой уникальное системное значение.

Функция CreateThread(). При вызове этой функции происходит следующее:

- в памяти создаются все необходимые для управления потоком структуры (назовем их объектом "поток");

- код завершения потока инициализируется значением STILL_ACTIVE;

- создается структура типа CONTEXT для потока;

- создается стек потока;

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

Синтаксис функции следующий.

HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadld);

Параметры:

lpThreadAttributes - является указателем на структуру типа SECURITY_ATTRIBUTES. В Windows 9x атрибуты безопасности не используются, то обычно этот аргумент равен NULL.

dwStackSize - определяет размер выделяемого потоку стека. Если в качестве этого параметра указан 0, то поток будет иметь стек такого же размера, как и у породившего его потока.

lpStartAddress - собственно и определяет поток, так как является адресом точки входа функции потока. Функция потока может иметь имя, определяемое программистом, но должна иметь следующий синтаксис

DWORD WINAPI ThreadFunction(LPVOID lpParameter);

Четвертый аргумент - lpParameter - это параметр, передаваемый функции потока. Что и каким образом передается в этом параметре, совершенно неважно. Это могут быть всевозможные данные, которые функция потока может использовать для своей работы.

Если пятый аргумент - dwCreationFlags - равен нулю, то выполнение потока начнется немедленно. Если этот аргумент будет равен CREATE_SUSPENDED, то начало выполнение потока будет задержано до определенных событий, например, до вызова функции ResumeThread().

В значение, определяемое последним параметром - lpThreadId - записывается идентификатор созданного потока.

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

Завершение потока

Как и процесс, поток может быть завершен двумя способами - вызовом функции ExitThread() и обращением к функции TerminateThread(). Отличаются они друг от друга примерно тем же, что и функции ExitProcess() и TerminateProcess().

Функция ExitThread() используется для нормального завершения потока. Естественно, что она вызывается изнутри потока. Она описана в файле winbase.h следующим образом

VOID ExitThread(DWORD dwExitCode)

Параметр:

dwExitCode - код завершения этой функции.

Функцию TerminateThread() следует вызывать только в крайних случаях, когда поток завис, и ни на какие действия пользователя не реагирует. Функция вызывается из какого-либо внешнего (по отношению к завершаемому) потока, a ее аргументами являются хэндл завершаемого потока и двойное слово, в которое будет записан код завершения потока. Описание функции в файле winbase.h выглядит следующим образом,

BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);

Параметры:

hThread - хэндл объекта завершаемого процесса.

dwExitCode - код завершения процесса.

Возвращаемое значение: если выполнение завершения произошло удачно, то TRUE, иначе - FALSE.

При завершении потока выполняются следующие действия.

1. Освобождаются или удаляются все занятые или созданные объекты. Действие является стандартным и ничего особенного собой не представляет.

2. Поток получает статус незанятого (signaled).

3. Код завершения процесса меняется со STILL_ACTIVE на указанный при вызове завершающей поток функции.

4. Уменьшается счетчик пользователей потока. Если пользователей потока больше не осталось, и поток является единственным потоком процесса, то завершается и процесс.

Момент выборки потока на выполнение осуществляется в соответствии с принятым в данной системе правилом предоставления процессорного времени и с учетом всех существующих в данный момент потоков и процессов.

По сравнению с Windows NT 4 в интерфейс Win32 API было введено, новое понятие волокон. Под волокном (fiber) понимается упрощенный поток, выполнение которого планируется в приложении вручную. Волокна выполняются в контексте потоков, в которых планируется их применение, и допускают полную их идентификацию с потоками.

Суть: потоки работают в режиме пользователя, но при системных вызовах переключаются в режим ядра. Из-за переключения в режим ядра и обратно, очень замедляется работа системы. Поэтому было введено понятие волокна.

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

Благодаря тому, что волокно допускает сходство с родительским потоком, оно разделяет вместе с потоком общую локальную память, а если волокно вызывает функции, которые, как правило, оказывают влияние на поток, в частности, ExitThread(), тогда эти функции выполняются и для потока. Например, если волокно обращается к функции ExitThread(), то в этом случае выполняется выход из потока, который создал это волокно. Однако у волокна отсутствует информация о состоянии, которая с ним связана и аналогична таковой, но связанной с потоком. Единственная информация о состоянии волокна сохраняется в его стеке, представляющем собой подмножество регистров, которые, как правило, сохраняются между вызовами функций, К этой же информации можно отнести и данные о волокне, предоставляемые, во время его создания.

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

Перед планированием в приложении первого волокна для создания области, в которой сохраняется информация состояния волокна, вызывается функция ConvertThreadToFiber(). При этом поток превращается в выполняемое в настоящий момент волокно. К хранимой информации состояния этого волокна относятся также и данные, переданные функции ConvertThreadToFiber() в ее аргументе.

LPVOID ConvertThreadToFiber (LPVOID lpParameter)

Параметры:

lpParameter - единственная переменная, которая передается волокну. Волокно выбирает ее значение, используя функцию GetFiberData().

Возвращаемое значение: если выполнение завершения произошло удачно, то возвращается адрес волокна, иначе - NULL.

Для создания волокон в приложении применяется функция CreateFiber().

LPVOID CreateFiber (DWORD dwStackSize, LPFIBER_START_ROUTINE lpStartAdress, LPVOID lpParameter)

Параметры:

dwStackSize - размер стека волокна в байтах;

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

lpParameter - единственная переменная, которая передается волокну. Волокно выбирает ее значение, используя функцию GetFiberData().

Возвращаемое значение: если выполнение завершения произошло удачно, то возвращается адрес волокна, иначе - NULL.

Начальный адрес, как правило, указывается для предоставляемой пользователем функции, называемой также функцией волокна (Fiber function). Эта функция обратного вызова имеет синтаксис

VOID WINAPI FiberFunc (PVOID lpParameter),

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

VOID SwitchToFiber (LPVOID lpFiber),

Параметры:

lpFiber - адрес запускаемого волокна.

Возвращаемое значение: не имеет.

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

VOID DeteteFiber (LPVOID lpFiber),

Параметры:

lpFiber - адрес удаляемого волокна.

Возвращаемое значение: не имеет.

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


Подобные документы

  • Особенности разработки при использовании потоков. Создание, удаление переменных. Свойства, управление потоками. Вызовы для создания мутекс. Причины завершения потока. Методы синхронизации выполнения потоков. Типичная последовательность действий с мутест.

    лекция [160,8 K], добавлен 29.07.2012

  • Создание потока путем реализации интерфейса Runnable. Диспетчеризация, имена, приоритеты и определение работающих потоков. Взаимная их блокировка и корректное завершение. Применение методов wait(), notify(), notifyAll(). Завершение потока с interrupt().

    презентация [116,7 K], добавлен 21.06.2014

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

    курсовая работа [27,4 K], добавлен 18.05.2013

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

    лабораторная работа [884,9 K], добавлен 01.05.2014

  • Выбор беспроводной технологии передачи данных. Механизмы управления качеством передачи потоков. Программное обеспечение приемной и передающей станции. Эксперименты, направленные на изучение неравномерности передаваемого потока данных при доступе к среде.

    дипломная работа [1,1 M], добавлен 18.05.2012

  • Цель, назначение, функции, области применения и направления развития прикладной информационной технологии, структура ее информационных потоков. Основные элементы, техническая, программная и информационная реализация автоматизированного рабочего места.

    контрольная работа [239,5 K], добавлен 01.04.2009

  • Актуальность внедрения автоматизированных информационных систем (АИС) в бюджетный процесс. Осуществление бюджетного планирования и управления с помощью АИС "Финансы" и "Бюджет". Разработка электронного бюджета с целью улучшения информационных потоков.

    реферат [39,2 K], добавлен 04.10.2013

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

    реферат [124,6 K], добавлен 18.02.2012

  • Последовательность формирования связного ациклического графа случайным образом в соответствии с заданным распределением. Вычисление потока минимальной стоимости. Генерация матрицы пропускных способностей. Реализация алгоритмов Фалкерсона, Дейкстры.

    курсовая работа [526,3 K], добавлен 14.12.2014

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

    курсовая работа [999,1 K], добавлен 20.12.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.