2012-01-10 16 views
7

यह सेमेस्टर मैं ओएस कोर्स का टीए हूं। तो मुझे सीमित सी प्रोग्रामिंग कौशलमल्टीथ्रेडिंग प्रोग्रामिंग के लिए असाइनमेंट डिज़ाइन करना

के साथ सीएस अंडरग्रेजुएट्स के लिए मल्टीथ्रेड प्रोग्रामिंग का असाइनमेंट डिज़ाइन करने के लिए कहा गया था, यह एक बड़ा असाइनमेंट नहीं होना चाहिए क्योंकि यह केवल अंतिम ग्रेड का 5% लेता है। और यह कुछ नया होना चाहिए ताकि छात्र इंटरनेट से कुछ कोड डाउनलोड न कर सकें।

यहां मैं जो सोच रहा हूं, एक साधारण संदेश कतार सेवर है।

हम छात्र एक बहुत ही डमी MQ Sever जो केवल एक धागा है और स्वीकार करता है केवल 2 ग्राहक कनेक्शन, एक रीडर और एक लेखक को प्रदान करेगा। लेखक समय-समय पर कतार में है, यानी Sever संदेश भेजते हैं, और पाठक कतार से संदेश पढ़ता है, अर्थात Sever संदेश पाठक को भेजता है। हम पाठक और लेखक भी प्रदान करेंगे।

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

मुझे लगता है कि यह बहुत आसान हो सकता है लेकिन मैं इस समय किसी और चीज के बारे में नहीं सोच सकता था। यदि आप मेरी स्थिति में थे, तो आप क्या असाइनमेंट देंगे?

+0

मैंने ओएस कक्षा ली, बहुत पहले नहीं। उन्होंने स्टैनफोर्ड पिंटोस ओएस कक्षा के पाठ्यक्रम को बंद कर दिया।आप जो लोग योजना बना रहे हैं उससे बदलाव में शायद यह बहुत बड़ा है, लेकिन शायद आपको इसे अगले वर्ष मानना ​​चाहिए। http://www.stanford.edu/class/cs140/projects/pintos/pintos_2.html संपादित करें: वैसे, यह पूरी सीएस प्रमुख में मेरी पसंदीदा कक्षा थी। मुझे लगा जैसे मुझे वास्तव में अंतर्निहित ओएस आर्किटेक्चर की समझ मिली। –

उत्तर

0

क्या आप यूनिक्स का उपयोग कर रहे हैं? यह महत्वपूर्ण नहीं है, आप इसके लिए विंडोज का भी उपयोग कर सकते हैं।

बस, एक नामित पाइप बनाएं।

फिर 4 थ्रेड बनाएं।

1 नियंत्रण धागा, 1 उपभोक्ता (पाठक) धागा, और 2 निर्माता (लेखक) धागे।

निर्माता बस पाइप को एक स्ट्रिंग भेजते हैं, और उपभोक्ता स्ट्रिंग लेता है, इसे अपरकेस करता है या कुछ करता है और इसे प्रिंट करता है।

नियंत्रण थ्रेड का उपयोग अन्य 3 धागे को शुरू करने और रोकने के लिए किया जाता है। यह सरल आदेश लेता है: startProducer1, startProducer2, startConsumer, रोकें आदेश, और एक शट डाउन कमांड।

यह अलग धागे सब अपने दम पर काम कर दिखाता है, लेकिन एक ही समय मास्टर द्वारा नियंत्रित किया जा रहा पर (जानते हुए भी जब बंद करने के लिए आदि)।

बोनस अंक आप लपेट कर सकते हैं अगर यह एक सरल GUI, या यहाँ तक कि कुछ सरल ncurses वीडियो प्रदर्शन इतना है कि नियंत्रण प्रदर्शन हमेशा आदेशों को स्वीकार करने और परिणामों को प्रदर्शित करने दृश्यता है।

आप दिखा सकते हैं कि क्या आप 1 निर्माता शुरू करते हैं लेकिन कोई उपभोक्ता नहीं, थ्रेड कैसे ब्लॉक करेगा। दोनों उत्पादकों के साथ ही, या उपभोक्ता बिना उत्पादकों के ब्लॉक कैसे करता है।

पाइप उपयोग करने का अर्थ आपको लगता है कि बाह्य प्रोग्राम (और यह की स्थापना, यह डिबगिंग यह विन्यस्त और इसका समर्थन के सभी विवरण) पर भरोसा करने की जरूरत नहीं है।

यूनिक्स और विंडोज दोनों ने पाइप नाम दिया है (लेकिन सिस्टम कॉल मुझे लगता है कि अलग हैं, लेकिन POSIX पोर्टेबिलिटी बस यहां काम कर सकती है ...)।

0

आप अपने प्रारंभिक चरण में कनेक्शन पूल मैनेजर रख सकते हैं जो केवल कनेक्शन का पूल बनाते हैं और विश्वसनीय रूप से कनेक्शन ऑब्जेक्ट का उपयोग और पुन: उपयोग करने में सक्षम है।

दूसरा, आपके पास एक httpclient हो सकता है जो एकाधिक जीईटी केवल अनुरोध कर सकता है (जैसा कि अन्य इसे बहुत जटिल बना देगा), और आप प्रत्येक अनुरोध से संबंधित सभी प्रतिक्रियाओं को सत्यापित करने में सक्षम होना चाहिए (आप इसे रद्द करने के लिए भी बना सकते हैं निवेदन)।

तीसरा सबसे सरलतम सादा सर्वर सॉकेट लिखता है जो प्रत्येक अलग अनुरोध को स्वीकार कर सकता है और इसे नए सर्वर थ्रेड को असाइन कर सकता है अनुरोध प्राप्त कर लेता है और प्रतिक्रिया वापस कर देता है।

thats क्या मैं बंद में सोच सकते हैं ..

0

ऐसे Dining Philosphers के रूप में क्लासिक समस्याओं का लाभ यह है कि गतिरोध और भुखमरी कार्यान्वयन विवरण में गहरी हो रही बिना प्रदर्शित करने के लिए आसान है।

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

0

मैं विद्यार्थियों से महत्वपूर्ण वर्गों तक पहुंचने के लिए थ्रेडेड स्टेट मशीन प्रदान करने के लिए कहूंगा, उदाहरण के लिए, रोबोट बांह के लिए।

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

यह दर्शाता है कि केवल महत्वपूर्ण वर्गों तक पहुंच को सीमित करने के लिए, लेकिन कार्यों के महत्वपूर्ण अनुक्रम के लिए कैसे उपयोग किया जाता है।

उदा। MoveArm धागा 1 (उदाहरण के लिए यूआई) से कहा जाता है रोबोट हथियारों संकेत कतार पर तैनात किया जाएगा, और एक बार रोबोट भुजा धागा अपने स्वयं के सूत्र में संकेत का पता लगाता है, readyState से निम्नलिखित राज्यों के माध्यम से कदम होगा:

  1. StartingToMoveArmState
  2. MovingArmState (यहाँ हम अगर हम ई रोकने के लिए आदि)
  3. readyState (एक बार पूरा ले जाते हैं)।

थ्रेड 2 सकता है, जबकि रोबोट भुजा धागा संसाधित कर रहा है धागा है StopArm संकेतों (जैसे के लिए सुन सकते हैं हाथ को स्थानांतरित करने के लिए 1 का अनुरोध, StopArm() - और कॉल करें इसे MovingArmState में संभाला जाएगा। इसके अलावा, थ्रेड 2 हाथ को कहीं और स्थानांतरित करने के लिए कह सकता है, लेकिन रोबोट आर्म थ्रेड इसे तब तक सेवा नहीं करेगा जब तक कि वह रेडीस्टेट में वापस न आए। अर्थात। रेडीस्टेट केवल अगले सिग्नल को स्थानांतरित करने के लिए कतार देगा।

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

उम्मीद है कि यह उपयोगी हो सकता है!

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