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

サーバー実装いろいろ

on

  • 1,481 views

 

Statistics

Views

Total Views
1,481
Views on SlideShare
1,480
Embed Views
1

Actions

Likes
0
Downloads
1
Comments
0

1 Embed 1

http://s.deeeki.com 1

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    サーバー実装いろいろ サーバー実装いろいろ Presentation Transcript

    • サーバー実装いろいろ その1 反復サーバー (iterative server) 並行サーバー (concurrent server)  ・ Fork server  ・ PreFork server
    • クライアント サーバー リクエスト レスポンス
    • 粒度を細かくすると下記のように (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
    •  
    • 反復サーバ (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 でブロックするので複数接続あった場合、 最初の接続がリクエストをもたつくと後の接続が待たされる ことになる
    • 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 サーバー サーバー サーバー サーバー 親 子
    • 余談: pipe(READ, WRITE) 関数 IPC 通信の基礎。親プロセス子プロセスの間で 対話できるようになる。 fork しないとできないわけではなく、より身近な例としてまさしく パイプコマンドがある。「 ls | wc 」 fork READ WRITE 親 親 子 子 READ WRITE READ WRITE READ WRITE READ WRITE READ WRITE
    • 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
    • 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 }
    • 課題
      • Starman
      • Starlet
      • Catalyst::Engine::HTTP
      • HTTP::Server::PSGI
      • Hoppy(?)
      • socket オプション等をもっと掘り下げる
      • non-blocking についてkwsk
    • 参考書籍