java - DatagramChannel, blocking mode and cpu -
मुझे निम्नलिखित कोड स्निपेट मिलता है:
डेटाग्राम चैनल = डेटाग्राम चैनल। ओपन (मानकप्रोटोकॉफिल। INET ) .सेटऑप (मानक सॉकेट विकल्प। SO_UUSEADDR, सच है) .सेटऑप (मानक सॉकेटऑप्शन। IP_MULTICAST_IF, नेटवर्क इंटरफेस); datagramChannel.configureBlocking (सही); डेटाग्राम चैनल.बिंद (नया इनसेट सॉकेट अटैडर (फिल्टर.टाटाइप ()। GetPort (filter.getTimeFrameType ()))); डाटाग्राम। चैनल (समूह, नेटवर्क इंटरफेस); datagramChannel.receive (बफर); यह कोड एक कॉल करने योग्य में स्थित है और मैं मल्टिकास्ट पैकेट को पुनर्प्राप्त करने के लिए 12 से बना कोलाबल s (12 सूत्र) बना सकता हूं 12 विभिन्न बंदरगाहों से अलग डेटा यह केवल सूचना से पढ़ता है जो नेटवर्क पर हर 3-8 सेकंड में ब्रोकेस्ट किया जाता है। जब 12 बंदरगाहों को निरंतर ( जानकारी की प्रतीक्षा करें, सूचना प्राप्त करें, और इतने पर ), यह मेरे सीपीयू में से एक का 100% खाता है। JVisualVM के साथ निष्पादन की रूपरेखा, मुझे लगता है कि निष्पादन समय का 90% java.nio.channels.DatagramChannel # के लिए समर्पित है () , और अधिक सटीक com.sun.nio.ch.DatagramChannelImpl # receiveIntoBuffer () । -
मुझे अच्छी तरह समझ में नहीं आ रहा है क्यों ब्लॉकिंग मोड इतना सीपीयू खाते हैं।
-
मैंने ब्लॉकिंग मोड के बजाय selector s का उपयोग करने पर कुछ लेख पढ़ा है, लेकिन मैं वास्तव में नहीं देखें कि एक जबकि (सच) के साथ चयनकर्ता अवरुद्ध चैनल से कम उपभोग होगा।
समस्या यह है कि आप चयनकर्ता के बिना एनआईओ का प्रयोग कर रहे हैं।
चयनकर्ता के बिना एनआईओ ठीक है लेकिन फिर चैनल। निरंतर प्रयास करना
- पढ़ने के लिए कुछ है या नहीं पता लगाने के लिए चयनकर्ता का उपयोग करें। कॉल चैनल। केवल जब चयनकर्ता इंगित करता है कि पढ़ने के लिए डेटा है
- ब्लॉकिंग मोड में भेजने / प्राप्त करने के लिए जावानेट। डेटाग्राम / डेटाग्राम पैकेट का उपयोग करें। < / html>
Comments
Post a Comment