2017-09-05 118 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)来确定是否有接收进程正在等待套接字上的数据。该调用将在发件人的流程环境中进行。

相关问题