2017-09-05 1 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); 

그리고 출력을 볼 수 놀람이었다. 예상대로

[ 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는 항상 인터럽트 컨텍스트에서 호출한다 : 이것은 내가 VM이 lighttpd를에게을 실행에 들어갈 것입니다. Apache httpd에도 똑같은 문제가 있습니다.

[ 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 

질문 : 나는 mysqld를를 실행하는 경우, 왜 mysqld에 대한 프로세스 컨텍스트에서 sock_def_readable라고? 프로세스 컨텍스트에서 sock_def_readable을 호출하는 이유는 무엇입니까?

이 중요한 경우

, 내가 사용하고 있습니다 :

  • 리눅스 커널 4.8 RC2
  • 이 Lighttpd 1.4.34
  • 아파치 2.4.10 (mod_prefork) + PHP 5.6
  • MySQL의 5.5

답변

1

sock_def_readable은 "이 소켓에서 수신 대기중인 모든 프로세스 깨우기"작업의 (기본값) 버전을 제공합니다. 일반적으로 TCP 연결의 경우 네트워크 장치 드라이버의 수신 인터럽트에서 새 메시지를 수신했기 때문에 해당 작업은 인터럽트 컨텍스트에서 수행됩니다.

mysqld은 대부분 유닉스 도메인 소켓에서 송수신됩니다. 유닉스 도메인 소켓은 모든 데이터 전송이 하나의 프로세스와 다른 프로세스 사이에 있기 때문에 인터럽트가 필요하지 않습니다.

프로세스 A가 연결된 (유닉스) 소켓에서 메시지를 보내면 소켓에 데이터를 기다리는 수신 프로세스가 있는지 확인하기 위해 sock_def_readable이 호출됩니다 (sk->sk_data_ready 통해). 이 호출은 보낸 사람의 프로세스 컨텍스트에서 수행됩니다.

관련 문제