Пул задач – Здравствуйте. Что значит словосочетание «пул задач»?

Содержание

Что такое «пул задач»? — UbuntuGeeks

В общем, я бы сказал, что пул задач должен быть сделан таким образом, чтобы

  1. все задачи могут выполняться одновременно при наличии достаточных ресурсов (при необходимости при синхронизации на общих ресурсах)
  2. все задачи могут выполняться последовательно в любом произвольном порядке
  3. возможен любой уровень совпадения между 1. и 2.
  4. все возможные ордера и уровни совпадения дают действительные результаты (не обязательно одинаковые)

Учитывая это определение,

Are dependencies allowed in task pool?

Слишком расплывчато. Если вы имеете в виду задачи в зависимости от других задач, я бы сказал, нет. Система с такими зависимостями — скорее очередь, чем пул.

Can a running task exchange data with other running tasks?

Не должно. Вы не можете полагаться на другую задачу, выполняемую одновременно.

To phrase conversely, are tasks permitted to accept data only prior to start and permitted to publish results only after the task has finished?

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

What keeps track of the temporary resources (memory, CPU etc) that are used by tasks?

Рамки? По крайней мере, не задачи.

How to define weights that will encourage efficient task assignment? For example, if one task needs to pass a lot of data to the next task, it may make sense to run the next task immediately following the first task, and as close to the first thread / CPU / machine / cluster (locality) as possible

ИМО, когда такая зависимость существует, должна быть одна задача, которая выполняет обе задачи вместо двух задач

What about tasks that are not known (do not exist) in the beginning, but were «created» later?

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

    

ubuntugeeks.com

Создание пула ресурсов и предоставление общего доступа к нему

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

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

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

Создание пула ресурсов

  1. Откройте Project и щелкните Пустая вкладка ресурсовProject _гт_.

  2. Щелкните стрелку рядом с командой планировщик группы

    и выберите пункт лист ресурсов.

  3. Нажмите кнопку Добавить ресурсы и импортируйте данные о существующем ресурсе.

Чтобы ввести сведения о новом контакте, нажмите кнопку трудОвой ресурс , а затем добавьте имя и сведения о ресурсе.

Примечание: Если вы используете Project профессиональный с Project Server, у вас будет доступ к корпоративным ресурсам. Дополнительные сведения о версиях проектов можно найти в статье Сравнение. Корпоративный список ресурсов обычно управляется администратором, и каждый руководитель проекта может добавить эти ресурсы в свои проекты.

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

Использование пула ресурсов

  1. Откройте проект пула ресурсов.

  2. Откройте проект, который будет предоставлять общий доступ к ресурсам из пула, и нажмите кнопку ресурс _Гт_ пула ресурсов _Гт_ общий доступ к ресурсам.

  3. Нажмите кнопку использовать ресурсы, а затем в поле от выберите проект пула ресурсов, который вы открыли в действии 1.

  4. Если вы хотите, чтобы данные в пуле ресурсов переопределяли любые конфликтующие данные из проекта (общего), выберите пункт пул имеет приоритет

    .

    Или

    Нажмите кнопку » общий доступ «, если вы хотите, чтобы сведения в проекте переопределяли любые конфликтующие данные из пула ресурсов.

  5. Нажмите кнопку ОК.

    Теперь вы можете использовать ресурсы для вашего проекта. Все ресурсы проекта будут автоматически добавлены в пул.

  6. Чтобы просмотреть список общих ресурсов, нажмите кнопку задача_Гт_ диаграммы Ганта _гт_ лист ресурсов.

Работа с данными об использовании ресурсов

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

Примечание: Для непосредственного изменения файла пула ресурсов необходимо иметь доступ к этому файлу для чтения и записи. В противном случае вы можете только просматривать использование ресурсов и вносить изменения в ресурсы проекта.

  1. Откройте проект файл клиента пула.

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

  3. Чтобы просмотреть задания в разных проектах, использующих пул ресурсов, нажмите кнопку задача _Гт_ Диаграмма Ганта _гт_ использование ресурсов

    Совет: Названия ресурсов, отображаемые красным цветом, означают ресурс, переданный по выделению.

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

  4. После внесения обновлений нажмите кнопку ресурс _Гт_ пул ресурсов _гт_ Обновить пул ресурсов

    Совет: Если элемент » Обновить пул ресурсов » недоступен из проекта, возможно, вы открыли файл пула ресурсов в режиме чтения и записи. Закройте и снова откройте пул ресурсов в режиме чтения.

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

Если ваш проект использует ресурсы из пула ресурсов или из другого файла проекта, вы можете отключить его от другого файла. Ресурсы с заданиями в файле проекта остаются в проекте после отключения файла от пула ресурсов или другого файла проекта, но другие ресурсы из пула ресурсов или другого файла больше не доступны.

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

Отключение активного общего файла от пула ресурсов

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

  1. Откройте пул ресурсов, содержащий ресурсы, к которым предоставлен общий доступ.

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

  3. Откройте проект.

  4. Выберите ресурс _Гт_ пула ресурсов _Гт_ общий доступ к ресурсам

  5. Выберите команду использовать собственные ресурсы, а затем нажмите кнопку ОК.

  6. Сохраните оба файла проекта.

Дополнительные сведения о пулах ресурсов

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

Каждый проект, использующий ресурсы из пула ресурсов, называется файл клиента пула.

Совет: Создайте новый (отдельный) файл проекта только для сведений о ресурсе. Это облегчит управление сведениями о ресурсе и назначениям задач между файлами и пулами ресурсов общего доступа.

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

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

Кроме того, можно легко просматривать превышение доступности ресурсов, вызываемое конфликтом назначений в нескольких проектах.

Дальнейшие действия

support.office.com

Пул управляемых потоков | Microsoft Docs

  • Время чтения: 4 мин

В этой статье

Класс System.Threading.ThreadPool обеспечивает приложение пулом рабочих потоков, управляемых системой, позволяя пользователю сосредоточиться на выполнении задач приложения, а не на управлении потоками.The System.Threading.ThreadPool class provides your application with a pool of worker threads that are managed by the system, allowing you to concentrate on application tasks rather than thread management. Если имеются небольшие задачи, которые требуют фоновой обработки, пул управляемых потоков — это самый простой способ воспользоваться преимуществами нескольких потоков.If you have short tasks that require background processing, the managed thread pool is an easy way to take advantage of multiple threads. В Framework 4 и более поздних версиях использовать пул потоков стало значительно проще, так как вы можете создавать объекты Task и Task<TResult>, которые выполняют в потоках пула асинхронные задачи.Use of the thread pool is significantly easier in Framework 4 and later, since you can create Task and Task<TResult> objects that perform asynchronous tasks on thread pool threads.

Платформа .NET использует потоки из пула в различных целях, в том числе для операций библиотеки параллельных задач (TPL), асинхронного ввода-вывода, обратных вызовов таймера, регистрируемых операций ожидания, асинхронного вызова методов с использованием делегатов и для подключения к сокетам System.Net..NET uses thread pool threads for many purposes, including Task Parallel Library (TPL) operations, asynchronous I/O completion, timer callbacks, registered wait operations, asynchronous method calls using delegates, and System.Net socket connections.

Характеристики пула потоковThread pool characteristics

Потоки из пула являются фоновыми.Thread pool threads are background threads. Для каждого потока используется размер стека по умолчанию, поток запускается с приоритетом по умолчанию и находится в многопотоковом подразделении.Each thread uses the default stack size, runs at the default priority, and is in the multithreaded apartment. Когда поток в пуле завершает свою задачу, он возвращается в очередь потоков в состоянии ожидания.Once a thread in the thread pool completes its task, it’s returned to a queue of waiting threads. С этого момента его можно использовать вновь.From this moment it can be reused. Повторное использование позволяет приложениям избежать дополнительных затрат на создание новых потоков для каждой задачи.This reuse enables applications to avoid the cost of creating a new thread for each task.

Для каждого процесса существует только один пул потоков.There is only one thread pool per process.

Исключения в потоках из пула потоковExceptions in thread pool threads

Необработанные исключения в потоках из пула приводят к завершению процесса.Unhandled exceptions in thread pool threads terminate the process. Существует три исключения из этого правила.There are three exceptions to this rule:

Дополнительные сведения см. в статье Исключения в управляемых потоках.For more information, see Exceptions in Managed Threads.

Максимальное число потоков в пуле потоковMaximum number of thread pool threads

Число операций, которое можно поставить в очередь в пуле потоков, ограничено только доступной памятью.The number of operations that can be queued to the thread pool is limited only by available memory. Однако пул потоков имеет ограничение на число потоков, которое можно активировать в процессе одновременно.However, the thread pool limits the number of threads that can be active in the process simultaneously. Если все потоки в пуле заняты, дополнительные рабочие элементы помещаются в очередь и ожидают их освобождения.If all thread pool threads are busy, additional work items are queued until threads to execute them become available. Начиная с .NET Framework 4, размер пула потоков по умолчанию для какого-либо процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства.Beginning with the .NET Framework 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. Процесс может вызвать метод ThreadPool.GetMaxThreads для определения количества потоков.A process can call the ThreadPool.GetMaxThreads method to determine the number of threads.

Вы можете управлять максимальным количеством потоков с помощью методов ThreadPool.GetMaxThreads и ThreadPool.SetMaxThreads.You can control the maximum number of threads by using the ThreadPool.GetMaxThreads and ThreadPool.SetMaxThreads methods.

Минимальные значения пула потоковThread pool minimums

Пул потоков предоставляет новые рабочие потоки или потоки завершения ввода-вывода по запросу, пока не будет достигнут заданный минимум для каждой категории.The thread pool provides new worker threads or I/O completion threads on demand until it reaches a specified minimum for each category. Для получения этих минимальных значений можно использовать метод ThreadPool.GetMinThreads.You can use the ThreadPool.GetMinThreads method to obtain these minimum values.

Примечание

Если потребность низкая, фактическое количество потоков из пула потоков может быть ниже минимальных значений.When demand is low, the actual number of thread pool threads can fall below the minimum values.

При достижении минимума пул потоков может создавать дополнительные потоки или ожидать завершения некоторых задач.When a minimum is reached, the thread pool can create additional threads or wait until some tasks complete. Начиная с .NET Framework 4, пул потоков создает и уничтожает рабочие потоки в целях оптимизации пропускной способности, которая определяется как количество задач, выполняемых в единицу времени.Beginning with the .NET Framework 4, the thread pool creates and destroys worker threads in order to optimize throughput, which is defined as the number of tasks that complete per unit of time. Слишком малое количество потоков может препятствовать оптимальному использованию доступных ресурсов, тогда как слишком большое их количество может усиливать конкуренцию за ресурсы.Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

Внимание!

Для увеличения минимального количества бездействующих потоков можно использовать метод ThreadPool.SetMinThreads.You can use the ThreadPool.SetMinThreads method to increase the minimum number of idle threads. Однако необоснованное увеличение этих значений может привести к снижению производительности.However, unnecessarily increasing these values can cause performance problems. Если одновременно запускается слишком много задач, все они могут выполняться слишком медленно.If too many tasks start at the same time, all of them might appear to be slow. В большинстве случаев пул потоков работает наилучшим образом, если он использует собственный алгоритм выделения потоков.In most cases the thread pool will perform better with its own algorithm for allocating threads.

Использование пула потоковUsing the thread pool

Начиная с .NET Framework 4, самым простым способом использования пула потоков является применение библиотеки параллельных задач (TPL).Beginning with the .NET Framework 4, the easiest way to use the thread pool is to use the Task Parallel Library (TPL). По умолчанию такие типы TPL, как Task и Task<TResult>, используют потоки из пула для выполнения задач.By default, TPL types like Task and Task<TResult> use thread pool threads to run tasks.

Пул потоков также можно использовать путем вызова ThreadPool.QueueUserWorkItem из управляемого кода (или ICorThreadpool::CorQueueUserWorkItem из неуправляемого кода) и передачи делегата System.Threading.WaitCallback, представляющего метод, который выполняет задачу.You can also use the thread pool by calling ThreadPool.QueueUserWorkItem from managed code (or ICorThreadpool::CorQueueUserWorkItem from unmanaged code) and passing a System.Threading.WaitCallback delegate representing the method that performs the task.

Другим способом использования пула потоков является помещение в очередь рабочих элементов, которые имеют отношение к операции ожидания, с помощью метода ThreadPool.RegisterWaitForSingleObject и передача дескриптора System.Threading.WaitHandle, который вызывает метод, представленный делегатом System.Threading.WaitOrTimerCallback, при получении сигнала или истечении времени ожидания.Another way to use the thread pool is to queue work items that are related to a wait operation by using the ThreadPool.RegisterWaitForSingleObject method and passing a System.Threading.WaitHandle that, when signaled or when timed out, calls the method represented by the System.Threading.WaitOrTimerCallback delegate. Потоки из пула потоков используются для вызова методов обратного вызова.Thread pool threads are used to invoke callback methods.

Примеры см. по ссылкам на страницы API.For the examples, check the referenced API pages.

Пропуск проверок безопасностиSkipping security checks

Пул потоков также предоставляет методы ThreadPool.UnsafeQueueUserWorkItem и ThreadPool.UnsafeRegisterWaitForSingleObject.The thread pool also provides the ThreadPool.UnsafeQueueUserWorkItem and ThreadPool.UnsafeRegisterWaitForSingleObject methods. Используйте эти методы только в том случае, если вы уверены, что стек вызывающего объекта не важен для проверок безопасности, осуществляемых во время выполнения задачи в очереди.Use these methods only when you are certain that the caller’s stack is irrelevant to any security checks performed during the execution of the queued task. ThreadPool.QueueUserWorkItem и ThreadPool.RegisterWaitForSingleObject перехватывают стек вызывающего объекта, который объединяется со стеком потока из пула потоков, когда поток начинает выполнять задачу.ThreadPool.QueueUserWorkItem and ThreadPool.RegisterWaitForSingleObject both capture the caller’s stack, which is merged into the stack of the thread pool thread when the thread begins to execute a task. Если требуется проверка безопасности, проверяется весь стек.If a security check is required, the entire stack must be checked. Несмотря на обеспечение безопасности, такая проверка также влияет на производительность.Although the check provides safety, it also has a performance cost.

Когда не следует использовать потоки из пула потоковWhen not to use thread pool threads

Существует ряд сценариев, в которых следует создавать собственные потоки и работать с ними, а не использовать потоки из пула:There are several scenarios in which it’s appropriate to create and manage your own threads instead of using thread pool threads:

  • Необходим основной поток.You require a foreground thread.
  • Поток должен иметь определенный приоритет.You require a thread to have a particular priority.
  • Имеются задачи, которые приводят к блокировке потока на длительное время.You have tasks that cause the thread to block for long periods of time. Для пула потоков определено максимальное количество потоков, поэтому большое число заблокированных потоков в пуле может препятствовать запуску задач.The thread pool has a maximum number of threads, so a large number of blocked thread pool threads might prevent tasks from starting.
  • Необходимо поместить потоки в однопотоковое подразделение.You need to place threads into a single-threaded apartment. Все потоки ThreadPool находятся в многопотоковом подразделении.All ThreadPool threads are in the multithreaded apartment.
  • Необходимо иметь постоянное удостоверение, сопоставленное с потоком, или назначить поток задаче.You need to have a stable identity associated with the thread, or to dedicate a thread to a task.

См. такжеSee also

docs.microsoft.com

Пул — это… узнаем значение слова

Частенько то в книге, то в статье можно встретить слово «пул». Вот только точное обозначение этого слова знают далеко не все, большинство же просто иногда вскользь слышали его. А ведь не зная, что обозначает то или иное понятие, можно не понять и смысл всего предложения, и даже целого текста. Так давайте же все вместе узнаем значение слова «пул», чтобы в дальнейшем не было никаких недоразумений.

Определение по словарям

Прежде всего для определения смысла слова следует обратиться к словарям, которые всегда четко объясняют, что оно значит. Итак, в соответствии со словарем Даля, пул — это мелкая монета, которая отчеканена из красной меди, со стоимостью по десятке за одну серебряную деньгу. В словаре Ушакова записано, что слово «пул» позаимствовано из от английского pool, что переводится, как «общий котел». Он обозначает пулом объединение капиталистов, которые будут искусственно повышать цены, чтобы всю прибыль собрать в общий фонд, дабы затем распределить ее в определенной пропорции. В соответствии со словарем Ефрона и Брокгауза, слово «пул» следует трактовать, как название самой мелкой медной монеты, которая водится в Средней Азии. А если посмотреть энциклопедический словарь, то там можно будет узнать, что Пулом называют город на юге Англии с населением на 1991 год в 135 тысяч жителей, который считается центром парусного спорта и отличным климатическим курортом.

Пул в бильярде

Для многих людей, пул — это название игры в бильярд, в которую чаще всего играют профессиональные игроки под присмотром судей, но могут играть в нее и простые обыватели, которые еще не достигли уровня профи. Правила этой игры были утверждены и систематизированы еще в 1999 году Всемирной ассоциацией WPA, и с тех пор ни разу не менялись. Собственно, в них и нет ничего сложного. Игра в пул так же, как и обычная игра в бильярд ведется несколькими людьми, которые по очереди забивают шар в лузу, стараясь не задеть другие шары ни кием, ни одеждой, ни каким-либо иным предметом, так как это может привести к фолу. А уж если игрок в пул еще и как-то заставит шар сдвинуться с помощью преднамеренного внешнего вмешательства, то это и вовсе может быть засчитано как автоматическое поражение. Победителем становится тот, кто забивает в лузу последний шар.

Пул в игре World of Warcraft

Игроки знаменитой компьютерной игры World of Warcraft тоже часто используют в своей речи слово «пул». Для них пул — это начало битвы, тот момент, когда монстры замечают персонажа и стремятся его атаковать. Причем, такой пул может быть как хорошим, что знаменует победу в сражении, так и плохим, что может стать причиной смерти рейда даже в том случае, когда тактика проработана до последних мелочей. Однако плохого пула все-таки можно избежать, если поставить четкие задачи перед каждым членом рейда. И когда все участники битвы будут знать, что им делать, а действия будут синхронными, пул будет просто отличным, а сражение завершится победой. Главное помнить, что при битве с боссом лучше отдать первостепенную роль танкам или охотникам, и тогда уж точно поражению не бывать.

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

Что такое модемный пул?

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

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

fb.ru

Как работает Thread Pool?


Пул потоков

Известно, что создание, уничтожение, переключение между потоками – это дорогостоящая операция. Для того чтобы избежать накладных расходов связанных с этим, основной идеей пула потоков в .NET стало уменьшение числа задействованных потоков и увеличение выполненной ими работы. Поэтому в пуле нас всегда ждет определенное известное CLR количество потоков готовых на выполнение задач. И именно поэтому почти все книги про .NET говорят, что для быстрого создания и выполнения потока ThreadPool.QueueUserWorkItem годится, а метод Start класса Thread нет.

В .NET 3.5 и ранее Thread Pool состоит из глобальной очереди, в которую попадают задачи на выполнение из потока нашего приложения и определенного числа рабочих потоков – worker threads, всегда готовых прийти на помощь. Именно рабочие потоки разбирают задачи из глобальной очереди на выполнение, и когда они выполнят задачу – они обращаются в глобальную очередь за новой порцией. Но так как потоки разбирают задачи одновременно, то для того чтобы два рабочих не взяли одну и ту же порцию – существует синхронизация между ними посредством блокировок. Блокировки же могут стать «бутылочным горлышком» этого механизма и производительность из-за этого упадет.

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

Хорошая аналогия для демонстрации того как работает пул в .net 3.5 – это процесс разработки программного обеспечения (ПО). Написать ПО в более короткие сроки можно за счет увеличения людей на проекте. И если это один, два или три разработчика – то на синхронизацию совместных действий у них уйдет немного времени. Но что будет, если мы начнем добавлять все больше и больше разработчиков с целью как можно более сжать сроки? Тогда для координации действий им потребуются совещания, совещания, совещания… много совещаний (meetings). И теперь представим себе одно большое совещание на 40 человек, где каждый будет обсуждать свой кусок работы и координировать свои действия с коллегами. Интересно насколько долго будут затягиваться такие совещания и насколько мучительными они будут для участников.

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

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

Наверное, используя эту аналогию, разработчики из Microsoft Reasearch (pfx team) пересмотрели пул потоков. Ведь число ядер растет, и нагрузка в будущем на глобальную очередь только возрастала бы. Поэтому нужно было что-то делать. И они сделали – новый пул потоков.

Новый пул потоков работает немного другим образом. Для каждого рабочего потока в пуле существует своя локальная очередь. Задача, которая попала в локальную очередь, может породить дочернюю и они размещаются в эту же локальную очередь. Также задачи выполняются в локальной очереди в LIFO (last-in-first-out) порядке, в отличие от пула в 3.5, где задачи из глобальной очереди выполняются рабочими потоками в FIFO (first-in-first-out) порядке. Так как только рабочий поток разгребает свою собственную кучу, вернее имеет доступ к ее началу (head), то на уровне локальной очереди не требуется никаких синхронизаций. Поэтому добавление и извлечение задачи из этой очереди происходят очень быстро. Побочным эффектом такого выполнения является то, что очередь разгребается в обратном порядке. Хотя делать какие-то допущения в программе о порядке выполнения задач в очереди нельзя – так как пул потоков своеобразный черный ящик.

Когда рабочий поток видит что делать ему больше нечего, то есть его локальная очередь пустая, он пытается своровать задачу у другого рабочего потока. Но ворует он элементы с хвоста чужой локальной очереди. Такое действие уже требует синхронизации. И производительность немного снизится. Если же все локальные очереди пустые, то рабочий поток попытается забрать задачу из глобальной очереди в FIFO порядке. Если же глобальная очередь окажется пустой, тогда рабочий поток «заснет» пока не появится работа для него. Если рабочий поток проспал слишком много времени и работы так и не получил, он проснется и уничтожится, освободив занимаемые ресурсы.

Почему глобальная очередь на картинке lock-free, если все равно нужна синхронизация для доступа к ней рабочих потоков из пула?. Потому что она действительно lock-free, теперь для синхронизации используются не lock-и (Monitor), а некий аналог interlocked операций и это позволило увеличить быстродействие очереди.

Task Parallel Library

Вместе с улучшенным пулом потоков в .NET 4 также появляется и расширенное API для работы с потоками и пулами потоков — Task Parallel Library (TPL), библиотека, которая обладает более широким набором средств для взаимодействия с потоками. Основным элементом TPL является тип Task.

Task – это по сути своей абстракция над потоками, которая была создана, чтобы дать возможность среде эффективно управлять распределением работы по потокам и их созданием. Поэтому Task дает пулу потоков значительно больше информации о работе, которую выполняет поток. Одна из особенностей работы с Task’ами – это связь parent/child, которая дает понять пулу потоков об общей структуре вычислений, которые производятся отдельными потоками или задачами (work items). Обладая такой информацией, пул потоков может более эффективно распределять работу между потоками. А значит, эффективность пула и общая производительность повышаются. А то, что между родительской и дочерней задачей существует связь, позволяет использовать преимущества процессорного кэша. Так как возможно данные, с которыми оперировала родительская задача, останутся в кэше. При отсутствии взаимосвязей между задачами или потоками вероятность этого значительно ниже.

regfordev.blogspot.com

📌 ПУЛ — это… 🎓 Что такое ПУЛ?

  • ПУЛ — Мелкая медная монета в Средней Азии = 0,558 коп. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910. ПУЛ Счетная монета в Персии. Объяснение 25000 иностранных слов, вошедших в употребление в русский язык, с означением… …   Словарь иностранных слов русского языка

  • Пул — 1. ПУЛ, а; м. [от англ. pool общий котёл, от франц. poule курица, как обозначение ставки в карточной игре]. 1. Одна из форм монополий, при которой прибыль всех участников поступает в общий фонд и затем распределяется между ними в заранее… …   Энциклопедический словарь

  • пул — 1. ПУЛ, а; м. [от англ. pool общий котёл, от франц. poule курица, как обозначение ставки в карточной игре]. 1. Одна из форм монополий, при которой прибыль всех участников поступает в общий фонд и затем распределяется между ними в заранее… …   Энциклопедический словарь

  • Пул — (pul) Денежная единица Афганистана, равная одной сотой афгани (afghani). Финансы. Толковый словарь. 2 е изд. М.: ИНФРА М , Издательство Весь Мир . Брайен Батлер, Брайен Джонсон, Грэм Сидуэл и др. Общая редакция: д.э.н. Осадчая И.М.. 2000. Пул Пул …   Финансовый словарь

  • ПУЛ — ПУЛ, пула, муж. (англ. pool общий котел) (экон.). 1. В Англии и США род монополистического объединения капиталистов для искусственного повышения цен, в котором прибыль участников поступает в общий фонд с последующим распределением по заранее… …   Толковый словарь Ушакова

  • Пул — Эрнест (Ernest Poole, 1880 ) американский журналист и писатель. Работал корреспондентом в России в 1905 и в 1917 1918. Близко стоял к рабочему движению; помогал Э. Синклеру собирать материал для «Джунглей». Наиболее социально значительное его… …   Литературная энциклопедия

  • Пул-8 — Пул 8, или «восьмёрка» (англ. eight ball)  разновидность американского пула. В настоящее время является самой известной дисциплиной пула, особенно среди игроков любителей[источник не указан 801 день]. Цель игры… …   Википедия

  • пул — соглашение, объединение, картель, пуло, монета Словарь русских синонимов. пул сущ., кол во синонимов: 7 • бильярд (14) • …   Словарь синонимов

  • пул — 1 іменник чоловічого роду монета пул 2 іменник чоловічого роду монополія …   Орфографічний словник української мови

  • пул — Динамически распределяемый ресурс, например, область ОЗУ. [http://www.morepc.ru/dict/] пул Одна из форм соглашений между собственниками и предпринимателями, при которой прибыль поступает в общий фонд и распределяется согласно квотам, заранее… …   Справочник технического переводчика

  • ПУЛ — прибор управления лучом Словарь: С. Фадеев. Словарь сокращений современного русского языка. С. Пб.: Политехника, 1997. 527 с. ПУЛ пункт управления луноходом Источник: http://www.cybersecurity.ru/it/6795.html …   Словарь сокращений и аббревиатур

  • banking_finance.academic.ru

    Шаблоны игрового программирования. Пул объектов : live13 — LiveJournal


    Оглавление

    Задача

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

    Мотивация

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

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

    Проклятье фрагментации

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

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

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

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

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

      Большинство консольных платформодержателей требуют, чтобы игры проходили «тест на протечку(soak test)», когда игра оставляется работающей на несколько дней в демо-режиме. Если игра падает — ей не разрешают выйти. Тест на протечку иногда проваливается и из-за какого-нибудь редкого бага, но чаще всего игру обрушивает утечка памяти, вызванная фрагментацией.

    Лучшее из двух миров

    Из-за фрагментации и потому что выделение памяти может работать медленно, игры всегда очень осторожны насчет того где и как работать с памятью. Простейшее решение обычно и самое лучшее: Захватите кусок памяти побольше при старте игры и освободите его при выходе из игры. К сожалению такую стратегию сложно использовать когда нам нужно постоянно создавать и удалять объекты во время работы игры.

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

    Шаблон

    Определим класс пула, содержащего коллекцию многоразовых объектов. Каждый объект поддерживает запрос «используется», означающий что он сейчас «жив». Когда пул инициализируется, он сразу создает всю коллекцию объектов (обычно выделяя один последовательный участок памяти) и инициализирует их всех состоянием » не используется».

    Когда вам понадобится новый объект, вы запрашиваете его у пула. Он ищет доступный объект, инициализирует его значением «используется» и возвращает. Когда объект больше не нужен, он снова возвращается в состояние «не используется». Таким образом, объекты можно свободно создавать и удалять без необходимости выделять память или другие ресурсы.

    Когда использовать

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


    • Вам нужно часто создавать и удалять объекты.

    • Объекты одного размера.

    • Выделение объектов из кучи работает медленно или может привести к фрагментации памяти.

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

    Имейте в виду

    Обычно вы можете положиться на сборщик мусора или операторы new и delete, которые сделают всю работу за вас. Когда вы используете пул объектов, вы как будто говорите «Я лучше знаю как обращаться с этими байтами». А еще это значит, что на вас ложится бремя ограничений шаблона.

    Пул может тратить память на неиспользуемые объекты

    Размер пула нужно настраивать соразмерно с нуждами игры. При настройке обычно проще всего понять когда пул недостаточного размера (уверен что падение игры наверняка привлечет ваше внимание). Но еще нужно следить и за тем чтобы пул не был слишком большим. Если уменьшить пул, освободившуюся память можно использовать для чего-либо более полезного.

    В каждый момент времени может быть активно только определенное количество объектов

    Иногда это хорошо. Разделение памяти на отдельные пулы для различных типов объектов означает с одной стороны то что последовательность взрывов не заставит вашу систему частиц отожрать всю доступную память, не позволив вам создать что-либо более полезное, типа нового противника.

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


    • Прямое вмешательство. Это самое очевидное «исправление»: будем настраивать размер пула таким образом, чтобы он никогда не переполнялся независимо от действий пользователя. Для пулов с важными объектами, такими как противники или геймплейные предметы, это хороший выход. Не может быть «правильной» обработки недостатка свободных слотов для создания большого босса, когда игрок дошел до конца уровня. Так что лучше придумать что-то такое, что не позволит нам оказаться в подобной ситуации.

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


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

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

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


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

    Размер памяти для каждого объекта фиксирован

    Большинство реализаций пула хранят объекты в массиве объектов на месте (in-place). Если все ваши объекты одного типа — это нормально. Однако если вы захотите хранить в пуле объекты нескольких типов или экземпляры подклассов с дополнительными полями, вам нужно быть уверенными что каждый слот пула обладает достаточным размером чтобы вместить максимально возможный объект. В противном случае неожиданно большой объект вылезет за свои границы на соседний и разрушит память.

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

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

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

    Повторно используемые объекты не очищаются автоматически

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

    Так как наш пул объектов не заходит в деле управления памяти дальше повторного использования объектов, он не имеет подобной страховочной сетки. Еще хуже то что память, используемая для «нового» объекта хранила раньше объект того же самого типа. Это делает весьма возможной ситуацию, когда вы забудете инициализировать что-то внутри нового созданного объекта, а память где он будет размещаться уже будет содержать почти корректные данные, оставшиеся с прошлой жизни.

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

      Я буду гордится если вы выберете для очистки магическое число 0x1deadb0b.

    Неиспользуемые объекты остаются в памяти

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

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

    Пример кода

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

    Начнем с самой наипростейшей реализации. Для начала наш класс частиц:


    class Particle
    {
    public:
    Particle()
    : framesLeft_(0)
    {}

    void init(double x, double y,
    double xVel, double yVel, int lifetime)
    {
    x_ = x; y_ = y;
    xVel_ = xVel; yVel_ = y

    live13.livejournal.com

    Обновлено: 28.07.2019 — 21:34

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *