2009-04-03 16 views
21

क्या किसी प्रक्रिया को रोकना संभव है, स्मृति सामग्री को किसी फ़ाइल में सहेजना संभव है, और उसके बाद फ़ाइल को फिर से लोड करें ताकि आप प्रोग्राम जारी रख सकें?बाद में उपयोग के लिए एक प्रक्रिया 'स्मृति सहेजें?

संपादित मैं इस बारे में पढ़ कर दिया गया है:

http://en.wikipedia.org/wiki/Setcontext

यह struct की सामग्री को डंप, और किसी भी तरह एक ही स्मृति क्षेत्रों के आवंटन के लिए malloc मजबूर करने के लिए संभव है?

+0

क्रयोपिड ने लिनक्स पर कर्नेल को संशोधित किए बिना ऐसा करने की अनुमति दी। – user2284570

उत्तर

16

तकनीकी रूप से यह संभव है, लेकिन इसके लिए सभी सिस्टम-आवंटित संसाधनों को भी सहेजने की आवश्यकता होगी - उदाहरण के लिए फ़ाइल desciptors और फिर उन्हें बहाल करना। तो यह एक चुनौतीपूर्ण काम है।

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

+0

और वीएमवेयर सुनिश्चित करता है कि नेटवर्क इंटरफेस जैसे अन्य संसाधन ठीक से पुनरारंभ किए जाते हैं। –

+0

यह न केवल चुनौतीपूर्ण है, बल्कि, सामान्य रूप से, असंभव है। Http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg

+0

@GSerg देखें, यह लिंक पूर्ववत करता है कि प्रक्रिया के बाहर संसाधन हाइबरनेटेड होने पर रिलीज़ हो जाएंगे। ऐसा किसी ऐसे परिस्थिति में नहीं होना चाहिए जहां प्रक्रिया को अभी-अभी चलने वाली कतार पर नहीं रखा गया है और यह पता स्थान को पूर्व-प्रक्रिया संसाधनों को छोड़ दिए बिना डिस्क पर भेजा गया है। – paxdiablo

0

वर्कफ़्लो फाउंडेशन .NET 3.0 और उच्चतर वर्कफ़्लो को रोकने और पुनरारंभ करने की अनुमति देता है।

2

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

यह एक लिनक्स कर्नेल मॉड्यूल :-)

1

यह असंभव जा रहा है जब मूल कोड के साथ काम की बात करने के गन्दा के रूप में एक अच्छा परियोजना हो सकता है sharptooth के रूप में उल्लेख है।

हालांकि, कुछ प्रोग्राम (उदाहरण के लिए, iirc emacs) ने विन्यास फाइलों से निपटने के बजाय कॉन्फ़िगरेशन को संरक्षित करने के लिए "अपनी खुद की मेमोरी डंप" चाल का उपयोग किया है। यह विंडोज पर काम नहीं करता है, हालांकि, चूंकि एक्जिक्यूटिव इनकार-लिखने वाले शेयर मोड में चलाए जाते हैं। लेकिन यह लिनक्स या डॉस पर एक प्यारा (हालांकि खतरनाक) चाल है :)

6

इसे आमतौर पर persistent continuation कहा जाता है। स्मॉलटाक और एसबीसीएल जैसी कुछ भाषाओं में निरंतर निरंतरता के लिए प्रथम श्रेणी का समर्थन है। ज्यादातर भाषाएं नहीं होती हैं।

+0

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

+0

@sth कुछ स्मॉलटाक रनटाइम्स और एसबीसीएल केवल उन्हीं क्षणिक लोगों का समर्थन करते हैं जो आप सोच रहे हैं। –

4

अपनी आवश्यकताओं और ओएस आप gdb में से वापस दूसरे को एक core dump

मैं वास्तव में कभी लोड हो रहा है की कोशिश की है एक कोर फेंक दिया कार्यक्रम के लिए मजबूर की कोशिश कर सकते पर निर्भर करता है। ऐसा लगता है कि आपके द्वारा खोले गए किसी भी फाइल या किसी भी अन्य राज्य की तरह जो आपके प्रोग्राम मेमोरी में नहीं है, उतनी ही तेज हो जाएगी जितनी तेज रफ्तार से निकलती है।

एक अन्य दृष्टिकोण बस आपके प्रोग्राम में डिस्क की आवश्यकता वाले राज्य को क्रमबद्ध कर देगा। यह बेकार है लेकिन यह शायद सबसे विश्वसनीय तरीका है जब तक कि आप प्रोग्राम के निष्पादन को निलंबित करने में संतुष्ट न हों। यह आपके ऑपरेटिंग सिस्टम की थ्रेड लाइब्रेरी के साथ किया जा सकता है। या एक पोस्टर के रूप में आपके खोल के साथ इंगित किया।

0

रेमंड चेन explains यह असंभव क्यों है। जाहिर है, सभी माइक्रोसॉफ्ट इंजीनियरों ने इसे पढ़ा नहीं है, क्योंकि विजुअल स्टूडियो कंपाइलर हेडर्स को प्रीकंपलिंग करते समय ऐसा करता है। हेडर को पहली बार संकलित करने के बाद यह अपने राज्य को डंप करता है, और खुद को जारी रखने के लिए बहाल करता है।

+1

श्री चेन सही और गलत है। बाहरी प्रक्रिया संसाधन गायब होने पर यह केवल असंभव है। ऐसा नहीं होना चाहिए। आउट-ऑफ-प्रोसेस संसाधनों को संरक्षित करते समय आप पूरी तरह से प्रक्रिया को रोक सकते हैं - जाहिर है कि रीबूट से बच नहीं पाएगा, लेकिन यह जरूरी नहीं है कि यहां क्या चाहिए। – paxdiablo

+0

कुछ CPU-गहन काम करते समय पूरी तरह से एक घंटे तक प्रक्रिया को रोकने की क्षमता अभी भी मूल्यवान है। फिर आप बस उस प्रक्रिया को पुनरारंभ करें। सिगस्टॉप/सिगकॉन्ट पहले ही यूनिक्स एट अल पर ऐसा करता है। – paxdiablo

+0

दरअसल, इसके लिए निष्क्रिय होने की प्राथमिकता को कम करना पर्याप्त है। अंतिम कोर के अंतिम कुछ% का उपयोग करने में कोई हानि नहीं, कई समांतर एल्गोरिदम पूरे ऑपरेशन पर पूर्ण समांतरता को बनाए नहीं रख सकते हैं - खासकर पेड़ों के साथ। – MSalters

1

से "Persist (hibernate!) a process state to disk for quiker loading" (sic) उद्धरण:

प्रक्या आप इस बारे में और बता सकते हैं कि यह स्वैप कैसे काम करता है ताकि प्रक्रिया स्थिति डिस्क में सहेजी जा सके और आवश्यक होने पर पुन: उपयोग किया जा सके? "

ए। यह बहुत आसान है। पृष्ठ फ़ाइल डिस्क पर एक विशेष स्थान है जहां निष्क्रिय प्रक्रियाएं हैं अत्यधिक अनुकूलित रास्ते में जमा हो। इस तरह के चल रही प्रक्रिया को शुरू करता है, सिस्टम स्वतः इसे वापस स्मृति में पढ़ता है और यह सिर्फ जहां यह था से जारी है। यह कैसे कार्यक्रमों :) आईपैड पर

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

दूसरे शब्दों में, विंडोज़ में पहले से ही पृष्ठ फ़ाइल में प्रक्रिया को हाइबरनेट करने की क्षमता है। रेमंड चेन से @MSalters उद्धरण "explaining why its impossible" बस गलत है।

+1

ध्यान दें कि एक पेजेड-आउट प्रक्रिया के लिए बहीखाता अभी भी रैम (कर्नेल) में मौजूद है। इसकी खिड़की हैंडल वैध रहते हैं; आप इसे संदेश भेज सकते हैं जो इसे पृष्ठ पर वापस ले जाएगा, इसलिए यही कारण है कि इसे आम तौर पर प्रक्रिया हाइबरनेशन नहीं माना जाता है। – MSalters