LISTORY

[윈도우즈 시스템 프로그래밍] 중첩(Overlapped) I/O 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 중첩(Overlapped) I/O

LiStoryTeller 2018. 11. 18. 17:23


뇌를 자극하는 윈도우즈 시스템 책 관련 YouTube 강의 내용 정리이다.


저번 시간에 이어 중첩(Overlapped) I/O 부분을 정리하겠다.


YouTube 주소 : 중첩(Overlapped) I/O



중첩(Overlapped) I/O


저번 시간에 배운 I/O 모델의 구현 방법에 대해 배워보겠다.


먼저 배울 것은 중첩 I/O 구현 모델이다.



중첩 I/O를 구현하기 위해선, 위에 그림을 머릿속에 떠올리는 것이 좋다. 


이를 이렇게 정리하지 않으면 어떻게 해야할지 혼란스러울 때가 많기 때문이다.


중첩 I/O를 구현하기 위한 첫번째 포인트는 일반적인 I/O함수를 호출하는 것이다. 여기서는 WriteFile함수를 쓰면 된다. 


WriteFile함수의 전달 인자를 보면 OVERLAPPED 구조체가 있다.


이 인자는 중첩 I/O를 하겠다는 것을 알리는 효과를 갖는다. 또한 중첩 I/O에 대한 정보를 담을 수 있다.


중첩 I/O 가 아니면 COMPLETION ROUTINE I/O가 있는데, 이는 중첩 I/O를 확장한 것이다.


따라서 그것도 중첩 I/O라 할 수 있다. 그래서 둘 다 이 구조체를 초기화 해주어야 한다.


그림의 오른쪽을 보면 OVERAPPED 구조체를 볼 수 있다.



OVERLAPPED 구조체


주의를 기울여야할 인자는 hEvent 이다. I/O가 끝났다는 것을 확인할 수 있다.


internal은 내부적으로 선언된 것이므로 신경안써도 되고


offser, offsetHigh 는 file I/O에서 파일 포인터를 이동하는데에도 사용이 된다.


반드시 기억해야 할 것은 일단 hEvent 함수 하나이다.


그럼 초기화 하는 방법은 간단하다. 전체를 초기화 하고 EVENT 오브젝트를 생성하여 hEvent에 저장해주면 된다.


I/O 작업이 끝난 이후에는 자동적으로 EVENT가 signaled 상태로 바뀌며 작업을 시작한다.



WriteFile 함수를 호출하는데 두가지가 필요하다.


일단 OVERAPPED 구조체의 변수와 실제 i/o를 누구와 할지 핸들 정보를 알려주어야 한다.


여기서 전달된 인자를 가지고 I/O 작업을 하는데 WirteFile 함수의 정보를 통해 비동기로 작업을 확인하고,


I/O 작업이 끝난 이후에는 자동적으로 EVENT가 작업을 시작한다.





완료루틴 I/O 구현 모델



A 연산(I/O연산)이 끝나고 나면 그에 대한 루틴(함수)가 자동적으로 시작되게 하겠다.


이 부분이 앞에 모델에서 추가된 것의 전부이다. 그걸 WriteFileEx 함수에서 확인할 수 있다.


WriteFile 함수 대신에 WriteFileEx 함수를 호출해야 한다.


WriteFileEx 함수에는 Completion Routine을 인자로 전달해서 I/O를 연결하는 역할을 하나 더 갖고있다.


I/O연산이 끝났다는 것은 Completion Routine이 자동적으로 호출되면서 알 수 있다.


따라서 OVERAPPED 구조체의 Event Handle이 불필요해지는 것이다.


그럼 굳이 그걸 넘길필요가 있는가? 필요가 있다.


OVERAPPED 안에는 내부적으로 필요한 변수가 있으므로 반드시 전달해주어야 한다.


Completion Routine은 그림의 하단 코드와 같이 전달해주면 되는데, 우리가 전달하는 것이 아니다.


CompletionRoutine은 윈도우즈 시스템에 의해 자동적으로 호출된다. 즉, callback 함수이다.


실제로 함수를 호출하는 것이 윈도우즈면, 인자를 전달해 주는 것도 윈도우즈다.


어떤 에러가 발생했는지, 몇 바이트가 최종적으로 전달되었는지 그 바이트 수, 우리가 전달한 Overlapped 구조체 등이 인자로 전달된다.










Comments