हाँ।
आपको निश्चित रूप से हमेशा स्वैप सक्षम होना चाहिए, सिवाय इसके कि कोई बहुत सम्मोहक, निषिद्ध कारण है (जैसे, कोई डिस्क नहीं है, या केवल नेटवर्क डिस्क मौजूद है)। क्या आपको अक्सर अनुशंसित हास्यास्पद आकार (जैसे, दो बार रैम की मात्रा) के आदेश पर एक स्वैप होना चाहिए? खैर, नहीं ।
इसका कारण यह है कि स्वैप केवल तब उपयोगी नहीं होता है जब आपके अनुप्रयोग भौतिक रैम की तुलना में अधिक मेमोरी का उपभोग करते हैं (वास्तव में, उस स्थिति में, स्वैप बिल्कुल भी उपयोगी नहीं है क्योंकि यह प्रदर्शन को गंभीर रूप से प्रभावित करता है)। आजकल स्वैप के लिए मुख्य प्रोत्साहन जादुई रूप से 16GiB RAM को 32 GiB में बदलना नहीं है, बल्कि स्थापित, उपलब्ध RAM का अधिक कुशल उपयोग करना है।
आधुनिक कंप्यूटर पर, RAM अप्रयुक्त नहीं होती है। अप्रयुक्त रैम एक ऐसी चीज है जिसे आप खरीद सकते हैं और इसके बदले पैसे नहीं बचा सकते हैं। इसलिए, आप जो कुछ भी लोड करते हैं या कुछ भी करते हैं, अन्यथा मेमोरी-मैप्ड, कुछ भी जो संभवतः किसी भी समय के बाद किसी भी द्वारा पुन: उपयोग किया जा सकता है (सुरक्षा बाधाओं द्वारा सीमित) को कैश किया जा रहा है। मशीन के बूट होने के तुरंत बाद, सभी भौतिक रैम का उपयोग किसी चीज़ के लिए किया जाएगा ।
जब भी आप ऑपरेटिंग सिस्टम से नया मेमोरी पेज मांगते हैं, तो मेमोरी मैनेजर को एक शिक्षित निर्णय लेना पड़ता है:
- बफर कैश से एक पृष्ठ शुद्ध करें
- मैपिंग से एक पृष्ठ शुद्ध करें (अधिकांश प्रणालियों पर प्रभावी रूप से # 1 के रूप में ही)
- ऐसे पृष्ठ को स्थानांतरित करें जो लंबे समय तक एक्सेस नहीं किया गया है - अधिमानतः कभी नहीं - स्वैप करने के लिए (यह वास्तव में लगातार भी हो सकता है, जरूरी नहीं कि बहुत अंतिम क्षण में)
- अपनी प्रक्रिया को मारें, या एक यादृच्छिक प्रक्रिया को मारें (OOM)
- कर्नेल पैनिक
विकल्प # 4 और # 5 बहुत अवांछनीय हैं और केवल तभी होगा जब ऑपरेटिंग सिस्टम के पास कोई अन्य विकल्प न हो। विकल्प # 1 और # 2 का मतलब है कि आप कुछ ऐसा फेंक देते हैं, जिसकी आपको संभवतः जल्द ही फिर से आवश्यकता होगी। यह प्रदर्शन पर नकारात्मक प्रभाव डालता है।
विकल्प # 3 का अर्थ है कि आप कुछ ऐसा स्थानांतरित करते हैं जो आपको (शायद) धीमी गति से भंडारण पर जल्द ही किसी भी समय की आवश्यकता नहीं है। यह ठीक है क्योंकि अब आपको जिस चीज़ की ज़रूरत है वह तेज़ रैम का उपयोग कर सकता है।
विकल्प # 3 को हटाकर, आपने ऑपरेटिंग सिस्टम को # 1 या # 2 करने के लिए प्रभावी रूप से सीमित कर दिया है। डिस्क से किसी पृष्ठ को पुनः लोड करना, इसे स्वैप से पुनः लोड करने के समान है, केवल स्वैप से पुनः लोड करने के अलावा आमतौर पर कम संभावना है (उचित पेजिंग निर्णय लेने के कारण)।
दूसरे शब्दों में, स्वैप को अक्षम करने से आप कुछ भी हासिल नहीं कर सकते हैं, लेकिन आप स्मृति अनुरोध से निपटने के लिए ऑपरेशन सिस्टम की उपयोगी विकल्पों की संख्या को सीमित कर देते हैं। जो नहीं हो सकता है , लेकिन बहुत संभवतः एक नुकसान हो सकता है (और कभी फायदा नहीं होगा)।
[संपादित करें]
mmap
मैनपेज के सावधान पाठक , विशेष रूप से इसका वर्णन MAP_NORESERVE
, एक और अच्छा कारण बताएंगे कि "पर्याप्त" भौतिक स्मृति के साथ एक सिस्टम पर भी स्वैप की आवश्यकता क्यों है:
"जब स्वैप स्थान आरक्षित नहीं है तो किसी को कोई शारीरिक मेमोरी उपलब्ध नहीं होने पर SIGSEGV मिल सकता है।"
- एक पल रुकिए, इसका क्या मतलब है?
यदि आप किसी फ़ाइल को मैप करते हैं, तो आप फ़ाइल की सामग्री को सीधे एक्सेस कर सकते हैं जैसे कि फ़ाइल किसी तरह, जादू से, आपके प्रोग्राम के एड्रेस स्पेस में। रीड-ओनली एक्सेस के लिए, ऑपरेटिंग सिस्टम को भौतिक मेमोरी के एक पृष्ठ से अधिक सिद्धांत की आवश्यकता नहीं होती है, जिसे आप हर बार अलग-अलग वर्चुअल पेज तक पहुँचने के लिए अलग-अलग डेटा के साथ फिर से खोल सकते हैं (दक्षता कारणों से, निश्चित रूप से ऐसा नहीं किया जाता है, लेकिन सिद्धांत रूप में आप भौतिक स्मृति के एक पृष्ठ के साथ डेटा के लायक टेराबाइट्स तक पहुंच सकते हैं)। अब अगर आप भीफ़ाइल मैपिंग के लिए लिखें? इस स्थिति में, ऑपरेटिंग सिस्टम में एक भौतिक पृष्ठ होना चाहिए - या स्वैप स्थान - जो लिखे गए प्रत्येक पृष्ठ के लिए तैयार है। डेटा को इधर-उधर रखने का कोई दूसरा तरीका नहीं है जब तक कि गंदे पन्नों की राइटबैक प्रक्रिया ने अपना काम नहीं किया है (जो कई सेकंड हो सकते हैं)। इस कारण से, ओएस आरक्षित (लेकिन जरूरी नहीं कि कभी कमिट करता है) स्वैप स्पेस है, इसलिए यदि आप कोई मैपिंग नहीं कर रहे हैं तो अप्रयुक्त लिख रहे हैं (अप्रयुक्त और सामान्य स्थिति) फिर इसकी गारंटी है कि यह अभी भी काम करेगा।
अब अगर अदला-बदली न हो तो क्या होगा? इसका मतलब है कि कोई स्वैप आरक्षित नहीं किया जा सकता है (डुह!), और इसका मतलब है कि जैसे ही कोई खाली भौतिक पृष्ठ नहीं बचे हैं, और आप एक पृष्ठ पर लिख रहे हैं, आपको अपनी प्रक्रिया के रूप में सुखद आश्चर्य प्राप्त हो रहा है एक विभाजन दोष, और शायद मारा जा रहा है।
[/ संपादित करें]
हालांकि, रैम के दो बार स्वैप करने की पारंपरिक सिफारिश बकवास है। हालांकि डिस्क स्थान सस्ता है, लेकिन यह इतना स्वैप करने का कोई मतलब नहीं है। जो कुछ सस्ता है उसे बर्बाद करना अभी भी बेकार है, और आप बिल्कुल नहीं चाहते हैं कि आकार में कई सैकड़ों मेगाबाइट्स (या बड़े) में लगातार और बाहर काम कर रहे हों।
कोई एकल "सही" स्वैप आकार नहीं है (उपयोगकर्ता और राय के रूप में कई "सही" आकार हैं)। मैं आमतौर पर RAM आकार की परवाह किए बिना एक निश्चित 512MiB असाइन करता हूं, जो मेरे लिए बहुत अच्छा काम करता है। इसके पीछे तर्क यह है कि 512MiB एक ऐसी चीज है जिसे आप हमेशा छोटी डिस्क पर भी खर्च कर सकते हैं। दूसरी ओर, कई गीगाबाइट स्वैप को जोड़ना बेहतर नहीं है। आप उनका उपयोग नहीं करने जा रहे हैं, सिवाय इसके कि कुछ गंभीर रूप से गलत हो रहा है।
SSD पर भी, स्वैप RAM (बस बैंडविड्थ और विलंबता के कारण) की तुलना में परिमाण धीमा करने का आदेश है, और जबकि यह स्वैप करने के लिए कुछ स्थानांतरित करने के लिए बहुत स्वीकार्य है कि शायद फिर से ज़रूरत नहीं होगी (यानी आपको सबसे अधिक संभावना नहीं होगी इसे फिर से स्वैप करना, इसलिए आपके उपलब्ध पृष्ठों के पूल को प्रभावी रूप से मुफ्त में बढ़ाया गया है), यदि आपको वास्तव में स्वैप की पर्याप्त मात्रा की आवश्यकता है (अर्थात, आपके पास एक एप्लिकेशन है जो उदाहरण के लिए 50GiB डेटासेट का उपयोग करता है), तो आप बहुत अधिक खो गए हैं।
एक बार जब आपका कंप्यूटर पृष्ठों के लायक गीगाबाइट में और बाहर स्वैप करना शुरू कर देता है, तो सब कुछ क्रॉल में चला जाता है। इसलिए, ज्यादातर लोगों के लिए (मेरे सहित) यह एक विकल्प नहीं है, और इतना स्वैप होने का कोई मतलब नहीं है।