14

실제로 이들의 개념은 3 가지입니까, 혼란 스럽습니까? (나는 스레딩과 가비지 컬렉션에 대한 기사를 함께 읽고 혼란스러워했습니다.)"중요 섹션", "중요 영역"및 "제한된 실행 영역"의 차이점

"중요 섹션" - 나는 이것이 다중 스레드를 원하지 않는 코드 섹션 동일한 시간, 즉 내부 잠금 및 Monitor.Enter/Exit 문에 액세스하고 있습니까?

"중요한 영역" - 여기에는 실제 단서가 없습니다. MSDN은 "이 섹션에서 던져진 예외가 더 많은 영향을 미칠 수 있음을 호스트에 알립니다"라고 말합니다. 그리고 "CLR의 호스트, 예를 들어 Sql Server"는 "다르게"중요한 영역 내에서 발생하는 예외를 처리하도록 선택할 수 있습니다. 어떻게 다르게? 그리고 왜? 무엇보다 실제 시나리오에서 코드를 중요한 영역으로 표시해야합니까?

"제한된 실행 영역" - 가비지 수집 아티클에서 CriticalFinalizerObject에 대해 읽었을 때이 문제가 발생했습니다.

나는 MSDN에서이 코드 중 하나의 코드가 어떻게 든 작동하도록 보장된다는 것을 이해할 수 있습니다. 그러나 어떻게 "out-of-band"예외를 throw하지 않아야합니다.

out-of-band exception은 무엇입니까? (나는 이것을 Google에서했지만 "경계선 밖의 예외"를 의미 하는지를 물었다.).

처리되지 않은 예외입니까? 아니면 특정 유형의 예외입니까? 그리고 다시 한번, 무엇보다도 실제 시나리오에서 "제한된 실행 영역"이 필요할 수도 있습니다.

개념을 전혀 이해하지 못하기 때문에이 질문에 ".NET"이외의 태그가 필요한지 잘 모르겠습니다. 다음 조 더피하여 윈도우 동시 프로그래밍 따르면

+0

크리티컬 섹션에 대한 이해가 정확하다고 확신합니다. – Brian

+0

시작입니다 :). 나는 정확한 용어를 사용했는지 확신 할 수 없다. 잠금에 관한 기사에서 "중요 섹션"을 보았습니다. Thread.BeginCriticalRegion의 MSDN 페이지에서 "Critical Region"만 보았습니다. "제한된 실행 영역"은 MSDN 페이지가 있기 때문입니다. –

답변

5

그냥 내 이해 :

중요한 부분 - 당신이 말한대로.

중요 영역 - 이것은 "예외가 스레드에서 벗어남을 허용하지 마십시오"라는 큰 그림 버전처럼 보입니다.

제한된 실행 영역 - 이것은 예외에 의한 중단을 방지함으로써 코드 조각을 더 많거나 적게 만드는 방법입니다. example on this page은이를 사용하여 핸들 할당 및 저장이 모두 실행되는지 확인합니다. 롤백이 없으므로 예방 시스템이 더 중요합니다.

"보통 프로그래밍"에 대한 지침이 있습니다. 즉, 같음 또는 암시 적 연산자를 재정의 할 때 아무것도 표시하지 않아야합니다.

+0

덕분에 늦어서 죄송합니다. +1 및 예제 콤보 링크 및 설명에 동의합니다. 나는 "Critical Region"에 대한 약간의 세부 사항을 원했으며, 대역 외 예외가 정확히 무엇인지 알고 싶었지만 아마도 여러 질문을해서는 안됩니다. –

+2

대역 외 예외는 현재 직접 실행되고 있지만 프레임 워크의 일부로 throw되지 않는 예외입니다. 이 용어에는 StackOverflowException, OutOfMemoryException 및 ThreadAbortException 예외가 포함됩니다. –

2

는 임계 구역/영역에 대한 정의이다 :

크리티컬 섹션 : Win32에서 중요한 섹션은 간단한 데이터 구조 (CRITICAL_SECTION)의 임계 영역을 구축하는 데 사용 .

중요 영역 : 상호 배제를 선호하는 코드 영역입니다 (위의 중요한 섹션으로 간주됩니다). 이러한 개념의

+0

응답 해 주셔서 감사합니다. "중요 섹션"은 http://msdn.microsoft.com/ko-kr/library/c5kehkcz.aspx에서 제공되었습니다. 그리고 "Critical Region"(http://msdn.microsoft.com/en-us/library/system.threading.thread.begincriticalregion.aspx). 어쩌면 내가 열거 한 "중요 지역"은 실제 개념이 아니겠습니까? –

0

Windows에서 나는 크리티컬 섹션까지만 작업했습니다. 제 경험상 Win32 사용자 공간 스레드 잠금 메커니즘입니다. 즉, 하나의 프로세스 내에서 여러 스레드가 공유하는 리소스를 잠글 수 있습니다. 이것은 시스템 차원이 아니며 프로세스 차원에서만 발생합니다. 예를 들어 뮤텍스와 같은 커널 공간 잠금이 아닌 것입니다.

예를 들어 boost :: thread는 Win32 구현에서 중요한 섹션을 사용합니다. 또는 적어도 사용했을 때와 마찬가지로 pthreads를 통해 Linux에서 mutex를 사용합니다.

+0

응답 해 주셔서 감사합니다. 나는 그것을 완전히 이해하지 못한다. userspace, boost :: thread, kernel-space 또는 pthread에 대해 들어 보지 못했습니다. 나는 그것들을보고있다. 나는이 용어들이 Win32에서 .NET으로 다른 의미를 가져야한다는 것을 모으고있다. –

0

다른 프로세스가 입력하기 전에 시작하는 각 프로세스에서 완료해야하는 코드 섹션을 임계 영역이라고합니다.

0

중요 섹션 : 코드의 일부입니다. 모든 프로세스에는 커먼 변수 교환, 테이블 업데이트, 파일 쓰기 등의 중요한 섹션이 있습니다. 중요한 기능은 중요한 프로세스에서 하나의 프로세스가 실행 중일 때 다른 프로세스가 임계 섹션에 들어가는 것을 허용하지 않고 수동 제외. 물론이를 달성하기 위해 "세마포어"라는 동기화 도구가 'n'프로세스가있을 때 사용됩니다. 세마포어는 정수입니다.

중요 영역 : 프로그래머가 할 수있는 임계 영역 문제에 대한 세마포어 솔루션과 관련된 특정 오류를 방지하는 동기화 구성입니다.

1

중요 섹션 일부 명령은 공유 객체에 액세스합니다.

ProcessA와 ProcessB를 동시에 실행할 수있는 순간은 무시하십시오. ProcessA 또는 ProcessB가 여러 스레드에서 동시에 실행될 경우 경쟁 조건이 발생할 가능성이 높으므로 x 값에 의존하지 않으려합니다.

이 예제에서 두 개의 while 루프는 중요 섹션입니다.

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

중요한 지역 임계 영역의 세트입니다.

이제 ProcessA와 ProcessB를 동시에 실행할 수 있다고 가정하십시오. 각 프로세스에는 중요한 섹션이 있습니다. 두 섹션 모두 동일한 변수 (x)를 공유합니다. 두 개의 중요한 섹션이 합쳐져서 중요한 영역을 형성합니다. 왜 이것이 중요한가? ProcessA의 중요 섹션이 상호 배제에 의해 보호된다고 가정하면 ProcessB는 상호 배타를 존중하지 않으므로 잘못된 결과가 x로 표시됩니다. 중요한 영역을 지역을 구성하는 모든 중요 섹션에 구현하여 중요 영역에 상호 배제를 구현해야합니다.

0

Microsoft는 사물을 다르게 정의 할 수 있지만, 일반적으로 중요한 지역중요 섹션같은 일 있습니다.

그들은 그들이 원하는 것을 방지 경쟁 상태가 발생할 것이다 - 좌표 둘 개 이상의 프로세스 (또는 스레드) 동일한 공유 메모리 액세스하는 영역과 실패를 설명하는 데 사용되는 Pétur가 위의 변수를 증가 및 감소시키기 위해 제공하는 고전적인 예와 같이 실행중인 동작.

좋은 토론은 Tanenbaum, A. S., 및 Bos, H. (2015)에서 찾아 볼 수 있습니다. 현대 운영 체제 (Pearson, Boston, Ma), 4th ed, pp. 1101. 이전 버전 및 운영 체제 코스 용 자료를 제공하는 수많은 대학의 코스 웹 사이트.

관련 문제