윈도우 Overlapped I/O에 대해서...

mg2000의 이미지

안녕하세요.

제가 요즘 소켓쪽으로 공부중인데...

그냥 전통적인 소켓은 동시에 여러명의 데이터를 수신하려면, 쓰레드를 소켓수만큼 만들어줘서 받아야 되는데,

Overlapped I/O를 쓰면 받고 나서 완료 통지를 해 준다고 하는데요.

그렇다면 Overlapped I/O는 별도의 쓰레드를 알아서 생성해서 데이터를 받는다는 것인가요?

(그 렇다면 Context Switching의 단점은 Overlapped I/O를 써도 그대로 유지되는 것 같고...)

아 니면 하나의 소켓에서 데이터 수신을 완료하고 완료 통지를 한 다음, 다음 소켓의 데이터를 수신하고.. 이런식인지...

그 렇다고 한다면, 특정 소켓에서 대용량의 데이터를 수신하게 되면, 다른 소켓은 대용량 수신을 끝날때까지 놀고 있어야 하는건지...

제 가 이해하고 있는게 맞는건가요?

chadr의 이미지

Overlapped I/O를 사용하면 입출력 함수에 Overlapped I/O 완료 통지를 받을 콜백함수를 주게 되어있습니다.
그리고 해당 입출력이 끝나면 이 함수가 불리게 되지요. 이때 이 함수에서 어떤 데이터가 완료 되었는지 알기
위해서 Overlapped I/O를 시작하기전 유저데이터를 넣을수 있습니다. 여기에 소켓이면 소켓, 파일이면 파일핸들등을
같이 넣어서 넘겨주면 운영체제에서 콜백을 부를때 저 데이터를 같이 넘겨줍니다.

입출력 순서는 어떤것이 먼저 올지는 모릅니다. 먼저 입출력이 완료된 것이 먼저 옵니다.
단, 소켓이면 소켓 파일이면 파일핸들의 각각 개개별 시간적 순서는 지켜줍니다.

물론 비동기완료통지를 위해서 운영체제에서 내부적으로 스레드를 만들어서 돌립니다. 컨텍스트 스위칭의 오버헤드는 당연히 있습니다.
특정 소켓이나 파일핸들에서 너무 오랜 시간동안 입출력이 지체되면 운영체제가 알아서 빨리 끝나는거 먼저
응답을 주게 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

drinkme의 이미지

제가 아는 바는 chadr님이 말씀하신 것과 조금 다른데요...

overlapped i/o를 하고 싶으면, 해당 i/o 함수를 호출할때 event 객체를 같이 넘겨줍니다.
그리고, 호출은 바로 return하죠. 실제 i/o가 끝난것은 아닙니다.
실제 작업이 처리되면, kernel에서 event객체에 flag를 설정해 줍니다.
application에는 그 event객체의 flag를 검사하거나
waitforobject() 등의 함수를 사용해서, event객체의 flag를 기다릴 수 있고요.

굳이, thread를 생성하거나 등등의 필요는 없습니다. 굳이 원하지 않는다면요.

chadr의 이미지

두가지 방법이 있습니다. 제가 말씀드린 것은 Completion Routine를 이용하는 것이고
drinkme님이 말씀하신건 Completion Routine를 사용하지 않는 경우입니다. 구분을 지었어야하는데
혼용해서 말씀드려버렸네요..

overlapped i/o만 이용하실거면 drinkme 님의 말씀이 옳습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.