- 1 名前:デフォルトの名無しさん mailto:sage [2010/12/25(土) 22:46:56 ]
- 主にソケットに関しての質疑応答スレッドです。
Programming UNIX Socket FAQ (日本語訳) www.kt.rim.or.jp/~ksk/sock-faq/indexj.html Winsock Programmer's FAQ (日本語訳) www.kt.rim.or.jp/~ksk/wskfaq-ja/ 関連リンクは>>2-10辺り 足りなかったら適当に付け足してね 前スレ ネットワークプログラミング相談室 Port26 hibari.2ch.net/test/read.cgi/tech/1269343909/ 関連スレ ネットワークプログラミング雑談 hibari.2ch.net/test/read.cgi/tech/1235800707/ Java ネットワークプログラミング 【教えて!】 hibari.2ch.net/test/read.cgi/tech/1086238859/
- 830 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 22:33:39.26 ]
- >>828 RFC standard tracking 自体が TDD だと思うんだが
- 831 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 23:18:30.00 ]
- 思うんだが…と書かれても
- 832 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 10:15:03.37 ]
- >>830
思ってるだけじゃダメだろ! その思いをもっと表現しろよ!
- 833 名前:デフォルトの名無しさん mailto:sage [2012/03/17(土) 11:50:48.54 ]
- マルチキャストについて教えてくれろ
239.255.255.6と受信設定した場合、239.255.255.6宛のマルチキャストのみ届くの? それとも、239.255.255.2、4、6宛のマルチキャストがすべて届くの?
- 834 名前:デフォルトの名無しさん mailto:sage [2012/03/17(土) 19:15:14.69 ]
- 受けるほうがマルチキャストに対応してないといけないんとちゃう
- 835 名前:デフォルトの名無しさん mailto:sage [2012/03/17(土) 19:45:17.56 ]
- >>833
joinしていれば239.255.255.6宛のマルチキャストのみ届く。
- 836 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 21:16:48.59 ]
- >>833
2と4はどこから出てきたのだ?
- 837 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 21:32:29.05 ]
- >>836
6からだろ
- 838 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 21:51:13.47 ]
- 192.168.0.255/24のブロードキャストアドレス場合、
192.168.0.255 & 192.168.0.X == 192.168.0.X が成立すればブロードキャスト範囲に含まれる!とかそういう発想でもあったのであろうか?
- 839 名前:デフォルトの名無しさん mailto:sega [2012/03/21(水) 16:26:23.89 ]
- 正式に名前解決が出来ないことが保障されているドメイン
ってなんだっけか。 なんかあったよね?
- 840 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 16:56:29.82 ]
- example ?
- 841 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 19:56:16.01 ]
- example.comは解決できます。到達も可能です。
- 842 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 21:19:42.75 ]
- まあいいや
chinko.unko とかぜったい解決できないだろ
- 843 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 01:00:35.06 ]
- ttp://suika.fam.cx/rfc/ja-translations/rfc2606-ja.html
は解決とは別問題だったような
- 844 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/29(木) 01:45:01.22 ]
- アッー!
- 845 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 02:54:25.17 ]
- AIJ社長の詐欺罪を必ず立証する!
官僚が他人の金を盗んでしゃーしゃーと「年収7千万は問題ない」 などと国会答弁するんだから人権以前の問題だな 完全にトチ狂ってるw
- 846 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 14:35:50.61 ]
- いかにうまく国民から巻き上げるかしか考えてないぞあいつら
- 847 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 09:51:35.77 ]
- UDPは以下の認識で合ってますか?
・送ったものが届かないかもしれない ・送った順番で届かないかもしれない ・受信されたものは受信側のPC内部で化けない限り正しい ・送られたパケットが重複して受信される事はない
- 848 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 11:30:11.36 ]
- 3. ヘッダのチェックサムを信じる限りは。
それじゃ信頼性低いという用途であれば、 自分で信頼性を確保しましょう。 4. 重複します。
- 849 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 12:08:40.85 ]
- >>848
UDPってエラーパケットは闇に葬る仕様だと認識してますけど どういう仕組みで重複するのでしょう?
- 850 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/01(日) 12:41:15.32 ]
- MAC層が誤認で再送することがある
- 851 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 12:53:26.45 ]
- >>850
ありがとう! Ethernetが大きなお世話をすることがあるのか。
- 852 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 13:02:36.98 ]
- あ、Ethernetのコリジョンチェックの誤認識で再送される場合があるってことか。
- 853 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 13:11:55.42 ]
- ・受信されたものは中継側で化けたりしてると受信側のPC内部で化けてる
- 854 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 13:19:05.09 ]
- >>853
え? CRC合わなくなるんで破棄されて届かないんでは?
- 855 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 14:20:22.56 ]
- 256分の1の確率でCRC合うんじゃないの?
- 856 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 14:53:31.15 ]
- CRCって16bitじゃないの?
- 857 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 15:24:49.90 ]
- Ethernetで使われるのは32bitのCRC
IPで使われるのが16bitのチェックサム
- 858 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 15:50:29.94 ]
- まあ細かいことはいいっこなしで
- 859 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 16:12:33.00 ]
- いや、細かいことも理解していないと
たまたま運がよくて動いているプログラムが出来上がる。
- 860 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 22:03:51.68 ]
- 信頼性あるもの使えよ
- 861 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 15:06:50.87 ]
- >>849
IPやUDPの設計の基本は、 「(ルータ等が)こういう仕組みで〜してしまうことがあるから」ということじゃなくて、 ピアトゥピアのパケット転送で保証できないことは何も保証しないということ。 つまり中間がどんな馬鹿な経路であっても、(ただし邪悪"mal-functional"な経路は仮定しない) 端末と端末だけでできることのみ保証する。 これにより経路設計に自由度を与えている。その代わりにTCP層その他で頑張ってる。 この設計はEthernetから大きな影響を受けてる。 残念だけどこうなってしまったねということじゃなくて、 雑多なネットワークを様々な種類の経路で接続するための中間(inter-)ネットワークとして開発され、 自由度を最大限に発揮するために、理屈詰めで設計されている。 消極的ボトムアップ設計ではなくて、色々と概念整理した後の積極的トップダウン設計です。
- 862 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 02:35:02.37 ]
- ハード屋だけどもバーストエラーあるから
ビット数から受ける印象よりも頻度高い。
- 863 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 10:44:17.22 ]
- バースト読んでまだ入るからな
- 864 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/04(水) 11:33:05.82 ]
- ネットワークやるときはな、ガチでやるならな
相手が何をしてきても平気なように作れ 自分の家から出たらみんな敵
- 865 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 11:54:08.92 ]
- >>864
RFC793にもそう書かれているな
- 866 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/04(水) 12:19:26.44 ]
- apacheのヘッダーが長すぎるとメモリバカ食いして落ちるみたいなバグあったじゃん
あんなの最初作ったときに想定しろっつーの
- 867 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 16:44:02.72 ]
- サーバ側の一番単純な記述例=テンプレート、スケルトン等があるURLをお願いします。
単に固定応答でかまいません。 ですがシングルタスクタイプはNG 検索したのは複雑のばかりでした。
- 868 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/05(木) 16:45:16.64 ]
- >>867
toro.2ch.net/test/read.cgi/tech/1215352849/
- 869 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 18:48:29.91 ]
- >>867
有名なところ www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/
- 870 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 12:50:47.92 ]
- ソケット通信によるサーバプログラムを書いている初心者です。
ノンブロッキングで複数のクライアントを待ち受けるとき select()を使うのとスレッドを使用するのはどちらがいいのでしょうか? 速度とか安全性とかそういう面も教えて頂きたいです。
- 871 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 13:53:06.93 ]
- OSは?
- 872 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 13:53:53.99 ]
- 処理そのものはマルチスレッドにしなくていいんだろうか
- 873 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 15:24:12.81 ]
- >>870
そんなん状況によるとしか言いようが無いだろ なので、メインロジックはどっちの方法でも動くように書いとく
- 874 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 18:19:02.52 ]
- >>870
aioも検討対象にしようぜ。 まあOSと言語によるが。
- 875 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 20:30:15.81 ]
- >>870
スレッドが良くわかっているとすると CPUコア数と同じスレッドとSelect()の組み合わせ
- 876 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 09:38:18.67 ]
- 謎なぞ?
複数クライアント同時処理したいとして、俺なら select方式にするならシングルスレでブロッキングでやるし マルチスレ方式にするならなおのことブロッキングでやるから 何言ってんのか分からん unix 系とwindows では公式リファレンスが「非同期」と呼んでるものがズレてるからos分からんと混乱するし 作る気あるなら手動かしてから○○が上手く行かないと 聞くはずだし 覚えたての単語で書き込みたかっただけか?
- 877 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:02:03.67 ]
- >>876
ソケットそのものはノンブロックにするのが基本だろ? なに言ってんだ?
- 878 名前:デフォルトの名無しさん [2012/04/14(土) 13:21:21.88 ]
- 1ソケット1スレッドならブロッキングで良いだろ。
- 879 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:40:34.41 ]
- ブロッキングにしたらブロックしちゃうだろ
何考えてるんだ
- 880 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:23:22.21 ]
- >>879
ブロックしちゃってもまずくなければブロックのままで良いのでは?
- 881 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:35:04.00 ]
- >>879
メインのスレッドが「accept()→別スレッドにブン投げ」くらいしか やることがないなら、ブロッキングで充分じゃないか。 (クライアント数が少ない場合)
- 882 名前: ◆QZaw55cn4c mailto:sage [2012/04/14(土) 21:47:15.74 ]
- >>881
ブロッキングだと自分の側からスレッドを終了できないのがつらいところ(通信相手から QIET みたいなのを送ってもらう、とか取り決めておかないといけない)。
- 883 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 22:08:04.59 ]
- >>876
例えばCPUが4コアなら4つのスレッドを立ち上げて それぞれのスレッドでSelect()処理を行わせて多重化する。
- 884 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 22:44:38.84 ]
- workerスレッド方式でやる場合、各workerがselect()するやり方って一般的だっけ?
そのとき、select()で監視するソケットは各workerに振り分けるんだろうか?それとも共通なんだろうか?
- 885 名前: ◆QZaw55cn4c mailto:sage [2012/04/14(土) 23:05:54.21 ]
- >>884
常識的に考えて select() はひとつ、read() した結果をみてから各スレッドにわけるんじゃないかい?
- 886 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:20:23.15 ]
- 俺はselect()はひとつで、そこで起きたソケットをworkerへ渡してそっちでread/write
するのが普通かと思っていたが。 >>883も>>885もやり方違うんだな。
- 887 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:28:07.94 ]
- listen(), Accept()がひとつでAccept()で起きたソケットをworkerに振り分けて
select()で処理すりゃ良いんじゃない。
- 888 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:33:52.94 ]
- いや、それだと1socket=1threadになるんじゃないか?
- 889 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:38:16.28 ]
- >>888
select()って複数ソケット守りできるんでは
- 890 名前: ◆QZaw55cn4c mailto:sage [2012/04/14(土) 23:46:01.90 ]
- >>888
サーバー側なら確かに 1 クライアント 1 スレッドになりますね。 hibari.2ch.net/test/read.cgi/tech/1295273862/27 codepad.org/wDEPkAtB
- 891 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:48:56.38 ]
- >>890
nクライアントmスレッドに出来るだろ・・・
- 892 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:49:10.41 ]
- >>889
そこで、1threadが複数のsocketを処理するworker方式で>>883はどうやってるんだろう というのが元の質問だったんだが。 新しくaccept()されたソケットを各workerのどれかに振り分けるとした場合、 ・1つのworkerが担当するソケットが複数読み書き可能になった場合、他のスレッドが遊んでいても 直列的にしか処理できない ・そもそも割り振られたworkerがselect()で待ち受け中の場合、新しいソケットを待ち受けることができない という問題がありそうに思えるけど。
- 893 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 00:53:55.45 ]
- >>892
パイプで渡すから問題ない
- 894 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 00:54:46.29 ]
- >>892
割り振ったworkerが偏っちゃった場合は諦める
- 895 名前:デフォルトの名無しさん [2012/04/15(日) 00:55:26.36 ]
- レイテンシのことでしょ
- 896 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 07:06:24.33 ]
- >>894
なのにそれでもworkerスレッド内でselect()したいという理由がわからないんだが。 他になにかメリットがあるんだろうか? それとやはり、そのやり方だと全スレッドがselect()でブロックされたまま新しいソケットを 処理できなくなることがあるように思うんだが。
- 897 名前:デフォルトの名無しさん [2012/04/15(日) 07:35:59.32 ]
- コルーチンで実装したことある
コルーチンの切り替え判断をC++のストリームに内臓させちゃって 結構使いやすいんだ
- 898 名前:デフォルトの名無しさん [2012/04/15(日) 07:42:15.64 ]
- でもなんだっけ、linuxでファイルをそのまま送るやつ。lighttpdの売り
カーネル内でなんかやってメモリコピーが減りましたってやつ 思い出したsendfileだ
- 899 名前:デフォルトの名無しさん [2012/04/15(日) 07:48:03.60 ]
- みみっちいよな。メモリアクセスがオーバーヘッドになることなんて
俺なんてサーバー作ったとき書きやすさのためにバッファ何層も重ねたぞ chunk用のストリーム、・・・用のストリームって
- 900 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 09:41:08.09 ]
- sendfileが軽減したのは、
単なるメモリアクセスじゃなくて、 カーネル/ユーザ空間間のコピーだよ。
- 901 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 09:49:33.87 ]
- >>896
リスナーのソケットをSelect()に入れればAccept()拾えるんでは?
- 902 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 09:56:02.40 ]
- そもそも、select()を使う場合は
recv()〜何かの処理〜send() が 短時間で終わらないと破綻する。
- 903 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:03:01.10 ]
- どれかひとつのスレッドでリスナーを待ち受ける場合、他のworkerに
処理を渡せない場合があることは変わらない。 それとも、全部のスレッドで同じリスナーソケットをselect()する?
- 904 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:05:51.25 ]
- >>902
そこでノンブロッキングI/Oですよ。
- 905 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:11:33.93 ]
- >>904
複数ソケットでそれを行うとselect()の再発明になる。
- 906 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:22:27.31 ]
- >>905
select()のかわりにノンブロッキングI/Oを使えと言っているわけじゃないよ? select()でトリガを受けて、read/writeをノンブロッキングでやるのが最近の流行。
- 907 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:45:26.33 ]
- >>903
今更何をw
- 908 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:08:40.66 ]
- >>907
今更と言うか、結局、>>883のように各workerスレッドでselect()するという場合 どのスレッドでどのソケットを監視することになるのか、これだけ質問しても よくわからなかったんだ。 今更というくらい明らかなことだったらちょっと教えてくれないか?
- 909 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:29:24.83 ]
- >>906
select()でトリガ拾うとrecv()/send()はブロックされないのでは?
- 910 名前: ◆QZaw55cn4c mailto:sage [2012/04/15(日) 11:41:59.98 ]
- >>906
>最近の流行 最近じゃない。初心者本 www.amazon.co.jp/dp/4874085032/ ですら昔からだ。
- 911 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:47:43.93 ]
- ソケット廻りって結構古いもんを引きずってるからね。
- 912 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 12:05:55.34 ]
- >>909
待ってれば読めるだろうけど多少なりともブロックされることはあるらしい。
- 913 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 12:54:56.19 ]
- >>912
WSAEWOULDBLOCK をスルーすれば良いのんか。
- 914 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 13:36:07.17 ]
- >>910
入門本に書いてあることが流行だと言ってる?
- 915 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 13:51:27.59 ]
- >>908
1スレッド100本くらいで100スレッドくらい これならそんなに無理なく1万本管理できる
- 916 名前:デフォルトの名無しさん [2012/04/15(日) 13:53:58.20 ]
- 1万コネクションサポートするのに1万スレッド作ったら問題あるのだろうか?
OSにもよるだろうけど。。。
- 917 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:03:06.10 ]
- 32bitOSじゃ無理。64bitならもしかしたら大丈夫かも。
- 918 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:09:25.25 ]
- >>916
無理がある気がするな。 Apacheなんかどういう実装になってるのだろう?
- 919 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:20:28.63 ]
- >>915
いや、そういう問題じゃなくて。 その100本のスレッドのうちリスナーを監視するのが1本なのか全部なのか? もしリスナーをselect()しないスレッドがあるとした場合、そいつらがselect()で ブロックしてしまう問題をどうするのか?ってことなんだが。 もちろん、100本もスレッドを用意したのに状況によって1本しか走れない ということも考えられるし。
- 920 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:23:15.17 ]
- >>919
そのselect()とやらが何をブロックするのだ?
- 921 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:39:07.53 ]
- >>917,918
そうですね。当然でした。 調べてみると、例えばWindowsのCreateThreadで作れるのは 最大で1プロセス2028スレッドとありました。
- 922 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:45:56.01 ]
- 当然そのスレッドを、だが。
もしかして、timeout=0でブン回すという使い方なのかな?これ。
- 923 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:51:37.06 ]
- >>922
そのスレッドでアイドリング処理をしないのならブロックしても問題なかろう。 recv(),send(),accept()の処理以外で何をするのだ?
- 924 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 15:05:42.39 ]
- いや問題あるだろ。
1スレッドが100ソケット受け持ったとして、そこで複数のソケットが読み書き可能に なったとしても他のスレッドは何もできないんだから。
- 925 名前: ◆QZaw55cn4c mailto:sage [2012/04/15(日) 16:52:43.69 ]
- >>914
入門書であること力点をおいているのではなく、1990年代の書籍であることに力点をおいています。 1990年代にしめされている手法が「最近はやっている」とは考えにくいでしょう、普通。 関係ありませんが、この本、ネットワークバイトオーダーに問題はあるものの、 fj でも一定の評価がついていましたね。
- 926 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:04:19.36 ]
- いやー、昔から使えたということと流行は関係ないでしょ。
一昔前ならわざわざ面倒なノンブロッキングI/Oを使うよりも 上の人のようにスレッド+ブロッキングI/Oの方が人気があった ような気がする。さらに前だとfork()が主流だったよねぇ。
- 927 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:27:54.74 ]
- 1992年でfjってのも微妙な話だなw
- 928 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:33:40.53 ]
- C10Kみたいなことが言われて、selectやpollの性能向上が始まったのが、
1990年代後半からだよ。本格的には2000年代入ってから。 マルチスレッド+ブロックI/Oやforkによる実装も普通に行われていた。 非同期I/Oの優位性は80年代から言われていたけど、(X11のプロトコルがそうだし) 低レベルAPIとして登場したのはその後だね。
- 929 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:19:03.11 ]
- >>924
そうならないように分配すればいい その上でどうしてもそうなったらあきらめればよろしい
- 930 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:20:01.53 ]
- >>919
リスナーは1本で。 各ワーカーにはパイプで適当にソケットを送りつければ良い。
- 931 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:26:49.72 ]
- select使うのにlistener必要?
分配にポリシーを実装する必要なければ、複数のworkerが直接同時にselectすればいい。
- 932 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:34:20.91 ]
- >>931
だれも待ち受けしなかったらサーバにならなくね?
- 933 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:38:39.05 ]
- >>924
>>902
- 934 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:40:52.10 ]
- スレッド1万あるよりはマシ
- 935 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:46:01.12 ]
- >>928
Winsock FAQ www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/io-strategies.html には 「経験則3: select()は避ける」 とあるけど これの元ネタの英文はかなり古いものなのかな。
- 936 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:47:38.09 ]
- WIndowsのselectは性能悪かったしね。たぶん今もそうだけど。
- 937 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:49:17.95 ]
- >>935
winならそれでいいんじゃね? unixlinuxには選択肢ないからな
- 938 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:50:29.14 ]
- >>930
なるほど、やりかたはわかった。ただ、わざわざそうすることのメリットがよくわからないな。 activeなソケットの偏りで効率が落ちる問題は残るし、特にプログラミングが簡単になるようにも 思えないし。 >>929 「そうならないように」って、無理だろそりゃ。どのソケットがactiveになるか事前に判断できる わけがないし。
- 939 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:51:19.09 ]
- >>936-937
スレッド嫌いなのでselect()で実装してやったけど なんの問題もなくサクサク動いたよw Winsock FAQってWindows 9x の時代のものじゃないのかな。
- 940 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:51:57.12 ]
- UNIXだとfdが多くなったらselectより、poll, epoll, /dev/poll, kqueueでしょ。
意外にもfd maskのbit演算がボトルネック!
- 941 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:53:25.28 ]
- >>938
C10Kのようなのだとスレッドのオーバーヘッドのが大きくなるから。 クライアント数が少ないのならスレッド実装のが楽
- 942 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:53:27.29 ]
- 95系のselectは性能どころか仕様にも問題あった。
詳しくは古いwinsockのドキュメント読んでくれ。
- 943 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:56:10.86 ]
- >>931
こっちは同時select()か。全スレッド同時に起きるけど、mutexを奪った1スレッドだけが 処理するという形になるわけかな。
- 944 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:00:20.71 ]
- >>943
それではスレッドにする意味がないような。
- 945 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:06:57.74 ]
- >>943
違うよ。 同時selectしているスレッドの一つだけが起きる。 どれが起きるかはスケジューラ任せ。 自分で選びたいならlistener/schedulerを作らないと仕方ない。 read等も同様の仕様。ほとんどのUNIXが。
- 946 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:50:18.53 ]
- >>945
そうだっけ?それだとレベルトリガじゃないような気もするが、正直1つのソケットを複数のスレッドで 同時にselect()するなんてやったことなかったから勘違いしていたかもしれん。 であれば、どのスレッドにどのソケットを監視させるかという割り振りも必要なかったといことか。
- 947 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 22:03:10.33 ]
- forkするマルチプロセスサーバが一つのsocketで全員acceptしてますよ。
じゃないと同じポート番号にならないし。 もちろん起きるのは一つのプロセスだけ。
- 948 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 22:53:17.93 ]
- >>947
Unix 系はいいんだが, WinSock ってそのへんどうなってんの? # 明日から Windows でネットワークプログラムするはめになってしまった orz
- 949 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:07:41.22 ]
- >>938
1万スレッド起こせるならその方が楽だけどね 普通は無理っしょ
- 950 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:09:42.76 ]
- >>938
事前に判断なんて無理なので、無理しないで淡々と振り分ける。 偏ったらあきらめるか、ソケットを余力がある他のスレッドに投げる。
- 951 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:11:13.18 ]
- Winsockの場合は、対象となるWinsockのバージョンのドキュメントをしっかり読んでください。
特にXPでは〜、Vistaでは〜、7では〜との注意書きは必ず読みましょう。 読まない人はプログラム書くなと言いたくなるくらい細かい違いが多い。
- 952 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:11:39.79 ]
- >>940
今はそこはどうでもいい
- 953 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:18:52.51 ]
- >>945
これ本当?どこかにリファレンスがあるなら教えて欲しいな。 例えば、ソケットがread readyになって起こされたスレッドがreadしなかった 場合とかどうなるの?
- 954 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:25:42.66 ]
- 別に何も起こりませんが?
- 955 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:35:15.90 ]
- >>954
「何もない」があるのよ! epollとかでエッジトリガとかだと何もしないがゆえに 問題になることはあるかも
- 956 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:44:57.62 ]
- >>954
理解できないです。 select/pollはレベルトリガですよね? 起こされたスレッドがreadしないでsleepしたら同じsocketでselectしている 別のスレッドが起きない?
- 957 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:45:51.97 ]
- >>956
それでいいだろ Aのスレッドでなにも怒らないからBのスレッドで怒り爆発だろ
|

|