Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Пул потоков в CLR




Как отмечалось выше, создание и уничтожение потока — довольно дорогая операция в плане временных затрат. Кроме того, при наличии множества потоков впустую расходуется память и ухудшается производительность из-за того, что ОС должна планировать потоки и выполнять переключения контекста между потоками, готовыми к выполнению. К счастью, в CLR есть код для управления собственным пулом потоков. Пул потоков можно рассматривать как набор потоков, доступных для использования приложением. У каждого процесса есть один пул потоков, который используется всеми доменами AppDomain этого процесса.

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

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

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

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

В пуле различают два типа потоков: рабочие потоки и потоки ввода-вывода. Первые используются, когда приложение запрашивает пул выполнить асинхронную вычислительную операцию (которая может включать инициацию операции ввода-вывода). А потоки ввода-вывода служат для уведомления кода о завершении асинхронной операции ввода-вывода. Это значит, что для выполнения запросов, например обращения к файлу, сетевому серверу или базе данных, используется модель АРМ (Asynchronous Programming Model).

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 58; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты