2009-05-24 7 views
10

मैं वर्तमान में जावा और सी ++ ऐप्स के बीच आईपीसी के लिए साझा मेमोरी का उपयोग कर रहा हूं, लेकिन अधिक सुविधाजनक विकल्प ढूंढ रहा हूं।लिनक्स पर जावा/सी ++ ऐप्स के लिए साझा मेमोरी आईपीसी के लिए अच्छा विकल्प

क्या कोई भी समान प्रदर्शन और गति के साथ एक बेहतर विधि की सलाह दे सकता है?

धन्यवाद!

+0

मैंने "गैर-स्पष्ट" स्कोर के कारण विवरण अपडेट किया है, उम्मीद है कि अब यह और अधिक स्पष्ट है। – SyRenity

उत्तर

7

यह इस बात पर निर्भर करता है कि आप अपने ऐप्स को कैसे इंटरैक्ट करते हैं। पॉज़िक्स पर्यावरण में, आपके पास पाइप, साझा मेमोरी, सॉकेट, सेमफोर और संदेश कतार हैं। अधिक जानकारी के लिए यह प्रश्न देखें: Comparing unix linux IPC

आपकी प्रक्रियाओं (यानी क्लाइंट/सर्वर, निर्माता-उपभोक्ता इत्यादि) के लिए इंटरैक्शन मॉडल क्या है?

व्यक्तिगत अनुभव से, मैं सुझाव दूंगा कि आपकी सर्वश्रेष्ठ शर्त पाइप होगी (क्योंकि वे केवल बाइट पढ़ने और लिखने के लिए फाइलें हैं) या सॉकेट (क्योंकि दोनों भाषाएं उनका समर्थन करती हैं)।

+0

मुख्य उपभोक्ता और कई गूंगा (लेकिन अत्यधिक कुशल) उत्पादक। – SyRenity

+0

साझा स्मृति की तुलना में पाइप या सॉकेट कितनी तेजी से? – SyRenity

+0

@SyRenity, बहुत तेज़। इस पर निर्भर करता है कि आप कितना लॉक करते हैं और वास्तव में आप किस लॉकिंग का उपयोग करते हैं। भी +1, नामित पाइप शांत हैं। –

4

जैसा कि मिकेलोंग ने कहा था, यह आपके द्वारा किए जा रहे कार्यों पर बहुत निर्भर करता है। AFAIK, आईपीसी विधियों में से कोई भी मूल जावा बाइंडिंग नहीं है, इसलिए आपको शायद जेएनआई का उपयोग करना होगा और बाइंडिंग स्वयं करना होगा, इसलिए सभी अलग-अलग विधियां मोटे तौर पर उतनी ही कठिन हैं। अगर आप संदेश भेज रहे हैं, तो मैं संदेश कतारों का उपयोग करने का सुझाव देता हूं। वे उपयोग करने में बहुत आसान हैं (एक बार आपके पास बाइंडिंग हो), और अच्छा प्रदर्शन करें। यदि आपको कुछ संसाधन "साझा" करने की आवश्यकता है, तो आप शायद साझा स्मृति के साथ रहना चाहते हैं।

जैसा कि ऐसा लगता है कि आपके पास कुछ प्रकार की क्लाइंट/सर्वर चीज है, तो मैं कहूंगा कि संदेश कतार, यूनिक्स डोमेन सॉकेट या नामित पाइप का उपयोग करें। वे सभी कर्नेल में डेटा कॉपी करने में शामिल हैं, इसलिए वे साझा स्मृति के रूप में तेज़ नहीं हैं, लेकिन वे अभी भी बहुत तेज़ हैं। यदि आपके पास संदेश-जैसे डेटा (व्यक्तिगत छोटे पैकेट) हैं, तो संदेश कतारों के साथ जाएं। यह शायद सबसे साफ समाधान है। यदि आपके पास डेटा की अधिक स्ट्रीम है, तो पाइप या सॉकेट का उपयोग करें। सॉकेट्स का लाभ यह है कि यदि आप चाहें तो बाद में इसे आसानी से नेटवर्क पारदर्शी (जैसे एक्स 11) बना सकते हैं, लेकिन वे पाइप की तुलना में काम करने के लिए थोड़ा कठिन हैं। प्रदर्शन शायद बहुत समान है।

+0

केवल कुछ बाइनरी डेटा ले जाने के लिए देख रहे हैं - लेकिन जितनी जल्दी हो सके। – SyRenity

+0

मैं वास्तव में आईपीसी के लिए जेएनए का उपयोग कर रहा हूं और यह ठीक काम करता है - लेकिन फिर, साझा स्मृति की सामान्य असुविधा (खंड बचे हुए, आदि ...) एक हत्यारा हैं। – SyRenity

+0

क्या जावा यूनिक्स डोमेन सॉकेट का समर्थन करता है? इसके लिए आपको एड-ऑन lib की आवश्यकता हो सकती है। यदि आपके डेटा में कुछ निश्चित संरचनाएं हैं, तो संदेश कतारों के साथ जाएं। वे उपयोग करने के लिए तेज़ और आसान हैं। यदि डेटा अधिक परिवर्तनीय और धारा-जैसी है तो नामित पाइप के साथ जाएं। – Duck

0

हालांकि सबसे अधिक कुशल नहीं होने पर, जावा केवल बॉक्स के बाहर सॉकेट का समर्थन करता है (सबसे अच्छा मुझे याद है)। वे बहुत लचीला हैं, शायद अन्य विकल्पों के जितना तेज़ नहीं। जैसा कि ज़िफ्रे ने उल्लेख किया है, यह आपको नेटवर्क पारदर्शिता के साथ-साथ भाषा/बाध्यकारी पारदर्शिता के अवसर के साथ छोड़ देता है; इन दिनों बॉक्स के बाहर हर भाषा एक सॉकेट लाइब्रेरी का समर्थन करती है।

जबकि मैं खिड़की से दक्षता फेंक रहा हूं, अगर आप इसे अगले स्तर पर ले जाना चाहते हैं, तो आप शायद इसे किसी प्रकार की वेब सेवा में लपेट सकते हैं। उपभोक्ता पर अपने डेटा जमा करने के लिए उपभोक्ता पर एक एम्बेडेड वेब सर्वर का उपयोग करें।

0

विभिन्न भाषाओं में लिखे गए अनुप्रयोगों के बीच संवाद करने का सबसे आसान तरीका IMHO CORBA है। वहां बहुत अच्छे ओपन सोर्स CORBA ORBs हैं। हम जावा के लिए सी ++ और JacORB के लिए TAO का उपयोग करते हैं। OCI और Remedy जैसी कंपनियां भी तकनीकी सहायता प्रदान करती हैं।

+0

इस स्थिति आईएमओ में कोर्बा अधिक हो जाएगा। यह भूलना आसान है कि ओआरबी स्थापित करने में कितना काम होता है, कोर्बा, आईडीएल इत्यादि सीखना आदि। यह किसी ऐसे व्यक्ति के लिए एक कठिन संभावना है जो सिर्फ उसी मशीन पर कुछ डेटा पास करना चाहता है, इसमें से अधिकांश अनियंत्रित है जो कि पिटा का थोड़ा सा है कोर्बा में – Duck

+0

@ मेरे अनुभव में डक सीखना आसान है कि क्रॉस भाषा/मंच संचार मैन्युअल रूप से सही तरीके से करने के बजाय कोर्बा का उपयोग कैसे करें। बस सभी marhalling/demarshalling सही पाने के लिए एक दुःस्वप्न हो सकता है। सभी अच्छी सेवाओं (नामकरण, घटना, ...) का उल्लेख नहीं करना है कि कोई भी बॉक्स से बाहर उपयोग कर सकता है। – lothar

+0

क्या आप गंभीर हैं ?? कोबरा? 2012 में? मुझे यकीन है कि यह एक अच्छी तकनीक है और तथ्य यह है कि यह मृत है दुर्भाग्यपूर्ण और दुखी है, लेकिन यह अभी भी मर चुका है। –

-6

मैं वर्तमान में जावा और सी ++ ऐप्स, के बीच आईपीसी के लिए साझा मेमोरी का उपयोग कर रहा हूं लेकिन अधिक सुविधाजनक विकल्प ढूंढ रहा हूं।

क्या कोई बेहतर तरीका सुझा सकता है, लेकिन उसी प्रदर्शन की गति के साथ?

सरल साझा स्मृति के लिए आप भी एक विशेष पुस्तकालय की जरूरत नहीं है:,

class Main { 
    private static class CustomThread extends Thread { 
     public int x = 0; 
     public void run() { 
      x = 5; 
     } 
    } 

    public static void main(String[] args) { 

     CustomThread t = new CustomThread(); 
     t.start(); 

     System.out.println(t.x); 
     System.out.println(t.x); 
    } 
} 

स्थानीय चर x धागा बाहर और भीतर पहुँचा जा आप इसे उपयोग करने के लिए अंदर और बाहर जानकारी पारित करने के लिए अनुमति देता है धागे का

संबंधित मुद्दे