我在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
?
如果重要,我正在使用:
答案 0 :(得分:1)
sock_def_readable
提供操作的“默认”版本“唤醒等待在此套接字上接收的任何进程”。通常,对于TCP连接,该操作在中断上下文中执行,因为从网络设备驱动程序的接收中断接收到新消息。
mysqld
最有可能从Unix域套接字发送/接收。 Unix域套接字不需要中断,因为所有数据传输都在一个进程和另一个进程之间。
当进程A在连接的(unix)套接字上发送消息时,将调用sock_def_readable
(通过sk->sk_data_ready
)以确定是否有接收进程在等待套接字上的数据。该调用将在发件人的流程上下文中进行。