Your SlideShare is downloading. ×
  • Like
サーバー実装いろいろ
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

サーバー実装いろいろ

  • 1,203 views
Published

 

Published in Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,203
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
3
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. サーバー実装いろいろ その1 反復サーバー (iterative server) 並行サーバー (concurrent server)  ・ Fork server  ・ PreFork server
  • 2. クライアント サーバー リクエスト レスポンス
  • 3. 粒度を細かくすると下記のように (HTTP サーバとブラウザを想定。つまり TCP) クライアント サーバー SYN SYN, ack ack データ(要求) データ(応答) , 要求の ack 応答の ack FIN ack FIN ack socket,bind,listen accept( ブロック ) accept から戻る read( ブロック ) connect write read( ブロック ) read から戻る サーバが要求を処理 write read( ブロック ) read から戻る close close
  • 4.  
  • 5. 反復サーバ (iterative server)
    • use strict;
    • use warnings;
    • use IO::Socket;
    • my $socket = IO::Socket::INET->new(
    • Listen => 20,
    • LocalPort => 12345
    • ) or die;
    • while ( my $con = $socket->accept ) {
    • my $line = <$con>;
    • print $con $line;
    • close $con;
    • }
    サーバー リクエスト 確立待ちコネクションキュー 確立済みコネクションキュー Listen キュー 3way hand shake 完了後 accept 問題点: リクエストの read でブロックするので複数接続あった場合、 最初の接続がリクエストをもたつくと後の接続が待たされる ことになる
  • 6. Fork サーバ (concurrent server)
    • use strict;
    • use warnings;
    • use IO::Socket;
    • my $socket = IO::Socket::INET->new(
    • Listen => 20,
    • LocalPort => 12345
    • ) or die;
    • while ( my $con = $socket->accept ) {
    • my $pid = fork;
    • if ( $pid == 0 ) {
    • ## child
    • close $socket;
    • my $line = <$con>;
    • print $con $line;
    • exit(0);
    • }
    • else {
    • ## parent
    • close $con;
    • }
    • }
    サーバー リクエスト 問題点: accept の度に fork するコスト accept サーバー accept fork サーバー サーバー サーバー サーバー 親 子
  • 7. 余談: pipe(READ, WRITE) 関数 IPC 通信の基礎。親プロセス子プロセスの間で 対話できるようになる。 fork しないとできないわけではなく、より身近な例としてまさしく パイプコマンドがある。「 ls | wc 」 fork READ WRITE 親 親 子 子 READ WRITE READ WRITE READ WRITE READ WRITE READ WRITE
  • 8. PreFork サーバ (concurrent server)
    • use strict;
    • use warnings;
    • use IO::Socket;
    • use POSIX 'WNOHANG';
    • my $socket = IO::Socket::INET->new(
    • Listen => 20,
    • LocalPort => 12345
    • ) or die;
    • for ( 1 .. 5 ) {
    • my $pid = fork;
    • if ( $pid == 0 ) {
    • ## child
    • while ( my $con = $socket->accept ) {
    • close $socket;
    • my $line = <$con>;
    • print $con $line;
    • close $con;
    • }
    • exit(0);
    • }
    • }
    • ## parent;
    • $SIG{CHLD} = sub {
    • while ( waitpid( -1, WNOHANG ) > 0 ) {
    • }
    • };
    • while (1) {
    • ## 子プロセスの数を調整するなど色々
    • }
    確立待ちコネクションキュー 確立済みコネクションキュー Listen キュー 子 子 子 accept accept accept
  • 9. Net::Server
    • lib
    • `-- Net
    • |-- Server
    • | |-- Daemonize.pm
    • | |-- Fork.pm
    • | |-- HTTP.pm
    • | |-- INET.pm
    • | |-- MultiType.pm
    • | |-- Multiplex.pm
    • | |-- PreFork.pm
    • | |-- PreForkSimple.pm
    • | |-- Proto
    • | | |-- SSL.pm
    • | | |-- SSLEAY.pm
    • | | |-- TCP.pm
    • | | |-- UDP.pm
    • | | `-- UNIX.pm
    • | |-- Proto.pm
    • | |-- SIG.pm
    • | `-- Single.pm
    • |-- Server.pm
    • `-- Server.pod
    sub run { ### pass package or object my $self = ref($_[0]) ? shift() : shift->new; $self->_initialize(@_ == 1 ? %{$_[0]} : @_); # configure all parameters $self->post_configure; # verification of passed parameters $self->post_configure_hook; # user customizable hook $self->pre_bind; # finalize ports to be bound $self->bind; # connect to port(s) # setup selection handle for multi port $self->post_bind_hook; # user customizable hook $self->post_bind; # allow for chrooting, # becoming a different user and group $self->pre_loop_hook; # user customizable hook $self->loop; # repeat accept/process cycle ### routines inside a standard $self->loop # $self->accept # wait for client connection # $self->run_client_connection # process client # $self->done # indicate if connection is done $self->server_close; # close the server and release the port # this will run pre_server_close_hook # close_children # post_child_cleanup_hook # shutdown_sockets # and either exit or run restart_close_hook }
  • 10. 課題
    • Starman
    • Starlet
    • Catalyst::Engine::HTTP
    • HTTP::Server::PSGI
    • Hoppy(?)
    • socket オプション等をもっと掘り下げる
    • non-blocking についてkwsk
  • 11. 参考書籍