programing tip

.NET의 작업자 및 I / O 스레드에 대한 간단한 설명

itbloger 2020. 12. 9. 07:54
반응형

.NET의 작업자 및 I / O 스레드에 대한 간단한 설명


.NET에서 작업자 및 I / O 스레드에 대한 상세하지만 간단한 설명을 찾는 것은 매우 어렵습니다.

이 주제와 관련하여 나에게 분명한 점 (기술적으로 정확하지 않을 수 있음) :

  • 작업자 스레드는 작업을 위해 CPU를 사용해야 하는 스레드입니다 .
  • I / O 스레드 ( "완료 포트 스레드"라고도 함) 는 작업을 위해 장치 드라이버를 사용해야 하며 기본적으로 "아무것도하지 않음", 비 CPU 작업의 완료 만 모니터링해야합니다.

명확하지 않은 것 :

  • ThreadPool.GetAvailableThreads 메서드가 두 유형의 사용 가능한 스레드 수를 반환하지만 I / O 스레드에 대한 작업을 예약 할 공용 API가없는 것 같습니다. .NET에서 작업자 스레드를 수동으로 만 만들 수 있습니까?
  • 단일 I / O 스레드가 여러 I / O 작업을 모니터링 할 수있는 것 같습니다. 사실인가요? 그렇다면 ThreadPool에 기본적으로 사용 가능한 I / O 스레드가 많은 이유는 무엇입니까?
  • 일부 텍스트에서는 I / O 작업 완료가 I / O 스레드에 의해 수행 된 후에 트리거되는 콜백을 읽었습니다. 사실인가요? 이 콜백이 CPU 작업이라는 점을 고려하면 작업자 스레드의 작업이 아닙니까?
  • 좀 더 구체적으로 말하자면 ASP.NET 비동기 페이지는 I / O 스레드를 사용합니까? 최대 작업자 스레드 수를 늘리는 대신 I / O 작업을 별도의 스레드로 전환 할 때 성능상의 이점은 정확히 무엇입니까? 단일 I / O 스레드가 여러 작업을 모니터링하기 때문입니까? 아니면 Windows가 I / O 스레드를 사용할 때보다 효율적인 컨텍스트 전환을 수행합니까?

.net / CLR에서 '작업자 스레드'라는 용어는 일반적으로 스레드를 생성 한 응용 프로그램을 대신하여 일부 '작업'을 수행하는 Main 스레드 이외의 스레드를 가리 킵니다. '작업'은 일부 I / O가 완료되기를 기다리는 것을 포함하여 실제로 모든 것을 의미 할 수 있습니다. ThreadPool은 스레드를 만드는 데 비용이 많이 들기 때문에 작업자 스레드의 캐시를 유지합니다.

.net / CLR에서 'I / O 스레드'라는 용어는 "중복 된"win32 호출 ( "완료 포트 I / O"라고도 함)에서 NativeOverlapped 콜백을 전달하기 위해 ThreadPool이 예약하는 스레드를 나타냅니다. CLR은 자체 I / O 완료 포트를 유지하며 ThreadPool.BindHandle API를 통해 모든 핸들을 바인딩 할 수 있습니다. 예 : http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx . 많은 .net API는이 메커니즘을 내부적으로 사용하여 NativeOverlapped 콜백을 수신하지만 일반적인 .net 개발자는이를 직접 사용하지 않습니다.

'작업자 스레드'와 'I / O 스레드'사이에는 기술적 인 차이가 없습니다. 둘 다 일반 스레드 일뿐입니다. 그러나 CLR ThreadPool은 작업자 스레드에 대한 높은 수요로 인해 네이티브 I / O 콜백을 디스패치하는 데 사용할 수있는 모든 스레드가 소모되어 잠재적으로 교착 상태가되는 상황을 방지하기 위해 각 풀을 별도로 유지합니다. (각각이 I / O가 완료되기를 기다리는 250 개의 작업자 스레드를 모두 사용하는 애플리케이션을 상상해보십시오).

개발자는 I / O 콜백을 처리 할 때 I / O 스레드가 ThreadPool로 반환되도록주의해야합니다. 즉, I / O 콜백 코드는 콜백 서비스에 필요한 최소한의 작업을 수행해야합니다. 그런 다음 스레드의 제어를 CLR 스레드 풀로 반환합니다. 더 많은 작업이 필요한 경우 해당 작업은 작업자 스레드에서 예약되어야합니다. 그렇지 않으면 응용 프로그램이 일반 작업자 스레드로 사용하기 위해 예약 된 I / O 완료 스레드의 CLR 풀을 '하이재킹'하여 위에서 설명한 교착 상태가 발생할 위험이 있습니다.

추가 읽기에 대한 몇 가지 좋은 참조 : win32 I / O 완료 포트 : http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx 관리 스레드 풀 : http://msdn.microsoft.com /en-us/library/0ka9477y.aspx BindHandle의 예 : http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx


NT의 프로그램에서 비동기 I / O를 사용하는 방법에 대한 설명부터 시작하겠습니다.

네이티브 API 함수 NtReadFile에 대한 래퍼 인 Win32 API 함수 ReadFile (예 :)에 익숙 할 수 있습니다. 이 함수를 사용하면 비동기 I / O로 두 가지 작업을 수행 할 수 있습니다.

  • 이벤트 객체를 생성하여 NtReadFile에 전달할 수 있습니다 . 이 이벤트는 읽기 작업이 완료되면 신호를 보냅니다.
  • 비동기 프로 시저 호출 (APC) 함수를 NtReadFile에 전달할 수 있습니다 . 본질적으로 이것이 의미하는 바는 읽기 작업이 완료되면 함수가 작업을 시작한 스레드의 대기열에 추가되고 스레드가 경고 가능한 대기를 수행 할 때 실행된다는 것 입니다.

그러나 I / O 작업이 완료 될 때 알림을받는 세 번째 방법이 있습니다. 당신은 만들 수 있습니다 I / O 완료 포트 함께 객체와 연관 파일 핸들을. I / O 완료 포트와 연관된 파일에서 작업이 완료 될 때마다 작업 결과 (예 : I / O 상태)가 I / O 완료 포트에 대기합니다. 그런 다음 전용 스레드를 설정하여 대기열에서 결과를 제거하고 콜백 함수 호출과 같은 적절한 작업을 수행 할 수 있습니다. 이것은 본질적으로 "I / O 작업자 스레드"입니다.

일반적인 "작업자 스레드"는 매우 유사합니다. 큐에서 I / O 결과를 제거하는 대신 큐에서 작업 항목을 제거합니다. 작업 항목 ( QueueUserWorkItem )을 큐에 넣고 작업자 스레드가이를 실행하도록 할 수 있습니다. 이렇게하면 작업을 비동기 적으로 수행 할 때마다 스레드를 생성 할 필요가 없습니다.


간단히 말해서 워커 스레드는 짧은 작업을 수행하는 것을 의미하며 완료되면 스스로 삭제됩니다. 콜백을 사용하여 상위 프로세스가 완료되었음을 알리거나 데이터를 다시 전달할 수 있습니다.

I / O 스레드는 상위 프로세스에 의해 중지 될 때까지 동일한 작업 또는 일련의 작업을 계속 수행합니다. 일반적으로 장치 드라이버가 장치 포트를 지속적으로 모니터링하기 때문에 이렇게 불립니다. I / O 스레드는 일반적으로 다른 스레드와 통신하고자 할 때마다 이벤트를 생성합니다.

모든 프로세스는 스레드로 실행됩니다. 애플리케이션은 스레드로 실행됩니다. 모든 스레드는 작업자 스레드 또는 I / O 스레드를 생성 할 수 있습니다.

성능과 사용 된 스레드의 수 또는 유형 사이에는 항상 미세한 균형이 있습니다. 프로세스에서 너무 많은 콜백 또는 이벤트를 처리하면 처리 할 때 주 프로세스 루프에 대한 중단 횟수로 인해 성능이 크게 저하됩니다.

작업자 스레드의 예는 사용자 상호 작용 후 데이터베이스에 데이터를 추가하거나 긴 수학적 계산을 수행하거나 파일에 데이터를 쓰는 것입니다. 작업자 스레드를 사용하여 기본 애플리케이션을 해제하면 작업이 수행되는 동안 고정되지 않으므로 GUI에 가장 유용합니다.


저보다 더 많은 기술을 가진 사람이 여기에 뛰어 들어 도와 줄 것입니다.

작업자 스레드는 많은 상태를 가지며 프로세서 등에 의해 예약되며 사용자가 수행하는 모든 작업을 제어합니다.

IO 완료 포트는 공유 상태가 거의없는 특정 작업을 위해 운영 체제에서 제공하므로 사용 속도가 더 빠릅니다. .Net의 좋은 예는 WCF 프레임 워크입니다. WCF 서비스에 대한 모든 "호출"은 실행 속도가 가장 빠르며 OS가 자동으로 처리하기 때문에 실제로 IO 완료 포트에 의해 실행됩니다.

참고 URL : https://stackoverflow.com/questions/2099947/simple-description-of-worker-and-io-threads-in-net

반응형