2012-09-24 4 views
3

Corba 서버 측에 멀티 스레딩이 많이 있지만, 클라이언트 측에 대해 관심이 있습니다. ORB를 초기화하는 CORBA 싱글 톤 "manager"가있는 다중 스레드 클라이언트 (Solaris, Orbix 6.3)가 있습니다. 런타임 동안 'lsof'는 Corba 서버에 대한 하나의 TCP 연결 만 표시하므로 클라이언트 작업자 스레드에서 생성 된 모든 동기 호출을 직렬화해야합니다.멀티 스레드 코바 클라이언트

병렬 처리를 이용하려면이 배열을 변경하고 싶습니다. 각 스레드는 자체 연결을 관리해야합니다. 나는 각 작업자 스레드가 ORB_init() 등을 호출하는 싱글 톤 대신에 설정을 변경했습니다.

이제 완전히 당황합니다. 'lsof'는 이제 2 개의 TCP 연결을 나타내지 만 6 개의 작업자 스레드가 있습니다. 뭔가 잘못되었습니다. 작업자 스레드 수만큼의 TCP 연결을 예상했을 것입니다. 이 접근 방식이 순진한가? 예를 들어 스레드마다 ORB_init()를 호출하는 것이 합리적일까요?

이에 대한 의견이 필요합니다. 다중 스레드 클라이언트의 샘플 코드는 크게 도움이됩니다. Solaris에서 Orbix 6.3을 다시 사용합니다.

종류와 관련,

아드리안

+0

내가 한 일과 비슷한 것을 한 것을 알 수 있습니다. 여기 내 질문 - http://stackoverflow.com/questions/13009694/use-multiple-orbs-through-different-threads-multithreaded-multi-orb-client-appl. 아이디어가 있습니까? (귀하의 질문에 +1 - 인터넷은 멀티 스레드 CORBA 클라이언트에 대한 정보와 멀티 스레드 CORBA 서버에 대한 풍부한 정보) 미리 감사드립니다! –

답변

0

나는 Orbix 작동 방법을 정확히 알고 있지만, 일반적으로도 다중 스레드 설정에 한 번만 수행에 초기화를 ORB하지 않습니다. 다중 스레드 (서버 쪽) ORB는 통합 연결을 처리하기 위해 필요한 수의 작업자 스레드 (필요할 경우 또는 구성된 경우 고정 번호)를 시작합니다. 이러한 연결은 작업자가 처리합니다. 이 작업자는이 요청을 처리 할 수있는 하인을 찾습니다. 일반적으로,이 메소드 (서번트에의 실제의 호출)는 여분의 thread에서도 실행됩니다. 하지만이 스레드는 lsof으로 표시되지 않습니다. 스레드 지원이 활성화 된 ps -eLf 또는 top -H을 사용하십시오.

편집 : 당신이 전화 싶어 얼마나 많은 개체에 따라 클라이언트 측에

. 각 개체에 대해 호출자 스레드가 가능합니다. 원격 객체마다 하나 이상의 호출자 스레드를 가질 수도 있지만 클라이언트 측 논리의 다른 스레드에서 호출 된 경우에만 가능합니다. (다중 스레드를 가지고 있고 원격 객체가 스레드간에 공유된다고 상상해보십시오.)

+0

고맙습니다. 마찬가지로 말했듯이, 나는 클라이언트 쪽에서 나가는 연결을보고있었습니다. –

+0

http://omniorb.sourceforge.net/omni41/omniORB/omniORB008.html에서 가져 오기 : 8.3 클라이언트 측 동작 연결의 클라이언트 측에서 프록시 객체를 호출하는 스레드는 GIOP 프로토콜을 직접 구동하고 응답을 수신하기위한 연결. 클라이언트가 처음으로 특정 주소 공간을 호출하면 ORB는 원격 주소 공간에 대한 적절한 연결을 엽니 다 (섹션 8.7.1에서 설명한대로 클라이언트 전송 규칙을 기반으로 함). 응답을 받으면 ORB는 열린 네트워크 연결을 캐시하여 다른 호출에서 사용할 수 있도록 준비합니다. 이것은 설명 할 수 있습니다. –

+0

죄송합니다. 여러 의견을 사용하여 답장을 보내야했습니다. 따라서, 나가는 네트워크 연결의 캐싱을 불가능하게하는 Orbix 구성 매개 변수 (있는 경우)를 찾는 것이 유일한 기회 일 수 있습니다. –

0

솔직히 CORBA 애플리케이션을위한 멀티 스레드 클라이언트라는 개념이 없다고 생각합니다. 서버 측에서는 모든 클라이언트가 사용할 수있는 이름 지정 서비스에 등록 된 only one object이 있기 때문입니다. 객체의 IOR을 보면 모든 클라이언트에서 동일합니다. 따라서 객체에 대한 연결을 하나만 설정할 수 있습니다. 또한 하나 이상의 원격 객체 (다른 클라이언트의 객체를 얼마나 조회하는지, 모두 동일한 참조를 얻음을 의미)를 여러 클라이언트에서 얻을 수 없다고 생각하게됩니다. 따라서 다중 스레드를 지원하려면 서버가 실제로 다른 스레드 정책을 지원해야합니다. POA는 서버가 다른 스레드 정책을 가질 수 있습니다. 더 자세한 내용은 JAVA PROGRAMMING WITH CORBA을 참조하십시오.

+0

구현 리포지토리 및 동적 인터페이스 란 무엇입니까? – tuergeist

+1

서버에 하나의 오브젝트가 있더라도 ORB는 다중 tcpip 연결을 작성할 수 있습니다. 객체 참조를 얻거나 만들 수있는 다른 방법이 있습니다. 서버에서 여러 클라이언트로 여러 객체를 쉽게 제공 할 수 있습니다. 또한, 클라이언트마다 서번트를 제공 할 수있는 서번트 locator 등의 다양한 POA 정책을 확인합니다. –

1

연결 관리는 일반 CORBA에 특정한 구현입니다. 각 공급 업체는 자신의 독점적 인 구성 방법을 사용합니다. RTCORBA 사양을 확인하면 클라이언트와 서버 간의 연결을 사용하는 방법을 구성하는 표준화 된 방법이 있습니다.

Orbix의 작동 방식과 RTCORBA를 지원하는지 여부는 알지 못합니다. 아마 설명서에서 얻을 수 있습니다.나는 TAO가 클라이언트 측에서의 스레딩에 대해 많은 지원을한다는 것을 알고있다. 기본적으로 여러 스레드가 동일한 서버를 호출 할 때 동시에 여러 tcpip 전송을 열 수 있습니다.

1

답변 해 주셔서 감사합니다. 조니가 실제로 구현에 대한 것이라고 말한 것처럼 발견했습니다. ORB가 하나의 서버에 열립니다 동시 연결의 최대 수 :의 기본 5 -

omniORB의 예를 maxGIOPConnectionPerServer에 대한 있습니다. 클라이언트의 여러 스레드가 동일한 서버를 호출하면 ORB는이 매개 변수로 지정된 최대 값까지 서버에 대한 추가 연결을 엽니 다. 최대 값에 도달하면 연결이 사용 가능해질 때까지 스레드가 차단됩니다.

Orbix에 대해 불행히도 무엇이 해당되는지 (있는 경우) 무엇인지 알 수 없습니다. 확실히 1 개의 연결로 기본 설정되어 있습니다. 여전히 검색 중입니다 ...

Solaris의 일부로 발견되었지만 Linux 마이그레이션은 Orbix에서 TAO 개월로 이동합니다. 호프 타오 (TAO)가 더 친숙하고 맞춤화 될 수 있기를 바랍니다.

1

Orbix는 연결이 효율적으로 사용되도록 많은 최적화 루틴을 내부적으로 사용합니다. 특히 동일한 TCP 연결을 통해 여러 동시 GIOP 요청을 멀티플렉싱 할 수 있기 때문에 동일한 서버 끝점에 대한 여러 연결을 열지 않습니다. CORBA는 의도적으로 클라이언트와 서버 프로그래머의 연결 관리를 숨 깁니다.

구성을 통해 제어 할 수 있다고 생각하지 않습니다. Progress Support에 지원 티켓을 보내 확인하십시오. 싱글 톤 모델에서 벗어나 각 클라이언트 (각각 고유 한 ID를 가진)에 대해 다른 ORB를 초기화하면 강제로 발생할 수 있습니다. 그러나 이는 매우 까다롭고 비용이 많이 드는 문제의 해결책입니다. 조금 애매하다. 기본 ORB는 동시 요청을 최적화하기 위해 이미 빌드되어 있으므로 어떤 문제를 해결하려고하는지 잘 모르겠습니다.

+0

브라이언 감사합니다. 당신이 말하는 말이 이치에 맞습니다. 나는 전화가 차례로 연재된다는 인상을 받았다. 이는 실제로는 인터리브 될 수 있습니다. 즉, 여러 요청이 다른 작업자 스레드에서 유선 아래로 푸시되고 그 다음 여러 스레드가 해당 스레드로 발송됩니다. 참으로 지능적인 취급이 있습니다. –