Разница между «критическим разделом», «критическим регионом» и «областью ограниченного исполнения» - PullRequest
14 голосов
/ 14 апреля 2009

Это на самом деле три разные концепции или я путаюсь? (Я читал статьи о потоке и сборке мусора вместе и запутался.)

«Критический раздел» - я думаю, что это может быть просто термином для разделов кода, к которым вы не хотите, чтобы несколько потоков обращались одновременно, т.е. внутри операторов lock и Monitor.Enter / Exit?

«Критическая область» - Здесь нет реальной подсказки - MSDN говорит что-то вроде «Это говорит хосту, что исключения, генерируемые в разделе, могут иметь более широкий эффект». И что «хосты CLR, например Sql Server» могут по-разному обрабатывать исключения, выбрасываемые в критических областях. Иначе как? И почему? И, самое главное, в каких реальных сценариях мне может понадобиться пометить код как критическую область?

«Область ограниченного выполнения» - Я сталкивался с этим, когда читал о CriticalFinalizerObject в статье по сбору мусора.

Все, что я могу понять из MSDN об этом, - это то, что код в одном из этих регионов каким-то образом гарантированно будет выполняться (но как?) И поэтому не должен выбрасывать «внеполосные» исключения.

Что такое out-of-band exception? (Я сделал это в Google, но он просто спросил меня, имею ли я в виду "исключение за пределами границ").

Это какое-то необработанное исключение? Или только определенные типы исключений? И снова, самое главное, в каких реальных сценариях мне может понадобиться «область ограниченного выполнения»?

Поскольку я не совсем хорошо понимаю концепции, я не уверен, какие теги нужны этому вопросу, кроме ".NET".

Ответы [ 8 ]

6 голосов
/ 04 января 2016

Microsoft могла бы определять вещи по-другому, но в целом критическая область и критическая секция - это одно и то же .

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

Хорошее обсуждение можно найти в Tanenbaum, A.S. и Bos, H. (2015). Современные операционные системы (Пирсон, Бостон, Ма), 4-е издание, стр. 1101. Более ранние издания, а также веб-сайты курсов многочисленных университетов, которые предлагают материалы для курсов по их операционным системам.

5 голосов
/ 14 апреля 2009

Просто мое понимание этих понятий:

Критический раздел - как вы сказали.

Критическая область - Это похоже на широкоформатную версию "не позволяйте исключениям выходить из потока".

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

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

2 голосов
/ 10 ноября 2010

Эта запись блога заполнит ваше замешательство. http://blogs.msdn.com/b/bclteam/archive/2005/06/14/429181.aspx

2 голосов
/ 14 апреля 2009

В соответствии с параллельным программированием в Windows Джо Даффи определения критической секции / региона следующие:

Критическая секция : в Win32 критическая секция представляет собой простую структуру данных (CRITICAL_SECTION), используемую для построения критических областей.

Критическая область : это кодовая область, которая взаимно исключается (кажется, это то, что вы называете критической секцией выше).

1 голос
/ 23 октября 2014

Критический раздел Набор инструкций, некоторые из которых обращаются к общим объектам.

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

В этом примере два цикла while являются критическими секциями.

int x = 0;
Process A() {
    while(true) {
        x++;
        x--;
    }
}
Process B() {
    while(true) {
        x++;
        x--;
    }
}

Критическая область Набор критических секций.

Теперь предположим, что вы можете выполнять ProcessA и ProcessB одновременно. Каждый процесс имеет критический раздел. Оба раздела имеют одну и ту же переменную (x). Вместе две критические секции образуют критическую область. Почему это важно? Если вы предполагаете, что критический раздел ProcessA защищен взаимным исключением, вы все равно получите неправильные результаты в x, поскольку ProcessB не соблюдает взаимное исключение. Вам необходимо внедрить взаимное исключение в критической области, внедрив его в каждую критическую область, составляющую область.

0 голосов
/ 17 марта 2014

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

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

0 голосов
/ 25 мая 2009

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

0 голосов
/ 14 апреля 2009

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

Например, boost :: thread использует критические секции в своей реализации Win32 - или, по крайней мере, когда я использовал его - и использует мьютексы в Linux через pthreads.

...