为什么在进程上下文中调用sock_def_readable?

时间:2017-09-05 15:00:01

标签: linux-kernel interrupt-handling

我在StartNewTimer中添加了以下行:

sock_def_readable

看到它的输出感到惊讶。这是我在运行 lighttpd 的虚拟机中获得的:

printk("TT: %s\tcontext=%c\tpid=%d\tcomm=%s\n",
       __FUNCTION__,
       in_interrupt() ? 'i' : 'p',
       current->pid,
       current->comm);
正如预期的那样,总是在中断上下文中调用

[ 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 。 Apache httpd也发生了同样的事情。但是,如果我运行 mysqld

sock_def_readable

问题:为什么在[ 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

如果重要,我正在使用:

  • Linux内核4.8-rc2
  • Lighttpd 1.4.34
  • Apache 2.4.10(mod_prefork)+ PHP 5.6
  • MySQL 5.5

1 个答案:

答案 0 :(得分:1)

sock_def_readable提供操作的“默认”版本“唤醒等待在此套接字上接收的任何进程”。通常,对于TCP连接,该操作在中断上下文中执行,因为从网络设备驱动程序的接收中断接收到新消息。

mysqld最有可能从Unix域套接字发送/接收。 Unix域套接字不需要中断,因为所有数据传输都在一个进程和另一个进程之间。

当进程A在连接的(unix)套接字上发送消息时,将调用sock_def_readable(通过sk->sk_data_ready)以确定是否有接收进程在等待套接字上的数据。该调用将在发件人的流程上下文中进行。