2017-09-05 70 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

[ 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_readable過程上下文mysqld?爲什麼在進程上下文中調用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域套接字不需要中斷,因爲所有數據傳輸都在一個進程和另一個進程之間。

當進程A在連接的(unix)套接字上發送消息時,調用sock_def_readable(通過sk->sk_data_ready)來確定是否有接收進程正在等待套接字上的數據。該調用將在發件人的流程環境中進行。

相關問題