मेरे प्रश्नों में से एक पर टिप्पणियों के बाद मुझे यह जानने के लिए उत्सुकता है कि जब कोई निष्पादन योग्य को ओवरराइट करता है तो क्या होता है। मुझे इस मामले पर मेरी समझ की जांच करनी है।क्या होता है जब आप मेमोरी-मैप किए गए निष्पादन योग्य को ओवरराइट करते हैं?
कहें कि मेरे पास /usr/bin/myprog
है। मैं इसे चलाता हूं और इसलिए ओएस /usr/bin/myprog
लोड करता है, शायद http://en.wikipedia.org/wiki/Memory-mapped_file#Common_uses के माध्यम से।
किसी भी कारण से यह प्रक्रिया स्मृति में बनी हुई है और मैं वास्तव में फैसला करता हूं कि मैंने एक बग तय कर लिया है और मैं /usr/bin/myprog
को ओवरराइट करता हूं।
तो, जहाँ तक मैं यह समझ के रूप में:
myprog
का एक उदाहरण पहले से ही भरी हुई है और मैं फ़ाइल जहाँ सेmyprog
पहले से ही लोड किया गया था की जगह,myprog
के कहने असंशोधित है।- यदि मैं
myprog
का नया उदाहरण चलाता हूं तो यह नया कोड उपयोग करेगा।
क्या मैं सही हूँ?
हालांकि, स्मृति-मैप की गई फ़ाइलों पर आलेख के अनुसार, ऐसी तकनीक एक डेवलपर को फ़ाइल के हिस्सों का इलाज करने की अनुमति देती है जैसे कि वे भौतिक स्मृति हैं।
तो मुझे चीजों को समझने में एक विरोधाभास दिखाई देता है। यदि पेज वास्तव में केवल मांग पर लोड होते हैं, तो myprog
मानते हैं कि 100% पेजेड नहीं है, तो यह विकिपीडिया लेख का तात्पर्य है कि नए पेज डिस्क पर फ़ाइल से लोड होंगे, जो मूल छवि लोड होने के बाद बदल गई है।
हालांकि, मुझे पूरा यकीन है कि मेरी दो संकलित छवियां समान नहीं होंगी और प्रत्येक फ़ाइल के लिए प्रासंगिक पता ऑफ़सेट समान नहीं हैं। तो, यह मानते हुए, निर्देश सूचक बहुत खोने जा रहा है ... मुझे पूरा यकीन है कि एक ऑपरेटिंग सिस्टम एक ही प्रक्रिया के हिस्से के रूप में स्मृति में दो अलग-अलग छवियों के हिस्सों को लोड नहीं करता है।
तो प्रोग्राम के निष्पादन के लिए मेमोरी-मैपिंग/मांग-पेजिंग का संयोजन कैसे काम करता है? क्या उस फ़ाइल को ओवरराइट करना प्रत्येक निष्पादन योग्य पृष्ठों पर पेज गलती को ट्रिगर करेगा ताकि यह सुनिश्चित किया जा सके कि यह वर्तमान में चल रही प्रक्रिया के लिए लोड हो गया है?
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
printf("Program resident...");
while(1)
{
printf("??? Just notifying you I'm still here...\n");
usleep(1000000);
}
return 0;
}
और यकीन है कि पर्याप्त मैं कर सकता है क) इस निष्पादन की जगह, जबकि यह चल रहा था और ख) इसके उत्पादन नहीं बदला गया है:
मैं इस के साथ त्वरित प्रयोग किया था।
तो क्या चल रहा है? मैं विशेष रूप से क्या करता हूं यह देखने के लिए मैं क्या कर सकता हूं (लिनक्स या विंडोज) के लिए किसी भी सुझाव की सराहना करता हूं।
धन्यवाद सब कुछ।
संपादित करें: इस सवाल का जो मैं बात कर रहे थे कि इस प्रश्न छिड़: Upgrades without reboot - what kinds of problems happen in practice?
इसके अलावा, मुझे पता है यह विशेष रूप से प्रोग्रामिंग से संबंधित नहीं है, लेकिन एक निष्पादन को अद्यतन करने के परिणाम। मुझे अभी भी दिलचस्पी है, और मैं इसे पूछने के लिए बेहतर जगह नहीं सोच सकता।
मैं देखता हूं। तो वास्तव में पैकेज प्रबंधक जानबूझकर प्रक्रिया के बारे में जानते हैं ... दिलचस्प। कुंआ। मुझे लगता है कि इसका जवाब टेड के जवाब के साथ संयुक्त है, अब मैं वास्तव में क्या होता है इसके बारे में बहुत कुछ जानता हूं। –
इसके लिए यह क्या है इसके लिए ओएस एक्स (और सामान्य रूप से बीएसडी) पर भी लागू होता है और पॉज़िक्स में अच्छी तरह से परिभाषित किया गया है, 'अनलिंक (2) 'देखें। – elslooo