2012-03-27 15 views
6

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

आदर्श रूप से मैं लिखने के कॉल और कैशिंग का उपयोग करके कभी भी लापरवाह नहीं होना चाहूंगा, अगर यह पारदर्शी रूप से किया जाएगा तो ठीक है।

संपादित करें:_O_SEQUENTIAL केवल लिखने पर ध्वज केवल किसी भी प्रकार का उपयोग होगा?

+0

मुझे यह नहीं मिला। आप अभी तक कभी भी ब्लॉक नहीं करना चाहते हैं आप सुपर-थ्रेड थ्रेड प्राथमिकता का उपयोग कर रहे हैं? यह कोई समझ नहीं आता है। आपकी बाहरी समस्या वास्तव में क्या है? –

+0

@ डेविड-schwartz लेखन ऑपरेशन कुछ आवृत्ति पर एक समग्र प्रणाली अंतराल देता है। मुझे थ्रेड में अवरुद्ध करने की परवाह नहीं है, मेरा मतलब सिस्टम अंतराल है ..., – Ulterior

+0

प्रश्न सही करेगा क्या आपके पास समस्या के बारे में कोई और जानकारी है? क्या यह उदाहरण के लिए है कि लिखने की मात्रा अन्य जानकारी को कैश से बाहर कर रही है? यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आप [गैर-अस्थायी लिख सकते हैं जो डिस्क कैश को बाईपास करें] (http://support.microsoft.com/kb/99794)। –

उत्तर

4

थ्रेड के लिए I/O प्राथमिकता को कम करने का प्रयास करें। इस आलेख को देखें: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx विशेष रूप से अपने आईओ थ्रेड के लिए THREAD_MODE_BACKGROUND_BEGIN का उपयोग करें। चेतावनी: यह Windows XP

+0

बनाने के लिए तृतीय पक्ष लाइब्रेरी का उपयोग कर रहा हूं, यह वास्तव में एक समस्या है, क्योंकि मुझे इसे विंडोज एक्सपी पर काम करने की आवश्यकता है ... – Ulterior

+0

तो यदि आप पहले ही कम कर चुके हैं आईओ थ्रेड की प्राथमिकता कम से कम मुझे लगता है कि आपको आईओ गति के बारे में ज्यादा परवाह नहीं है (यह सिर्फ होना है)।तो मैं सुझाव देता हूं कि विंडोज डिफ्रैगमेंटर के समान दृष्टिकोण का उपयोग करने के लिए - वर्तमान डिस्क आईओ स्तरों की जांच करें और जब तक कि वे कम से कम न हों तब तक कुछ भी न करें - मेरा मानना ​​है कि जब आप यूएसबी आईओ मुख्य एचडीडी आईओ –

+0

हम्म को ब्लॉक करते हैं तो यह लग रहा है, यह काम कर सकता है । क्या आपके पास उस पर कोई और जानकारी है? मैं इसे देखता हूं, निश्चित रूप से – Ulterior

3

पर काम नहीं करता है थ्रेड प्राथमिकता मीडिया लिखने की प्रक्रिया में होने वाली देरी को प्रभावित नहीं करेगी, क्योंकि यह फ़ाइल सिस्टम/डिस्क ड्राइवर द्वारा कर्नेल मोड में किया जाता है कॉलिंग थ्रेड की प्राथमिकता पर ध्यान नहीं देना।

आप "टी" ध्वज (_O_SHORTLIVED) का उपयोग करने और ऑपरेशन के अंत में बफर को फ्लश करने का प्रयास कर सकते हैं, बफर आकार को कम करने का भी प्रयास करें। 1.Bulk स्थानांतरण, 2.Isochronous स्थानांतरण, और 3.Interrupt स्थानांतरण:

2

डेटा के लिए वहाँ 3 रहे हैं यूएसबी के लिए डेटा स्थानांतरण के विभिन्न प्रकार के होते हैं,।

  1. थोक स्थानान्तरण प्रदान करता है:

    Used to transfer large bursty data. 
    Error detection via CRC, with guarantee of delivery. 
    No guarantee of bandwidth or minimum latency. 
    Stream Pipe - Unidirectional 
    Full & high speed modes only. 
    

    थोक हस्तांतरण डेटा के लिए अच्छा है कि समय की गारंटी राशि में वितरण की आवश्यकता नहीं है USB होस्ट नियंत्रक से थोक हस्तांतरण करने के लिए एक निम्न प्राथमिकता देता है अन्य प्रकार के स्थानांतरण।

  2. Isochronous स्थानांतरण प्रदान करता है:

    Guaranteed access to USB bandwidth. 
    Bounded latency. 
    Stream Pipe - Unidirectional 
    Error detection via CRC, but no retry or guarantee of delivery. 
    Full & high speed modes only. 
    No data toggling. 
    

    Isochronous स्थानान्तरण लगातार और समय समय पर होते हैं। उनमें आमतौर पर समय संवेदनशील जानकारी होती है, जैसे ऑडियो या वीडियो स्ट्रीम। यदि ऑडियो स्ट्रीम में डेटा में देरी या पुनः प्रयास किया गया था, तो आप ग्लिच युक्त कुछ अनियमित ऑडियो की अपेक्षा करेंगे। बीट अब सिंक में नहीं हो सकता है। हालांकि अगर हर बार एक पैकेट या फ्रेम गिरा दिया गया था, तो श्रोता द्वारा इसे देखा जाने की संभावना कम है।

  3. इंटरप्ट स्थानान्तरण प्रदान करता है:

    Guaranteed Latency 
    Stream Pipe - Unidirectional 
    Error detection and next period retry. 
    

    इंटरप्ट हस्तांतरण आमतौर पर गैर आवधिक, छोटा सा उपकरण संचार घिरे विलंबता की आवश्यकता होती है "शुरू की" कर रहे हैं। एक इंटरप्ट अनुरोध तब तक डिवाइस द्वारा कतारबद्ध किया जाता है जब तक मेजबान मतदान यूएसबी डिवाइस डेटा मांगने के लिए नहीं करता है।

ऊपर से ऐसा प्रतीत होता है कि आप एक गारंटी विलंबता चाहते हैं, तो आप Isochronous मोड का उपयोग करना चाहिए।कुछ पुस्तकालय हैं जिनका उपयोग आप libusb जैसे कर सकते हैं, या आप msdn

+1

यूएसबी डिवाइस, डिस्क, यह तय करता है कि यह कौन से स्थानांतरण मोड हैंडल करता है। यदि यह इंटरप्ट मोड नहीं करता है, तो यह नहीं करता है। मुझे नहीं लगता कि कोई यूएसबी ड्राइव है जो बल्क ट्रांसफर के अलावा कुछ भी करता है। –

+0

अच्छी तरह से, मैं आपको कम करने से पहले और अधिक पढ़ने की सलाह देता हूं और "मुझे नहीं लगता ..." एक संभावित उत्तर देने का स्वीकार्य कारण नहीं है जो वास्तव में किसी की मदद कर सकता है। विषय पर वापस आना, यदि आप यह जानना चाहते हैं कि आप यह कैसे पढ़ सकते हैं [आलेख] (http://msdn.microsoft.com/en-us/library/windows/hardware/ एचएस 406225 (वी = बनाम .5) .aspx) एमएसडीएन में। आप और अधिक पढ़ सकते हैं [यहां] (http://www.silabs.com/Support%20Documents/TechnicalDocs/AN295.pdf)। और तकनीकी विवरण इस [आलेख] में हैं (http://www.beyondlogic.org/usbnutshell/usb4.shtml)। –

+0

ओपी अपने आईओ को अन्य आईओ को अवरुद्ध करने के लिए नहीं कह रहा है, विश्वास नहीं है कि वह गारंटीकृत विलंबता चाहता है, वास्तव में विपरीत। –

0

में और अधिक पढ़ सकते हैं यह पता लगाने के लिए कि आपके सिस्टम को लटका देने के लिए आपको पहले विंडोज लटकने की आवश्यकता है। जब आप लटका अनुभव करते थे तो विंडोज क्या कर रहा था?

यह पता लगाने के लिए आप कर्नेल डंप ले सकते हैं। कर्नेल डंप को कैसे प्राप्त करें और विश्लेषण करें here पढ़ें।

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

Edit1

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

दूसरी सबसे अच्छी बात यह है कि प्रत्येक लिखने के बाद के बाद प्रतीक्षा करें ताकि ओएस को लंबित परिवर्तन लिखने का मौका दिया जा सके, हालांकि एक निश्चित समय अंतराल के बाद डिस्क पर छोटा वापस।

यदि आप प्रदर्शन में गहरे हैं तो आपको XPerf का प्रयास करना चाहिए जिसमें एक अच्छा जीयूआई है और आपको कॉल स्टैक भी दिखाता है जहां आपकी प्रक्रिया लटका हुआ था। एमएस में विंडोज टीम और कई अन्य टीमें experiences लटकने की समस्या निवारण के लिए इस टूल का उपयोग करती हैं। कई और विशेषताओं वाला नवीनतम संस्करण Windows 8 SDK के साथ आता है। लेकिन सावधान रहें कि Xperf केवल ओएस> Vista पर काम करता है।

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