반응형

동기 I/O 작업

각각 하드웨어는 고유의 회로기판(어떤 퍼포먼스 및 메모리와 어떻게 주고 받을지 이미 구현)을 가지고 있다.

1.      FileStream Read 메서드 호출

2.      스레드는 관리코드에서 네이티브/유저 모드 코드로 전환 – Read내 내부적으로 ReadFile 호출

3.      ReadFile에서 IRP(I/O Request Packet:: I/O 요청 패킷) 데이터 구조체 할당

4.      윈도우 커널이 디바이스 핸들을 사용해 디바이스 판별 후 적절한 디바이스 IRP 큐에 큐잉

5.      개별 디바이스 드라이버는 현 PC에서 수행 중인 모든 프로세스로부터 I/O 요청이 큐잉되면 자신의 회로 기판의 하드웨어로 전달 후 작업 수행

6.      I/O 요청한 사용자 스레드는 할 일이 없다 해당 스레드를 슬립 모드로 변경
유저 모드 & 커널 모드 스택, 스레드 환경 블록(Thread Environment Block, TEB) 외 여러 데이터들이 공간 차지하는 경우 발생

7.      작업 마친 후에 스레드를 다시 깨워 다시 CPU 스케줄링.

비동기 I/O 작업 수행

1.      ReadAsync 이용 시 Task<Int32> 객체 생성 – Win32 ReadFile 함수 호출

2.      ReadFile IRP 할당 IRP 동기 시나리오와 동일한 방식으로 초기화

3.      이 값을 윈도우 커널로 전달.

4.      윈도우 OS는 받은 IRP를 하드 디스크의 IRP에 큐잉

5.      사용자 스레드는 블로킹되지 않고 스레드 풀로 반환(다른 추가적인 수행을 이어간다.)

6.      하드웨어가 IPR 요청 완료하면 CLR 스레드 풀내에 큐잉

5번에 사용되지 않는 스레드를 반환시키고 다른 수행을 실행하는 모습을 볼 수 있다. 특별히 컨텍스트 전환도 필요 X 최고의 속도로 수행

 

스레드가 Thread.Sleep 호출 시 스레드 풀은 대체할 새로운 스레드 생성.

그 스레드가 깨어날 경우 CPU 개수 보다 스레드가 많아짐 컨텍스트 전환 발생 성능 저하

특정 작업 완료 후 스레드 풀 반납 시 다른 수행이 발생 할 경우 새로 스레드를 할당하지 않는 방식으로 대응

 

TaskLogger 클래스 작업 완료되지 않은 비동기 작업을 보여주기 위한 용도로 사용(디버깅 용도)

Event 헨들러 메서드를 지원 – void를 반환형을 비동기 함수로 할 수 있는데
void EventHandlerCallback(Object sender, EventArgs e);

예외 발생 시 반환 형이 없어 확인을 할 수 없는데 이는 호출자의 동기화 컨텍스트(synchronization conext) 이용해 예외를 다시 던지도록 코드 생성

 

ThreadIO BeginBackgroundProcessing 메서드 호출 시 현재 스레드가 낮은 우선 순위의 I/O 요청을 수행할 수 있도록 한다. , CPU스케줄링 우선순위도 같이 낮아진다.
이럴 경우 동일한 락을 보통 우선순위의 스레드가 대기하고 있을 경우 낮은 순위 I/O 요청이 완료되기를 기다리는 현상이 발생할 수도 있다.

반응형

'C# > CLR via' 카테고리의 다른 글

단순 유저 모드 동기화 & 커널 모드 동기화  (1) 2020.03.25
단순 스레드 동기화  (1) 2020.03.25
LINQ  (0) 2020.03.25
스레드(Thread)  (0) 2020.03.25
직렬화 serialization  (0) 2020.03.25
Posted by Library of Lotus
,