2012-06-26 2 views
0

네트워크에서 도착하는 요청에 대해 서비스 데몬 중 일부가 "소프트 실시간"으로 응답해야하는 데몬이 여러 개 있습니다 (하나의 게이트웨이와 여러 서비스가 모두 같은 노드에서 실행 됨). , 내 아치 같은 서비스 데몬 일부 프로토콜 태그를 기반으로 들어오는 패킷을 라우팅하는 게이트웨이 데몬 것 같습니다. 서비스 데몬은 요청을 처리하고 응답을 gw 데몬으로 다시 보냅니다. 모든 벌금과 일하지만 나는 "소프트 실시간"을 달성하지 못하고 지연을보고 있습니다.리눅스상의 프로세스간에 소켓을 공유합니다.

다음과 같은 방법으로 즉석에서 준비하고 게이트웨이와 서비스 데몬간에 네트워크 연결을 공유 할 계획입니다. 패킷이 연결에 도착하면 알림 대기열을 사용하지 않고 gw 데몬에게 전달합니다. 소켓 대기열의 패킷은 프로토콜 헤더를보고 "데이터가 도착했습니다"라는 해당 서비스 데몬에 "통지합니다"라는 알림을 받으면 서비스 데몬이 바이너리 세마포를 가져 와서 소켓 대기열에서 데이터를 대기열에서 제외합니다. 쓰기 용으로 세마포어 하나, 읽기 용으로 세마포어가 2 개 있습니다. 서비스 데몬이 데이터를 보내야 할 때 쓰는 세마포어를 가져 와서 데이터를 보냅니다. 게이트 웨이 데몬으로부터 "데이터 도착"알림을 수신하면 읽기 세마포어를 가져 와서 소켓에서 데이터를 큐에서 삭제합니다. 새로운 연결 요청마다 게이트웨이 데몬은 "sendmsg"를 사용하여 서비스 데몬에 연결을 보냅니다.

본문을 언제든지 시도 했습니까? 이 접근 방식에 문제가있는 것을 보시겠습니까? pls 코멘트/조언.

+0

는 게이트웨이와 서비스 데몬 사이의 복사 오버 헤드가 문제를 일으키는 것을 설립 :

은 의사에서 게이트웨이는이 무엇입니까? 그렇지 않다면 무엇이 도움이 될 것이라고 생각합니까? –

+0

현재 어떤 IPC를 사용하고 있습니까? 게이트웨이 연결의/아웃에서 엄격한 FIFO 순서로 처리해야합니까? – Duck

+0

#Provost, 전체 아이디어는 데이터가 gw 데몬에서 서비스 데몬으로 이동할 때 사용자 공간과 커널 공간 사이의 데이터 복사본을 피하는 것입니다. 나는 이것이 많은 기사가 그것에 대해 말했고 많은 프로그램이 이것을 피하려고 노력했다고 말하는 것은 불필요한 것 이상으로 중요하다고 생각합니다. 여전히 당신의 질문에 대답하기 위해 나는 아직 그것을 발견하지 못했습니다. –

답변

1

복사 오버 헤드를 피하려면 복수 데몬간에 소켓을 공유하려고 시도하는 것보다 splice을 사용해야합니다. 이 솔루션은 디버그하고 유지하기가 까다롭게 어려울 것입니다.

네트워크 프로토콜에 패킷을 라우팅 할 위치를 게이트웨이가 쉽게 알 수 있도록 헤더가 있고 그 다음에 서비스 데몬을 대상으로하는 페이로드가 있어야합니다.

while (data on socket) 
{ 
    header = read(socket, sizeof(header)); 

    service_socket = find_service(header); 
    splice(socket, NULL, service_socket, NULL, header->payload_length, 0); 
} 
+0

splice는 in/out fds의 성질에 몇 가지 제한이 있습니다. 그 중 하나는 파이프 (in 또는 out) 여야합니다. 특히 서비스 fd는이 경우 소켓이 될 수 없으며 게이트웨이와 서비스 데몬 간의 알림 및 소켓 공유를 위해 메시지 대기열을 사용하기로 결정한 많은 연구 끝에 메시지 경계 문제를 야기하는 파이프 여야합니다. gw 데몬은 메시지 대기열 채널의 새 데이터에 대한 서비스 데몬은 수신 메시지 대기열 통지 서비스 데몬에서 읽기 세마포어를 가져 와서 데이터를 대기열에서 빼냅니다. 이 방법에는 여전히 문제가 있습니다. –

+0

속임수. http://stackoverflow.com/questions/2677262/how-can-i-interconnect-two-sockets-in-linux에서 권장하는 작업을 수행하십시오. 파이프에 연결 한 다음 파이프에서 다른 소켓으로 연결하십시오. 그 fds를 주변에 전달하면 두통이 발생할 것입니다. –

+0

링크를 이용해 주셔서 감사합니다. –

관련 문제