2012年4月14日のブックマーク (21件)

  • C言語でコルーチン(co-routine) - なんでも作っちゃう、かも。

    Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。 C言語でコルーチンを実装してみる。 コルーチン(co-routine)とはプログラミングの構造の一種。サブルーチンがエントリーからリターンまでを一つの処理単位とするのに対し、コルーチンはいったん処理を中断した後、続きから処理を再開できる。接頭辞co-は協調を意味するが、複数のコルーチンが中断/継続により協調動作を行う。 組み込みシステムではよく、複数の処理を同時に行う必要がある。そのような場合、コルーチンが使えれば、処理の記述が楽に行える。switch-caseあるいは関数テーブルなどを駆使すれば、実現することは可能だが、見通しがわるくなる。 コルーチンをサポートする言語にはModu

  • 並列イベント駆動I/Oフレームワーク「mpio」リリース - Blog by Sadayuki Furuhashi

    分散KVS kumofs のコードは、全体で約2万行です*1。 そのうち、ネットワークI/Oやプロトコルに関するコードは約1万行*2で、全体の約半分を占めています。 ロジックは残りの半分*3だけで実装されています。 この実例から分かりますが、kumofsのような分散アプリケーションを開発するにはI/O周りの実装が大変で、とてつもなく大きな障壁になっています。*4 さらに今日では、性能を稼ぐためにマルチスレッド化が必須です。また、多数のクライアントを少ないリソースで効率よく相手にするには、非同期・イベント駆動型のアーキテクチャも必要になります。さらに、究極的な性能を達成すべく GC を利用しない C++ においては、実装のみならず設計も大変です。 これに加えてソケットAPIの難解な挙動に対処にしなければならないため、C言語やC++によるネットワークプログラミングは、vimの使いこなしなどと同

    並列イベント駆動I/Oフレームワーク「mpio」リリース - Blog by Sadayuki Furuhashi
  • 並列イベント駆動I/Oフレームワーク「mpio」リリース - Blog by Sadayuki Furuhashi

    分散KVS kumofs のコードは、全体で約2万行です*1。 そのうち、ネットワークI/Oやプロトコルに関するコードは約1万行*2で、全体の約半分を占めています。 ロジックは残りの半分*3だけで実装されています。 この実例から分かりますが、kumofsのような分散アプリケーションを開発するにはI/O周りの実装が大変で、とてつもなく大きな障壁になっています。*4 さらに今日では、性能を稼ぐためにマルチスレッド化が必須です。また、多数のクライアントを少ないリソースで効率よく相手にするには、非同期・イベント駆動型のアーキテクチャも必要になります。さらに、究極的な性能を達成すべく GC を利用しない C++ においては、実装のみならず設計も大変です。 これに加えてソケットAPIの難解な挙動に対処にしなければならないため、C言語やC++によるネットワークプログラミングは、vimの使いこなしなどと同

    並列イベント駆動I/Oフレームワーク「mpio」リリース - Blog by Sadayuki Furuhashi
  • 非同期レプリケーションで単調読み出し整合性を保つ - sdyuki-devel

    レプリケーション*1は分散トランザクションと紙一重で、複数のサーバに分散された複数のデータを同時に書き換えたい。 もしこれが同時でないと、クライアントによって異なるデータを読んでしまう可能性がある: しかし実際には同時でなくても良い。サーバ2からデータを読み出される前に、サーバ2にデータを同期してしまえば「まったく問題ない」: もう一点、サーバ1から新しいデータが読み出される前ならば、サーバ2から古いデータを読み込んでも「まったく問題ない」: つまり、整合性のない(それぞれのサーバが異なるデータを持っている)状態が発生したとしても、それが観測されなければ、実質的にすべてのデータは同時に更新されたように見える。 そこで、次の2つのルールを設定する: ルール1:クライアントは、整合性がない状態を観測したら、すべてのクライアントが古いデータを読み出さなくなるまで、データを読み出さない ルール2:

    非同期レプリケーションで単調読み出し整合性を保つ - sdyuki-devel
  • sdyuki-devel

    イベント駆動型のプログラムでは、エラー処理の記述が面倒になることがある。これを何とかしたい。 例えば、keyからidを引き、idからdata引くプログラムを書きたいとする。 手続き型で書くと以下のようになる: def doit(key) id = get_id(key) data = get_data(id) return data end ここで、get_id と get_data は長くブロックするので、イベント駆動型にしたいとする。 そうするとプログラムの正常系の処理は↓このようになる。 def doit(key, &callback) get_id(key) {|id| get_data(id) {|data| callback.call(data) } } # futureを返すのは良いアイディア end ここまでが前提条件。 このプログラムのエラー処理を愚直に書くと、↓このよう

    sdyuki-devel
  • POSIX AIOとLinux AIO - sdyuki-devel

    って、違う実装だったのかー! http://d.hatena.ne.jp/hirose31/20070721/1184952958 http://d.hatena.ne.jp/hirose31/20070721/1184950454 aio_*がなんともイマイチで、aioなコネクションプールを作りかけて結局epoll/kqueue両用コード作った方が良くない?になってしまったのだけど、Linux AIOは実はいけてるんじゃないか。 ちなみに↓コレが前にaio_*でコネクションプールを作ろうとして崩壊した残骸。 http://viver.sourceforge.jp/cgi-bin/repos/ddfs.cgi?cmd=manifest;manifest=12297510ae7e810ec07d188f1bf05fe9193fb2fe;path=/src/asstream/ なんかFreeB

    POSIX AIOとLinux AIO - sdyuki-devel
  • FreeBSDでaio - その2 - (ひ)メモ

    (id:hirose31:20070719:1184773995 の続き) できた。 my_aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT を使えばおk その名の通り、kqueue + kevent を組み合わせて非同期I/Oできたす。 必要な大きさのstruct kevent *をまろっくして kqueue()をこさえて aiocbの通知設定をして my_aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; my_aiocb.aio_sigevent.sigev_notify_kqueue = my_kqueue; my_aiocb.aio_sigevent.sigev_value.sival_ptr = iocb; aio_read or aio_write して非同期I/Oリクエストをして kev

    FreeBSDでaio - その2 - (ひ)メモ
  • Linuxでaio - (ひ)メモ

    実装が2つある。以下、あくまで今の時点でのLinuxの場合の状況/実装のおはなし。 POSIX aio aio_read(3) とか aio_write(3), aio_error(3), aio_return(3) とか。 インターフェースはPOSIXで定義されているのと同じ。 システムコールじゃなくてライブラリ関数(librt) 裏でpthreadつくってがんばってるげ。 libaio http://lse.sourceforge.net/io/aio.html http://ftp.jaist.ac.jp/pub/Linux/Fedora/development/source/SRPMS/libaio-0.3.106-3.2.src.rpm とか io_prep_pread(2), io_prep_pwrite(2), io_submit(2), io_queue_init(2),

    Linuxでaio - (ひ)メモ
  • aio(7) - Linux manual page

    AIO(7) Miscellaneous Information Manual AIO(7) NAME         topaio - POSIX asynchronous I/O overview DESCRIPTION         topThe POSIX asynchronous I/O (AIO) interface allows applications to initiate one or more I/O operations that are performed asynchronously (i.e., in the background). The application can elect to be notified of completion of the I/O operation in a variety of ways: by delivery of

  • マルチコア時代の高並列性IOアーキテクチャ Wavy - Blog by Sadayuki Furuhashi

    シングルスレッドではもう遅い。 以前にマルチコア時代の高速サーバーの実装で、「ネットワークIOはマルチスレッドで動かすが、その他の部分はシングルスレッドで動かす」というIOアーキテクチャの実装(mp::iothreads)を紹介しました。iothreadsはロジック部分をシングルスレッドで書けるため実装の手間を抑えることができ、ネットワークIOがボトルネックになるプログラムには特に適していると思われます。 しかし実際にiothreadsを使ってプログラムを書いてみると、非常に負荷が高い状況でシングルスレッドの部分の処理速度がボトルネックになってしまうことがありました。 そこでマルチコアCPUの性能を引き出すために、徹頭徹尾マルチスレッドで動かすIOアーキテクチャを実装してみました。 1つのスレッドが、ある時はepoll_wait()し、ある時はread(2)を行い、ある時はイベントを処理す

    マルチコア時代の高並列性IOアーキテクチャ Wavy - Blog by Sadayuki Furuhashi
  • はやいTCPサーバの書き方 - nyaxtのPC作業ログ

    cagra高速化にあたってのノウハウを一部公開してみます。また明日校正/更新します。つっこみ待ちです。 select(2)の代わりにepoll_wait(2), kqueue, /dev/epoll等を使う 他に山ほど解説ページがあるので略 大量のディスクリプタを処理するようなサーバの場合、多少効果があるかもしれません。しかし、クライアント数が少ない場合、劇的な性能の向上は見込めないとおもいます。クライアント数が多い場合は、1セッション1スレッドなモデルではOS側のタスクスイッチングのオーバーヘッドが効いてくることも多いです。クライアント数を増やすには複数のセッションを1スレッドで処理できるようにすると良いです。実装にあたっては、non-blocking ioを活用すると効果的です。 TCP_NODELAYを設定する Nagleアルゴリズムをオフにします。多少応答性が良くなります。 これっ

    はやいTCPサーバの書き方 - nyaxtのPC作業ログ
  • 軽量スレッドブームだと思うので、そこらへんの情報をまとめてみる - 金利0無利息キャッシング – キャッシングできます - subtech

    はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28

    軽量スレッドブームだと思うので、そこらへんの情報をまとめてみる - 金利0無利息キャッシング – キャッシングできます - subtech
  • ネットワークプログラムのI/O戦略 - sdyuki-devel

    図解求む。 以下「プロトコル処理」と「メッセージ処理」を分けて扱っているが、この差が顕著に出るのは全文検索エンジンや非同期ジョブサーバーなど、小さなメッセージで重い処理をするタイプ。ストリーム指向のプロトコルの場合は「プロトコル処理」を「ストリーム処理」に置き換えるといいかもしれない。 シングルスレッド・イベント駆動 コネクションN:スレッド1。epoll/kqueue/select を1つ使ってイベントループを作る。 マルチコアCPUでスケールしないので、サーバーでは今時このモデルは流行らない。 クライアントで非同期なメッセージングをやりたい場合はこのモデルを使える: サーバーにメッセージを送信 イベントハンドラを登録;このときイベントハンドラのポインタを取っておく イベントハンドラ->フラグ がONになるまでイベントループを回す イベントハンドラ->結果 を返す 1コネクション1スレッ

    ネットワークプログラムのI/O戦略 - sdyuki-devel
  • Kazuho@Cybozu Labs: 「サーバ書くなら epoll 使うべき」は、今でも正しいのか

    多数のTCP接続をハンドリングするサーバを書くなら、1コネクション1スレッドのモデルではなく、epollやkqueueのようなイベント駆動型のI/O多重化を行うべきだ、と言われます。だが、そのような主張は、「C10K問題」が書かれた2002年から7年経過した今でも有効なのでしょうか? echoサーバを書いて、ベンチマークを取ってみることにしました。 ふたつのグラフは、いずれも接続数とスループットの関係を表しています。最初のグラフは、全接続がアクティブに通信した場合、あとのグラフは、全接続のうち小数のコネクションが順次アクティブになっていく、というモデルです。これらのグラフから、以下ようなことが読み取れます。 epoll も per-thread モデルも、良くスケールする epoll は、ワークセットが小さい場合に (最大50%) per-thread モデルよりも高速 少なくとも、1コネ

  • AsyncIOについて(その2) - 最速配信研究会(@yamaz)

    AsyncIOについて(その1)の続き. NONBlockでIO処理をする方法としてselectとシグナルを使う方法があるというのが前回の話だったが, selectはselectよりkqueue,epollで述べたとおり, ビジーループがかかるためあまり効率はよくなく,シグナル方式は制約があるためあまり使い勝手がよくない. というわけで新しく出てきたのがPOSIX Asynchronous I/O(AIO)という機構だ. これはIOのwaitをイベントドリブン形式にしてビジーループをなくそうというものだ. プログラムの流れとしては下記のようになる. 1. 対象となるファイルディスクリプタにシグナルハンドラもしくはイベントハンドラを登録しておく 2. aio_read/aio_writeを呼び出すと制御はすぐにユーザに戻る. 3.対象のファイルディスクリプタの処理が終わると登録されていたハン

    AsyncIOについて(その2) - 最速配信研究会(@yamaz)
  • mixi Engineers’ Blog » Linux Programming、epollの話

    お久しぶりです、初めての日の夏に圧倒されているトールマエサカです。 今日はLinuxにおけるネットワークプログラミング関連のネタです。分散データベースサーバの開発過程で最近よくLinuxのepollというイベントハンドリング機能を使っています。これがまた優秀な機能なので紹介します。 このContextでいうイベントハンドラーはサーバがクライエントのリクエストを処理するためのメカニズムです。イベントの感知と通知は大雑把にいうと以下の三つの処理で構成されています: 一つもしくは複数のディスクリプタを監視 ディスクリプタの準備が整うまでハチ公のごとくひたすら待ち続ける 準備が整ったディスクリプタの通知 アプリケーションでの実装は一昔までselect(2)、もしくはpoll(2)というシステムコールで行われていました。二つとも役目は同じですがselect(2)の場合、kernelをいじらない限り

    mixi Engineers’ Blog » Linux Programming、epollの話
  • 非同期I/O Linux

    非同期I/O 概説 Introduction to Asynchronous I/O AIO, I/O Multiplexing… 2007年8月6日 KLab 株式会社 Kラボラトリー 廣瀬 正明 Copyright © KLab Inc. All rights reserved. 今日の目的 非同期I/Oとは何かを知る 非同期I/Oを使うと何がうれしいのかを知る 非同期I/Oを実現する手段(複数)を知る Copyright © KLab Inc. All rights reserved. アジェンダ 非同期I/Oを使う理由 非同期I/Oとは? AIOの実装を紹介 AIOの使い方 落穂ひろい Copyright © KLab Inc. All rights reserved. アジェンダ 非同期I/Oを使う理由 非同期I/Oとは? AIOの実装を紹介 AIOの使い方 落穂ひろ

  • マルチコア時代の高速サーバーの実装 - Blog by Sadayuki Furuhashi

    特にサーバー用途では、CPUがシングルコアに戻ってくることは考えにくい。 マルチコアCPUの性能を活かすにはマルチスレッドに対応したサーバーの実装が必要になるわけですが、マルチスレッドなプログラミングは往々にして「高負荷になると固まる」とか「たまに落ちる」といった悩ましいバグと戦わなければならず、イヤです。 かといってシングルスレッドでは、近い将来 32コアCPU! などが出てきたとき、たぶん性能を発揮できません。 そこで、そこそこデバッグしやすく、それでいて多コアCPUでもスケールするという落としどころを模索しているのですが、ボトルネックはネットワークIO周りにあるだろう*1という前提の元で、ネットワークIO部分だけをマルチスレッドで動かし、それ以外の部分をシングルスレッドで動かすというアーキテクチャを考えています。 ロジックの部分はマルチスレッドで書いても共有リソースにアクセスする度に

    マルチコア時代の高速サーバーの実装 - Blog by Sadayuki Furuhashi
  • なぜ Forkwell はリリース初日にサーバダウンを繰り返したのか - 表参道フォークウヱル別館

    こんにちは。Forkwell の中の人、大岡(おおか)です。 日は、お恥ずかしながら Forkwell リリース初日の失態について、詳細をお話しようと思います。 当初からのユーザーの方はご存知かもしれませんが、先週4月3日(火)に Forkwell がリリースされた際、殺到するアクセスの負荷に耐え切れず、深夜までサーバダウンを繰り返しました。なぜそんなことになったのか。 端的に言えば、ロクに負荷テストを行ってなかったからというのが真相という間抜けなオチなのですが。 初めての慣れないディレクター業務で連日サービスリリースのことで頭が一杯になっていた大岡は、負荷テストのことがすっぽり頭から抜けていました。 私も過去、Apache Bench や JMeter で負荷テストを行った経験はもちろん何度もあったのですが、今回はウソのようにきれいさっぱり忘れてしまっていました。 ディレクター業務に加

  • プロジェクトやチームにおいて自由な中にも秩序が必要(スケジューラやI/Oのアーキテクチャで例えてみた)

    人間とウェブの未来(旧) 「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。2014年までの人間とウェブの未来の旧ブログです。 この話は、学生時代や入社当初は全然気づかなくて、会社でプロジェクトを管理したりチームで何かを取り組んだりしていく上で思うようになったことです。 規約や役割を厳しく設けるのは良くないが・・・(ブロッキングな同期I/O) 何かを成し遂げるためには、規約や役割を厳しく設けてしまうと、効率良く物事が進まなくなったりします。これは、I/Oのアーキテクチャに例えると、きちんとブロッキングをして同期しながらI/Oを完了させるようなやり方です。一人のエンジニアが単一のタスクをブロッキングして作業するので、やった所までの成果(ドキュメントやコード)はきちんとでますが、タスクの量が増えたりすると(アクセス集中)、一気にタスクが溜まって作業速度が遅くなってしましま

    プロジェクトやチームにおいて自由な中にも秩序が必要(スケジューラやI/Oのアーキテクチャで例えてみた)
  • 37歳で大学生になりました - Gosuke Miyashita

    この4月に、帝京大学理工学部情報科学科 通信教育課程の第2学年に編入学しました。通信教育課程なんで、仕事は続けたままです。 今日は、なぜこの歳(37歳)で大学に入ろうと思ったのかについて書いてみようと思います。 自分の現在の立ち位置は、ソフトウェアエンジニアだと思っているんですが、出身は経済学部経営学科です。それが悪いとは思ってないですし、そういう人は身近にたくさんいるんですが、情報工学や計算機科学なんかの学位を持ってない、といったことに、ほんの微か、あるかないかぐらいの、引け目なんだかコンプレックスだかなんだかわからないけど、そんなようなものをずっと持ち続けています。 それはあまり意味のないことで、別にそんな感情持つ必要ないじゃん、と思いつつも、ずっとひっかかりはあって、この感情ってこの先ずっと残るのかな、とか思ってたわけですが、だったら学位取っちゃえば、そんなつまらないこと考えずに済む

    matsumoto_r
    matsumoto_r 2012/04/14
    自分も博士の学位を目指しているけれど、それは「足の裏についた米粒を取るようなもの」と言われたりする。研究や技術を学ぶ事が好きという動機がやっぱり大事ですね。