2017-09-05 11 views
0

は私がsock_def_readableに次の行を追加:sock_def_readableがプロセスコンテキストで呼び出されるのはなぜですか?

printk("TT: %s\tcontext=%c\tpid=%d\tcomm=%s\n", 
     __FUNCTION__, 
     in_interrupt() ? 'i' : 'p', 
     current->pid, 
     current->comm); 

し、その出力を参照するには驚きました。これは私がlighttpdの実行中のVMに取得されています。期待通り

[ 626.627938] TT: sock_def_readable context=i pid=0 comm=swapper/0 
[ 626.628682] TT: sock_def_readable context=i pid=0 comm=swapper/0 
[ 626.629410] TT: sock_def_readable context=i pid=0 comm=swapper/0 
[ 626.630730] TT: sock_def_readable context=i pid=3123 comm=lighttpd 

sock_def_readableは常に、割り込みコンテキストで呼ばれています。 Apache httpdにも同じ問題があります。しかし、私はのmysqld実行する場合:

[ 750.271819] TT: sock_def_readable context=p pid=3809 comm=mysqld 
[ 750.276922] TT: sock_def_readable context=p pid=3742 comm=mysqld 
[ 750.278017] TT: sock_def_readable context=p pid=4333 comm=mysqld 

を質問:なぜsock_def_readablemysqldするためのプロセスのコンテキストで呼ばれているのですか?なぜプロセスコンテキストでsock_def_readableが呼び出されるのでしょうか?

それが重要場合は、私が使用しています:

  • をLinuxカーネル4.8-rc2の
  • Lighttpdの1.4.34
  • はApache 2.4.10(mod_prefork)+ PHP 5.6
  • のMySQL 5.5

答えて

1

sock_def_readableは、 "このソケットで受信するのを待っているプロセスをすべて呼び起こす"という操作の(デフォルト)バージョンを提供します。通常、TCP接続の場合、ネットワークデバイスドライバの受信割り込みから新しいメッセージが受信されたため、その操作は割り込みコンテキストで実行されます。

mysqldは、おそらくUnixドメインソケットからの送受信です。 Unixドメインソケットは、すべてのデータ転送が1つのプロセスと別のプロセス間で行われるため、割り込みを必要としません。

プロセスAが接続された(unix)ソケットでメッセージを送信すると、ソケットにデータを待っている受信プロセスがあるかどうかを確認するためにが呼び出されます(sk->sk_data_ready経由)。その呼び出しは、送信者のプロセスコンテキストで行われます。

関連する問題