• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Параллельное программирование в .Net
 

Параллельное программирование в .Net

on

  • 2,935 views

 

Statistics

Views

Total Views
2,935
Views on SlideShare
1,203
Embed Views
1,732

Actions

Likes
0
Downloads
4
Comments
1

18 Embeds 1,732

http://ferrum-box.blogspot.ru 946
http://ferrum-box.blogspot.com 473
http://blog.ferrum-box.org 271
http://ferrum-box.blogspot.de 9
http://webcache.googleusercontent.com 8
http://ferrum-box.blogspot.ca 5
http://feeds.feedburner.com 5
http://www.linkedin.com 3
http://prlog.ru 2
http://www.ferrum-box.blogspot.com 2
http://ferrum-box.blogspot.com.es 1
https://www.linkedin.com 1
http://ferrum-box.blogspot.co.uk 1
http://translate.googleusercontent.com 1
http://ferrum-box.blogspot.no 1
http://ferrum-box.blogspot.co.il 1
http://ferrum-box.blogspot.hu 1
http://ferrum-box.blogspot.hk 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Параллельное программирование в .Net Параллельное программирование в .Net Presentation Transcript

    • Параллельноепрограммирование в .NET Денис Речкунов .NET team, Enterra Inc. denis.rechkunov@gmail.com
    • Обзор
    • Библиотека параллельных задач (TPL)• System.Threading – Примитивы синхронизации: Semaphore, Mutex, Monitor, Barrier, ReaderWriterLock, LazyInitializer, SpinLock, SpinWait – Потоки: Thread, ThreadPool, ThreadLocal – Атомарные операции: Interlocked – Планирование: CountdownEvent, Timer Параллельное программирование в .NET15 ноября 2011 г. 3 [Денис Речкунов]
    • Semaphore• Особенности – Есть счетчик для числа потоков, которые могут одновременно взять семафор – Возможна межпроцессовая синхронизация – есть глобальные (именованные) объекты – Нет идентификации потоков, любой поток может освободить семафор (даже взятый другим потоком)• Практика – WaitOne – взять семафор – Release – освободить – OpenExisting – получить именованный семафор – Если один поток случайно дважды вызовет Release, то другой поток при попытке освободить семафор получит исключение SemaphoreFullException Параллельное программирование в .NET15 ноября 2011 г. 4 [Денис Речкунов]
    • Mutex• Особенности – Применяется для межпроцессовой блокировки ресурса для получения монопольного доступа – Если один поток получил Mutex, другой не может это сделать, пока первый не освободит его – Идентифицирует потоки, Mutex может быть освобожден только тем потоком, который его взял – Mutex’ы бывают локальные и глобальные (именованные)• Практика – WaitOne – взять – ReleaseMutex – освободить – OpenExisting – получить именованный системный Mutex – Если поток, взявший Mutex, завершился, то Mutex считается брошенным и передается во владение следующему ожидающему потоку, и в нем возникает AbandonedMutexException Параллельное программирование в .NET15 ноября 2011 г. 5 [Денис Речкунов]
    • Monitor• Особенности – Используется для организации критической секции внутри приложения, в качестве признака блокировки использует заданный объект – Только для ссылочных типов – Нет экземпляров, класс статический – Существует инструкция компилятора lock для краткой записи• Практика – Enter, TryEnter – Войти в критическую секцию – Wait – На время передать управление следующему в очереди ожидания потоку – Exit – Покинуть критическую секцию – Pulse (сигнал), PulseAll – Уведомить поток(и) в очереди готовности об изменении состояния объекта с блокировкой – Необходимо использовать с try {...} finally { Monitor.Exit(obj); } – Не стоит использовать публичные объекты, во избежание взаимоблокировок Параллельное программирование в .NET15 ноября 2011 г. 6 [Денис Речкунов]
    • Monitor• Монитор хранит для каждого синхронизированного объекта: – Ссылка на поток, который в данный момент владеет блокировкой – Ссылка на очередь готовности, которая содержит потоки, готовые получить блокировку – Ссылка на очередь ожидания, содержащую потоки, ожидающие уведомления об изменении состояния объекта с блокировкой Параллельное программирование в .NET15 ноября 2011 г. 7 [Денис Речкунов]
    • Barrier• Особенности – Позволяет нескольким задачам параллельно работать с алгоритмом, используя несколько фаз – Каждый поток-участник должен зарегистрироваться, а когда закончит свою работу сообщить об этом – Ведется подсчет количества пройденных фаз алгоритма• Практика – AddParticipant, AddParticipants – Добавить нового участника(ов) – RemoveParticipant, RemoveParticipants – Удалить участника – SignalAndWait – Сообщить о завершении работы участника Параллельное программирование в .NET15 ноября 2011 г. 8 [Денис Речкунов]
    • LazyInitializer• Особенности – Позволяет производить потокобезопасную отложенную инициализацию объекта• Практика – EnsureInitialized<T>(ref target) – Получить экземпляр объекта с «ленивой» инициализацией – Если нескольких потоков одновременно обращаются к данному методу, могут быть созданы несколько экземпляров T, но только один из них будет сохранен в target Параллельное программирование в .NET15 ноября 2011 г. 9 [Денис Речкунов]
    • ReaderWriterLock• Особенности – Блокирует объект либо на чтение несколькими потоками, либо на запись одним потоком• Практика – AcquireReaderLock – Запросить блокировку на чтение – ReleaseReaderLock – Освободить блокировку на чтение – AcquireWriterLock – Запросить блокировку на запись – ReleaseWriterLock – Освободить блокировку на запись – Поток может удерживать блокировку чтения или записи, но не обе блокировки одновременно – Необходимо минимизировать операции записи, так как они будут производится редко – Если запрос блокировки не удовлетворен – ApplicationException Параллельное программирование в .NET15 ноября 2011 г. 10 [Денис Речкунов]
    • SpinLock• Особенности – Структура для создания низкоуровневых критических секций• Практика – Enter, TryEnter – войти в критическую секцию – Exit – Покинуть критическую секцию (false для лучшей производительности на IA32) – Спин блокировки стоит использовать, если удержание блокировки является коротким, например, обращение к элементу списка. И только если в месте блокировки критична производительность Параллельное программирование в .NET15 ноября 2011 г. 11 [Денис Речкунов]
    • SpinLock• Не рекомендуется использовать: – Блокировку внутри спин-блокировки – Вызов элемента, который сам может привести к блокировке – Одновременное использование более одной спин- блокировки – Динамические вызовы (интерфейсы и виртуальные функции) – Статические функции принадлежащие другим классам – Выделение памяти – Необходимо помнить, что это структура и можно случайно ее скопировать, поэтому передавать ее нужно по ссылке Параллельное программирование в .NET15 ноября 2011 г. 12 [Денис Речкунов]
    • SpinWait• Особенности – Структура для выполнения низкоуровнего ожидания на основе бесполезных циклов процессора без переключения контекста потока• Практика – Count – Сколько раз был вызван SpinOnce – Reset – Сбрасывает счетчик циклов процессора – SpinOnce – Выполняет один цикл процессора – SpinUntil – Выполняет циклы процессора, пока флаг или предикат не станет истинным Параллельное программирование в .NET15 ноября 2011 г. 13 [Денис Речкунов]
    • Thread• Особенности – Средства для создания и управления системным потоком• Практика – Thread(ThreadStart) или Thread(ParameterizedThreadStart) создает объект с указанием делегата, передаваемого потоку при запуске – Start – Изменяет состояние потока на ThreadState.Running – Sleep – Приостанавливает работу текущего потока на заданное время – Abort – Вызывает исключение ThreadAbortException в запущенном потоке – Join – Блокировать вызвавший поток до завершения работы потока, у которого этот метод вызван Параллельное программирование в .NET15 ноября 2011 г. 14 [Денис Речкунов]
    • Thread – Interrupt – Прерывает работу потока, находящегося в состоянии WaitSleepJoin, возникает исключение ThreadInterruptedException в потоке, у которого вызван метод – Если поток завершился, он не может быть запущен заново другим вызовом Start – После вызова Abort необходимо использовать Join, так как завершение потока может произойти не сразу – Метод Join изменяет состояние вызвавшего потока на ThreadState.WaitSleepJoin – Если метод Interrupt вызван у потока, который находится не в состоянии ожидания, то он будет прерван при первом переходе в такое состояние – Если поток уже завершен, при вызове Join метод немедленно возвращает управление вызвавшему потоку Параллельное программирование в .NET15 ноября 2011 г. 15 [Денис Речкунов]
    • ThreadLocal• Особенности – Предоставляет хранилище для данных, локальных для потока• Практика – ThreadLocal(Of T)(Func(Of T)) – Создает локальное хранилище с функцией возвращающей значение – IsValueCreated – Получает значение, указывающее, инициализирован ли объект Value в текущем потоке – Value – Получает или задает значение данного экземпляра для текущего потока Параллельное программирование в .NET15 ноября 2011 г. 16 [Денис Речкунов]
    • ThreadPool• Особенности – Предоставляет пул потоков, который может использоваться для создания рабочих элементов, обработки асинхронного ввода/вывода, ожидания от имени других потоков и обработки таймеров• Практика – QueueUserWorkItem – Помещает делегат WaitCallback в очередь на выполнение, когда появится свободный поток, ему назначится этот делегат – GetMaxThreads, GetMinThreads – Получают ограничения пула потоков Параллельное программирование в .NET15 ноября 2011 г. 17 [Денис Речкунов]
    • ThreadPool – GetAvailableThreads – Получает разность максимального числа потоков в пуле и кол-ва занятых потоков – SetMaxThreads, SetMinThreads – Делает попытку установить ограничения количества потоков в пуле – Потоки в управляемом пуле потоков являются фоновыми. То есть их свойства IsBackground имеют значение true – Таймеры и зарегистрированные операции ожидания также используют пул потоков. Их функции обратного вызова помещаются в очередь пула потоков – Для каждого процесса существует один пул потоков. Пул потоков по умолчанию содержит 250 рабочих потоков на каждый доступный процессор и 1000 потоков завершения ввода/вывода – Когда все потоки получили задачу, он не создает новые свободные потоки немедленно, а выдерживает интервал в 0,5 сек Параллельное программирование в .NET15 ноября 2011 г. 18 [Денис Речкунов]
    • Библиотека параллельных задач (TPL)• System.Threading.Tasks – Parallel • For • ForEach • Invoke – Task, TaskFactory, TaskScheduler • ContinueWith • Wait • WaitAll • WaitAny • RunSynchronously Параллельное программирование в .NET15 ноября 2011 г. 19 [Денис Речкунов]
    • Исполнение параллельных задач (TPL)• Особенности класса Task – Более эффективное и масштабируемое использование системных ресурсов – В фоновом режиме задачи помещаются в очередь ThreadPool, усовершенствованную с помощью алгоритмов (например, поиска экстремума), которые определяют и настраивают количество потоков – Больший программный контроль по сравнению с потоком – Поддерживают ожидание, отмену, продолжение, надежную обработку исключений, подробные состояния, пользовательское планирование и многое другое Параллельное программирование в .NET15 ноября 2011 г. 20 [Денис Речкунов]
    • Исполнение параллельных задач (TPL)• Практика использования – Parallel.Invoke – выполнение делегата Action – Создание объекта Task затем Task.Start – выполнение любого делегата, параметризация задачи – TaskFactory.StartNew – эквивалент создания объекта задачи и вызова Start – Если задача возвращает результат, он помещается в свойство объекта Result, обращение к которому блокирует обратившийся поток до окончания выполнения задачи – Если во время выполнения задачи вызвано исключение, оно имеет тип AggregateException и помещается в свойство Exception, а также выставляется флаг IsFaulted. Также это исключение возникает в потоке, который ожидал завершения задачи – Класс TaskFactory содержит дополнительные методы для планирования и комбинации выполнения задач Параллельное программирование в .NET15 ноября 2011 г. 21 [Денис Речкунов]
    • Исполнение параллельных задач (TPL)• Параметры постановки задачи TaskCreationOptions – None – Указывает, что следует использовать поведение по умолчанию – PreferFairness – Рекомендация для TaskScheduler для планирования задач максимально сохраняя порядок их постановки – LongRunning – Указывает, что задача будет долго выполняющейся, и не помещается планировщиком в ThreadPool – AttachedToParent – Указывает, что задача присоединена к родительской задаче в иерархии задач и помещается в локальную очередь родительской задачи, а не в ThreadPool Параллельное программирование в .NET15 ноября 2011 г. 22 [Денис Речкунов]
    • Отмена задач• Класс CancellationTokenSource – Отмена не навязывается получателю в принудительном порядке. Получатель сам определяет порядок корректного завершения в ответ на запрос отмены – Объект, который вызывает отменяемую операцию, может управлять временем создания запроса отмены (а также самим фактом создания подобного запроса) – Поддерживается примитивами синхронизации, PLINQ и Task Параллельное программирование в .NET15 ноября 2011 г. 23 [Денис Речкунов]
    • Отмена задач Параллельное программирование в .NET15 ноября 2011 г. 24 [Денис Речкунов]
    • Структуры данных для параллельного программирования• System.Collections.Concurrent – BlockingCollection • Записывающие потоки блокируются до освобождения слота • Читающие потоки блокируются до появления хотя бы одного элемента – ConcurrentBag • Коллекция без сохранения порядка элементов – ConcurrentDictionary – ConcurrentQueue – ConcurrentStack Параллельное программирование в .NET15 ноября 2011 г. 25 [Денис Речкунов]
    • Parallel Language Integrated Query (PLINQ)• Каждая коллекция IEnumerable имеет адаптер AsParallel() для выполнения параллельных операций• Происходит разделение источника данных на сегменты для параллельного выполнения запроса• Учитывается тип коллекции для оптимального разбиения• Когда нет возможности работать параллельно, запрос производится последовательно Параллельное программирование в .NET15 ноября 2011 г. 26 [Денис Речкунов]
    • Parallel Language Integrated Query (PLINQ)• ParallelEnumerable – AsParallel – AsSequential – AsOrdered – AsUnordered – WithCancellation – WithDegreeOfParallelism – WithMergeOptions – WithExecutionMode – ForAll – Aggregate Параллельное программирование в .NET15 ноября 2011 г. 27 [Денис Речкунов]
    • Parallel Language Integrated Query (PLINQ)Сохранение порядка последовательности Параллельное программирование в .NET15 ноября 2011 г. 28 [Денис Речкунов]
    • Parallel Language Integrated Query (PLINQ)Отмена параллельной обработки Параллельное программирование в .NET15 ноября 2011 г. 29 [Денис Речкунов]
    • Производительность запросов PLINQ• Вычислительная стоимость общей работы• Количество логических ядер в системе (степень параллелизма)• Количество и тип операций (издержки на объединения и упорядочивание)• Форма выполнения запроса (ToArray, ToList, GetEnumerator)• Режим выполнения запроса WithExecutionMode(ParallelExecutionMode) – Default – ForceParallelism• Метод сегментирования данных, эффективность пользовательских сегментаторов (Partitioner.Create) Параллельное программирование в .NET15 ноября 2011 г. 30 [Денис Речкунов]
    • Когда PLINQ выбирает последовательный режимЕсли запрос содержит:• Select, когда используется индекс в Where, SelectMany или ElementAt после функций, меняющих порядок элементов• Take, TakeWhile, Skip, SkipWhile и когда порядок элементов отличается от исходного• Concat, за исключением случая, когда источник данных индексированный (Array, IList)• Zip или SequenceEquals за исключением случая, когда один источник данных имеет исходный порядок элементов, а другой индексированный• Reverse, за исключением случая, когда он применяется к индексированным источникам данных Параллельное программирование в .NET15 ноября 2011 г. 31 [Денис Речкунов]
    • Потенциальные ошибки• Не следует выполнять запись в общие области памяти, если нет необходимости• Избегайте излишней параллелизации• Избегайте вызовы к потокоопасным методам• Ограничение вызовов потокобезопасных методов• Проблемы, связанные с идентификацией потоков• Будьте внимательны при вызове Wait в делегатах, которые запущены с помощью Parallel.Invoke• Не следует считать, что итерации в циклах ForEach, For и ForAll всегда выполняются параллельно• Избегайте выполнения Parallel.For или Parallel.ForEach в потоке пользовательского интерфейса Параллельное программирование в .NET15 ноября 2011 г. 32 [Денис Речкунов]
    • Q/A Денис Речкунов denis.rechkunov@gmail.comhttp://msdn.microsoft.com/en-us/library/dd460693.aspx Параллельное программирование в .NET15 ноября 2011 г. 33 [Денис Речкунов]