फीफो (कंप्यूटिंग और इलेक्ट्रॉनिक्स)

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

इस तरह की प्रोसेसिंग पहले आओ, पहले पाओ (FCFS) के आधार पर कतार क्षेत्र में लोगों की सेवा करने के अनुरूप है, यानी उसी क्रम में जिसमें वे कतार की पूंछ पर पहुंचते हैं।

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

कंप्यूटर विज्ञान
आवेदन के आधार पर, एक फीफो को हार्डवेयर शिफ्ट रजिस्टर के रूप में या विभिन्न मेमोरी संरचनाओं का उपयोग करके, आमतौर पर एक परिपत्र बफर या एक प्रकार की सूची (सार डेटा प्रकार) के रूप में लागू किया जा सकता है। अमूर्त डेटा संरचना के बारे में जानकारी के लिए, कतार (डेटा संरचना) देखें। FIFO कतार के अधिकांश सॉफ़्टवेयर कार्यान्वयन थ्रेड सुरक्षित नहीं हैं और डेटा संरचना श्रृंखला को एक समय में केवल एक थ्रेड द्वारा हेरफेर किया जा रहा है, यह सत्यापित करने के लिए लॉकिंग तंत्र की आवश्यकता होती है।

निम्न कोड एक लिंक की गई सूची FIFO C++ भाषा कार्यान्वयन दिखाता है। व्यवहार में, लोकप्रिय यूनिक्स सिस्टम C sys/queue.h मैक्रोज़ या C++ मानक टेम्पलेट लाइब्रेरी std::list टेम्प्लेट सहित कई सूची कार्यान्वयन मौजूद हैं, जो डेटा संरचना को स्क्रैच से लागू करने की आवश्यकता से बचते हैं।

कंप्यूटिंग वातावरण में जो पाइप और फिल्टर का समर्थन करते हैं। इंटरप्रोसेस संचार के लिए पाइप-एंड-फिल्टर मॉडल, एक FIFO नामित पाइप का दूसरा नाम है।

डिस्क नियंत्रक FIFO को I/O शेड्यूलिंग एल्गोरिथम के रूप में उपयोग कर सकते हैं ताकि डिस्क इनपुट/आउटपुट|I/O अनुरोधों को सेवा देने का क्रम निर्धारित किया जा सके, जहां इसे उसी FCFS इनिशियलिज़्म द्वारा भी जाना जाता है जैसा कि पहले उल्लेखित CPU शेड्यूलिंग के लिए है।

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

इलेक्ट्रॉनिक्स
हार्डवेयर और सॉफ्टवेयर के बीच बफरिंग और प्रवाह नियंत्रण के लिए आमतौर पर FIFO का उपयोग इलेक्ट्रानिक्स  सर्किट में किया जाता है। अपने हार्डवेयर रूप में, एक फीफो में मुख्य रूप से पठन और लेखन सूचक (कंप्यूटर प्रोग्रामिंग), भंडारण और नियंत्रण तर्क का एक सेट होता है। स्टोरेज स्थिर रैंडम एक्सेस मेमोरी (SRAM), फ्लिप-फ्लॉप (इलेक्ट्रॉनिक्स) | फ्लिप-फ्लॉप, लैचेस या स्टोरेज का कोई अन्य उपयुक्त रूप हो सकता है। गैर-तुच्छ आकार के FIFO के लिए, एक दोहरे पोर्ट SRAM का आमतौर पर उपयोग किया जाता है, जहां एक पोर्ट लिखने के लिए और दूसरा पढ़ने के लिए समर्पित होता है।

इलेक्ट्रॉनिक्स में लागू किया गया पहला ज्ञात FIFO 1969 में फेयरचाइल्ड सेमीकंडक्टर में पीटर अल्फके द्वारा किया गया था। अल्फ्के बाद में Xilinx में निदेशक थे।

समकालिकता
एक तुल्यकालिक फीफो एक फीफो है जहां पढ़ने और लिखने दोनों के लिए एक ही घड़ी का उपयोग किया जाता है। एक अतुल्यकालिक फीफो पढ़ने और लिखने के लिए अलग-अलग घड़ियों का उपयोग करता है और वे metastability  मुद्दों को पेश कर सकते हैं। अतुल्यकालिक फीफो का एक सामान्य कार्यान्वयन विश्वसनीय ध्वज निर्माण सुनिश्चित करने के लिए पढ़ने और लिखने के संकेतकों के लिए एक ग्रे कोड (या किसी इकाई दूरी कोड) का उपयोग करता है। फ़्लैग जनरेशन से संबंधित एक और नोट यह है कि अतुल्यकालिक FIFO कार्यान्वयन के लिए फ़्लैग उत्पन्न करने के लिए आवश्यक रूप से पॉइंटर अंकगणित का उपयोग करना चाहिए। इसके विपरीत, सिंक्रोनस फीफो कार्यान्वयन में झंडे उत्पन्न करने के लिए या तो एक टपका हुआ बाल्टी दृष्टिकोण या सूचक अंकगणित का उपयोग कर सकता है।

एक हार्डवेयर FIFO का उपयोग तुल्यकालन उद्देश्यों के लिए किया जाता है। इसे अक्सर एक गोलाकार कतार के रूप में कार्यान्वित किया जाता है, और इस प्रकार दो पॉइंटर (कंप्यूटर प्रोग्रामिंग) होते हैं:
 * सूचक पढ़ें / पता रजिस्टर पढ़ें
 * सूचक लिखें / पता रजिस्टर लिखें

स्थिति झंडे
फीफो स्थिति झंडे के उदाहरणों में शामिल हैं: पूर्ण, खाली, लगभग भरा हुआ और लगभग खाली। जब रीड एड्रेस रजिस्टर राइट एड्रेस रजिस्टर तक पहुंचता है तो एक FIFO खाली होता है। एक FIFO तब भर जाता है जब राइट एड्रेस रजिस्टर रीड एड्रेस रजिस्टर तक पहुँच जाता है। पढ़ने और लिखने के पते प्रारंभ में पहले स्मृति स्थान पर होते हैं और FIFO कतार खाली होती है।

दोनों ही मामलों में, पढ़ने और लिखने के पते बराबर होते हैं। दो स्थितियों के बीच अंतर करने के लिए, एक सरल और मजबूत समाधान प्रत्येक पढ़ने और लिखने के पते के लिए एक अतिरिक्त अंश  जोड़ना है जो हर बार पता लपेटने पर उलटा होता है। इस सेट अप के साथ, असंबद्धता शर्तें हैं:
 * जब रीड एड्रेस रजिस्टर राइट एड्रेस रजिस्टर के बराबर होता है, तो FIFO खाली होता है।
 * जब पढ़ने और लिखने का पता रजिस्टर केवल अतिरिक्त बिट नंबरिंग # सबसे महत्वपूर्ण बिट में भिन्न होता है और बाकी समान होते हैं, तो FIFO भरा हुआ होता है।

यह भी देखें

 * फीफो और लाइफो लेखा
 * जब तक
 * कतारबद्ध सिद्धांत

बाहरी संबंध

 * Cummings et al., Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons, SNUG San Jose 2002