स्मृति और कार्य

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

इस तथ्य के बावजूद कि यह समस्या शुद्ध पानी की कल्पना है, हम एक योजना तैयार करेंगे।
1) मल्टीटास्किंग के बारे में अलग-अलग विचार।
2) प्रत्येक विधि के लिए पेशेवरों और विपक्ष।
3) अपनी बाइक बनाने का तरीका तय करें।

चलिए शुरू करते हैं।
1) जब मैंने सिर्फ यह सोचना शुरू किया कि इस विषय को महसूस करना बेहतर है, तो एक पवित्र, सीधा विचार मेरे सामने आ गया। आइए उस क्षेत्र के बारे में सोचते हैं जहां उपयोगकर्ता प्रक्रियाओं को निष्पादित किया जाता है (रिंग 0 के साथ, सब कुछ सरल है)। आइए उन्हें 16 मेगाबाइट से शुरू होने वाली जगह दें। बाकी उनका क्षेत्र है, रैम के बहुत अंत तक। अब सवाल उठता है: हम कैसे नियंत्रित करते हैं और आवश्यक हर चीज के साथ प्रक्रिया प्रदान करते हैं। पवित्र विचार इस प्रकार था, आपने पहले ही सुना था: हम रैम को एन टुकड़ों में विभाजित करते हैं (जरूरी नहीं कि बराबर), फिर हम कार्यों से कतारों को व्यवस्थित करते हैं और उनके लिए, हम कार्यक्रमों के 'वजन' के अनुसार माप लेंगे, आदि। आप शायद कहना चाहते हैं: "लेखक, शायद आप एक युद्ध रोना जारी करेंगे और गांवों को लूटने के लिए दौड़ेंगे? यह सब बर्बर है। ” मैं सहमत हूं। ऐसा मॉडल व्यवहार्य नहीं है, गैर-विस्तार योग्य और बहुत ही अक्षम है। सुप्रसिद्ध कॉमरेड तानेनबूम ने अपने उल्लेखनीय कार्य में इस बारे में लिखा है। इस मल्टीटास्किंग कार्यान्वयन के साथ, निम्नलिखित समस्याएं उत्पन्न होती हैं: छोटे कार्यक्रमों को कम समय दिया जाएगा, संभवतः भुखमरी। इस तथ्य के कारण कि सभी कार्यक्रमों के आकार अलग-अलग हैं, और रूपरेखा स्थिर है, असमान प्रतिस्पर्धा पैदा होगी। सिद्धांत रूप में, इसे सख्त नियंत्रण द्वारा हल किया जा सकता है, लेकिन यह इस पद्धति को बहुत नुकसान पहुंचाता है क्योंकि स्थैतिक विभाजन एक सिरदर्द लाता है।

2) फिर, थोड़ा विचार करने के बाद, एक और विचार दिमाग में आया: आभासी स्मृति।
आइए स्मृति के पृष्ठ संगठन को बेहतर तरीके से याद रखें (Cthulhu पर आशीर्वाद दें)
यदि हम कार्यों के लिए स्थैतिक क्षेत्रों का उपयोग नहीं करते हैं, तो कई अन्य समस्याएं उत्पन्न होती हैं:
1) कैसे बढ़ती और प्रक्रियाओं का ट्रैक रखने के लिए?
2) क्या एक दूसरे की प्रक्रिया नहीं है?
3) क्या भौतिक स्मृति को प्रक्रिया के लिए निरंतर स्थान का एक टुकड़ा चाहिए?
चलो उनसे निपटते हैं।
1) प्रक्रियाओं को याद नहीं करने के लिए, यह एक मेमोरी मैनेजर (प्रबंधक) को लागू करने के लिए पर्याप्त है, जो मुफ्त पन्नों के रूप में 'राशन वितरित' करेगा। इसके अलावा, हम प्रत्येक प्रक्रिया को अपने स्वयं के विवरणों को देते हैं, जो प्रक्रिया के लंबे हथियारों को काट देगा।
2) यह डिस्पैचर का एक और कर्तव्य है - ध्यान से यह सुनिश्चित करने के लिए कि स्मृति एन प्रक्रियाओं द्वारा साझा नहीं की गई है।
3) ईमानदारी से, सबसे पहले मुझे खुद से गलती हुई, जहां कोड को भौतिक या आभासी स्थानों में निष्पादित किया जाता है (मुझे पता है कि यह अजीब लगता है)। जवाब वर्चुअल स्पेस में है। बस मैट्रिक्स में दुनिया की कल्पना करें: दोनों जुड़े हुए हैं और दोनों वास्तविक हैं। इसलिए आपको वर्चुअल स्पेस को अर्थहीन समझने की जरूरत नहीं है और केवल पता योग्य रैम की अधिकतम मात्रा का विस्तार करना है।
बेहतर समझने के लिए, एक उदाहरण पर विचार करें। यहाँ, उदाहरण के लिए, एक निश्चित प्रक्रिया है जिसके कण पूरे भौतिक स्मृति में बिखरे हुए हैं। लेकिन हम विशिष्ट पते के साथ पृष्ठों को भौतिक पते पर असाइन कर सकते हैं, है ना? यही है, आभासी पता फिर से निर्देशिकाओं और पृष्ठों के माध्यम से एक यात्रा पर जाएगा, और अंत में भौतिक स्मृति में एक पूरी तरह से आवश्यक और मान्य पता होगा। यह पता चला है कि इस प्रक्रिया के लिए आभासी पते अनुक्रमिक होंगे, लेकिन वास्तव में इसका कोड भौतिक मेमोरी में कहीं भी बिखरा हो सकता है।

ऊपर वर्णित विधि अब कई ऑपरेटिंग सिस्टम में उपयोग की जाती है, क्योंकि यह काफी स्थिर, लचीला है। कठिनाई केवल उच्च गुणवत्ता वाले कोड के सक्षम लेखन में होगी।

अब, स्पष्ट रूप से स्मृति प्रबंधक के विषय से संपर्क किया। सामान्य तौर पर, यह माना जाता है कि यह परियोजना का सबसे कठिन हिस्सा है। मैंने भी ऐसा मजाक सुना:
“ऑसदेव प्रोजेक्ट्स स्टाल क्यों करते हैं?
1) वह काम में बहुत व्यस्त है;
2) विवाहित;
3) मैंने एक मेमोरी मैनेजर लिखने की कोशिश की; "

लेकिन डरना नहीं चाहिए। हम सामना करने की कोशिश करेंगे। उसे "निष्पक्ष रूप से शासन" करना होगा, ताकि राम में मूर्ख और "स्वर्ण युग" का शासन हो:
1) पृष्ठों का पालन करें: उन्हें समय पर जारी करें, रीमैप करें।
2) डिमांड पर नए मुफ्त पेजों की तलाश करें (#PF, सबसे अधिक बार)
इसके लिए, कई एल्गोरिदम प्रदान किए जाते हैं, जो कि कॉमरेड तानेंबूम द्वारा भी वर्णित हैं। हम बाद में उन पर विचार करेंगे।
3) यदि पर्याप्त शारीरिक स्मृति नहीं है, तो एक स्वैप का उपयोग करें। इस परिदृश्य में, आपको कम उपयोग किए गए पृष्ठ खोजने होंगे, उन्हें स्वैप में चलाना होगा। फिर वापस। संक्षेप में, प्रबंधक को इस मामले में बहुत पसीना बहाना होगा।

अब शब्दों में वर्णन करते हैं कि एक नए कार्य का निर्माण कैसे होगा (हम इस बात को ध्यान में रखते हैं कि यह अभी तक एक मुकाबला-तैयार संस्करण नहीं है):
1) जांचें कि क्या किसी अन्य कार्य के लिए जगह है।
2) एक विशिष्ट पते पर प्रोग्राम छवि को मेमोरी में लोड करें।
3) कार्य के लिए कोड, स्टैक, डेटा डिस्क्रिप्टर का वर्णन करें।
4) अच्छा होगा यदि आप कार्य के लिए अपनी खुद की निर्देशिकाओं का निर्माण करें, जिसका अर्थ यह है।
5) प्रोग्राम कोड में ट्रांसफर कंट्रोल।
6) यदि #PF उत्पन्न होता है, तो हम देखते हैं कि किस कार्य को किया गया था, जिस पते पर इसे चित्रित किया गया था, उस तक पहुँचते समय, हम मेमोरी मैनेजर से प्रार्थना करते हुए रोते हैं, और यदि भाग्यशाली होते हैं, तो हमें एक और मेमोरी पेज मिलता है, और वापस कोड पर लौट आते हैं।

अगले अंक में, हम इस बात पर विचार करेंगे कि कुख्यात मेमोरी मैनेजर कैसे लिखें, क्योंकि इसके बिना आप कहीं भी नहीं जा सकते।

क्या पढ़ें:
1) एंड्रयू टेनबाम : "आधुनिक ऑपरेटिंग सिस्टम।" (एक बहुत ही उपयोगी पुस्तक)।
2) इंटेल सिस्टम प्रोग्रामिंग मैनुअल (उनके बिना, कहीं नहीं)।

Source: https://habr.com/ru/post/In122171/


All Articles