비동기 알림과 비동기 io

fopenfclose의 이미지

WSAEventSelect 모델과 같은 비동기 알림 모델과 WSARecv 함수와 같은 비동기 IO를 같이 쓰는 것과

WSAEventSelect 모델과 같은 비동기 알림 모델과 recv 함수와 같은 동기 IO를 같이 쓰는 것의 차이는 무엇 인가요?

MyAbby의 이미지

굳이 WSA* (아마 윈도에서 제공하는 소켓?)에 국한되는 질문이 아닙니다.

IO 처리(소켓이나 파일, 파이프 등등)에는 블록, 논블록, 비동기(뒤에 두개는 거의 같은 계념인데 문맥만 약간 다릅니다)가 있습니다. 큰 차이는 스레드가 기다리느냐, 기다리지 않느냐인데
블록킹은 말 그대로 막힘니다. 즉, 스레드가 논리 버퍼(파일 시스템, 하드웨어 같은 저급버퍼가 아니라)에 있는 데이터가 모두 처리될 때 까지 기다림니다. 이걸 유닉스 진형에서 "io wait"이라고 합니다. 문맥상으로는 처리이나 실제로는 스케듈러가 CPU시간을 안 주는. 유닉스 설계 당시에는 이 방법이 유일했습니다.

논블럭은 그 반대라고 생각하심 돼요. 스레드가 처리할 데이터를 버퍼에다만 큐하고 다른 중요한 일을 처리하는 겁니다. 이 떄 하드나 네트워크 인터페이스는 열심히 돌고 있겠죠.
뭐, 비동기도 똑같은데, 다른 점이 있다면 그 '처리의 결과'를 확인하는 방법이 다릅니다. 이건 OS마다 정의가 중구남방이니 굳이 기술 안 합니다.

걍 뭐하러 동기만 쓰지 왜 비동기가 나왔느냐? 이 블록킹 처리의 비효율 때문입니다. 논블록의 패턴이 가지는 장점 또한 있구요.
이건 'C10K 문제' 를 찾아보시면 더 많은 정보를 얻으실 수 있습니다. 많은 IO를 동시에 처리해야 할 수록 블록킹 IO는 스레드를 IO개수 만큼 만들어 줘야 했습니다.
엄청난 비효율이죠. 각 스레드가 다 쓰지도 않는 스택을 하나하나 고정적인 크기로 할당해 줘야하고, 스케듈러도 점점 힘든 소리를 내구요.
이건 확인된 결과인게, 그 어떤 시스템이건 스레드의 개수가 몇천개이면 하드웨어가 아무리 좋아도 정상적인 처리가 힘듭니다. 메모리도 비효율적이구요. 이걸 병목현상이라고 하더군요.

핵심은 한 스레드로 여러 IO를 동시에 처리할 수 있다는 겁니다. select()나 poll() 같은 함수로 처리해야 할 IO들만 뽑아서 효율적으로 처리한다는 거죠.
이벤트 처리나 버퍼 오버플로, 타임아웃 등 처리해야 할 것들이 많아지면서 연산량에서 손실을 약간 보긴 하지만 스레드를 마구 생성해야 하는 오버헤드보다는 횔 나은거에요.
현대, 밀레니엄 이후의 무게있는 서버 프로그램들은 대부분 이렇게 작성됩니다.

솔직히 posix 스레드보다는 Win32 스레드가 성능이 더 좋아서 윈도우 환경에서는 걍 개념없이 블럭킹 모델로 설계를 해도 그리 문제가 되진 않습니다.
posix 스레드를 사용한다면 피할 수 없는 문제.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.