Successfully reported this slideshow.
Your SlideShare is downloading. ×

イベント駆動プログラミングとI/O多重化

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 78 Ad

More Related Content

Slideshows for you (20)

Similar to イベント駆動プログラミングとI/O多重化 (20)

Advertisement

More from Gosuke Miyashita (20)

イベント駆動プログラミングとI/O多重化

  1. 1. イベント駆動プログラミン グと I/O多重化
  2. 2. イベント駆動プログラミング
  3. 3. イベントを待機し、起こっ たイベントに従って処理を 行うプログラミングパラダ イム
  4. 4. フロー駆動型プログラミン グと呼ばれる従来のプログ ラミングパラダイムに対す る概念
  5. 5. GUIプログラミング
  6. 6. キーやマウスの入力をイベ ントとして受け取って処理
  7. 7. ネットワークプログラミ ング
  8. 8. ネットワークI/Oを多重化して 1プロセス1スレッドで複数の ネットワーク接続を同時に捌 く
  9. 9. 非イベント駆動な ネットワークプログラミング process Client or thread process Client or thread process Client or thread
  10. 10. イベント駆動な ネットワークプログラミング Client process Client or thread Client
  11. 11. 今回はこっちがメイ ン
  12. 12. The C10K Problem
  13. 13. イベント駆動型プロ グラミングの処理フ ロー
  14. 14. element.addEventListener( ’click’, function(){ console.log(‘hoge’) }, true );
  15. 15. これってどう動いてる の?
  16. 16. イベントループ (メインループ)
  17. 17. イベント登録 イベント待ち イベント処理 後処理
  18. 18. 高レベルな言語では イベントループを自分で 書く必要はない
  19. 19. element.addEventListener( ’click’, function(){ console.log(‘hoge’) }, true );
  20. 20. 後で自分で書くと どうなるか解説します
  21. 21. イベントの種類
  22. 22. タイマー
  23. 23. I/O
  24. 24. シグナル
  25. 25. 子プロセス
  26. 26. イベント登録 イベント待ち イベント処理 後処理
  27. 27. イベントループの話 おしまい
  28. 28. I/O多重化
  29. 29. ネットワークプログラミ ングにおけるイベント駆 動の要
  30. 30. これなくして1プロセス1ス レッドで複数のネットワー ク接続を同時捌くことはで きない
  31. 31. なぜ1プロセス1スレッ ドで捌く必要があるの か?
  32. 32. The C10K Problem でググれ
  33. 33. I/O多重化の仕組み
  34. 34. I/Oイベント登 録 I/Oイベント待 ち I/Oイベント処 理 後処理
  35. 35. 非同期echoサーバを 題材にサンプルコードで見 る
  36. 36. 多重化してない例
  37. 37. int sock = socket(PF_INET, SOCK_STREAM); bind(sock, addr); listen(sock); while ( 1 ) { int new_sock = accept(sock, &addr); char buf[100]; size_t size = read(new_sock, buf, 100); if ( size == 0 ) { close(new_sock); } else { write(new_sock, buf, size); } }
  38. 38. 多重化での処理の流れ
  39. 39. クライアント 待ち受けソケット (イベント監視対象 サーバ につっこむ)
  40. 40. クライアント 待ち受けソケット (イベント監視対象) サーバ
  41. 41. クライアント accept(sock) 待ち受けソケット 接続ソケット (イベント監視対象) サーバ (イベント監視 対象につっこ む)
  42. 42. クライアント 待ち受けソケット 接続ソケット (イベント監視対象) サーバ (イベント監視対 象)
  43. 43. selectによる多重化
  44. 44. https://gist.github.com/mizzy/5343931
  45. 45. epollによる多重化
  46. 46. https://gist.github.com/mizzy/5343937
  47. 47. 多重化用関数
  48. 48. select poll epoll kqueue /dev/poll
  49. 49. select/pollは全部の ソケットを調べる
  50. 50. epoll, kqueue, /dev/pollはイ ベントが発生したソケット だけを調べることができる
  51. 51. イベントライブラリ
  52. 52. libevent libev
  53. 53. OSによる違いを吸収 してくれる
  54. 54. I/O多重化以外にもタイ マーイベントやシグナル イベントなんかも扱える
  55. 55. node.jsは libevent + libeio
  56. 56. 各種言語による 非同期echoサーバ
  57. 57. Perl (AnyEvent)
  58. 58. https://gist.github.com/mizzy/5343944
  59. 59. Ruby (EventMachine)
  60. 60. https://gist.github.com/mizzy/5343953
  61. 61. Python (twisted)
  62. 62. https://gist.github.com/mizzy/5343956
  63. 63. Python (eventlet)
  64. 64. https://gist.github.com/mizzy/5343959
  65. 65. node.js
  66. 66. https://gist.github.com/mizzy/5343964
  67. 67. イベント駆動プログラミン グのデメリット
  68. 68. マルチコアでスケールしな い
  69. 69. 処理の流れが追いにくい 書きにくい
  70. 70. var req_to_zenrin = http.request( options, function(res2) { res2.on('end', function() { res.end(); }); res2.on('data', function(chunk) { res.write(chunk); }); } );
  71. 71. var referer; sdb.getItem( 'gha', host, function( error, result ) { if ( result ) { referer = ‘http://hoge.com/’; } } ); // sdb.getItem()終了前に次の処理
  72. 72. sdb.getItem( 'gha', host, function( error, result ) { if ( result ) { access_to_zenrin('http://hoge.com'); } else { access_to_zenrin(); } } );
  73. 73. ネットワークアクセスを伴 う 処理をすべて非同期で 書かないといけない
  74. 74. なのでlibmysqlclientは 使えない
  75. 75. node-mysqlはlibmysqlclient 相当の処理を再実装してる (っぽい)
  76. 76. 参考文献

×