14

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

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

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

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

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

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

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

Как я вообще не понимаю концепции, я не уверен, какие теги этот вопрос нуждается, кроме «.NET».

+0

Я уверен, что ваше понимание критического раздела верное. – Brian

+0

Это начало :). Я не уверен, что использовал правильные условия. Я видел «Критический раздел» в статьях о блокировке. Я видел только «Критический регион» на странице MSDN для Thread.BeginCriticalRegion. Я знаю, что «Ограниченный регион выполнения» - это потому, что для него есть страница MSDN. –

ответ

5

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

Критическая секция - как вы сказали.

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

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

Есть рекомендации по «нормальному программированию», которые выглядят немного так, т.е. при переопределении равных или неявного оператора вы не должны бросать (что-либо).

+0

Извините за задержку в благодарности. +1, и я принимаю это для описания и ссылки на пример комбо. Я действительно надеялся на немного подробностей в «Критическом регионе» и что именно внеполосное исключение, но я, вероятно, не должен был задавать несколько вопросов. –

+2

Исключение вне зоны - это исключение, которое не выдается кодом, который в настоящее время выполняется непосредственно, но частью структуры. Этот термин охватывает следующие исключения: StackOverflowException, OutOfMemoryException и ThreadAbortException. –

2

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

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

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

+0

Спасибо за ответ. «Критический раздел» был получен с http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx. И «Критический регион» из http://msdn.microsoft.com/en-us/library/system.threading.thread.begincriticalregion.aspx. Может быть, «Критический регион», как я перечислял, не является реальной концепцией? –

0

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

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

+0

Спасибо за ответ. Я не совсем понимаю это, например. Я не слышал о userpace, boost :: thread, kernel-space или pthread. Я просто смотрю на них. Я собираюсь, что эти термины должны иметь разные значения в Win32 до .NET, и это прекрасно, поскольку я хочу улучшить свое понимание того и другого. –

0

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

0

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

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

1

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

Игнорировать на тот момент, что оба 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

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

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

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

Смежные вопросы