यह थोड़ा सा विषय शुरू करता है (और फिर मैं इसे आपके प्रश्न में जोड़ दूंगा), लेकिन क्या हो रहा है जब आप लिनक्स में एक प्रक्रिया को फोर्क करते हैं तो क्या होता है। जब फोर्किंग एक प्रतिलिपि है जिसे प्रतिलिपि पर कॉपी कहा जाता है जो स्मृति को भी लिखा जाता है जब नई प्रक्रिया के लिए केवल स्मृति स्थान की प्रतिलिपि बनाता है। इस तरह अगर फोर्कड प्रोसेस निष्पादन तुरंत एक नया प्रोग्राम है तो आपने मूल प्रोग्राम मेमोरी की प्रतिलिपि बनाने के ओवरहेड को सेव किया है।
अपने प्रश्न पर वापस आना, विचार समान है। जैसा कि अन्य ने इंगित किया है, स्मृति का अनुरोध करने से आपको तुरंत वर्चुअल मेमोरी स्पेस मिल जाता है, लेकिन वास्तविक पृष्ठ केवल उन्हें लिखते समय आवंटित किए जाते हैं।
इसका उद्देश्य क्या है? यह मूल रूप से मैलोकिंग मेमोरी को बिग ओ (एन) ऑपरेशन के बजाय बिग ओ (1) की तुलना में कम या अधिक स्थिर समय ऑपरेशन बनाता है (जिस तरह से लिनक्स शेड्यूलर इसे एक बड़े हिस्से में करने के बजाए इसे बाहर कर देता है)।
प्रदर्शित करने के लिए मैं क्या मतलब है मैं निम्नलिखित प्रयोग किया:
[email protected]s-desktop:~/test_code$ time ./bigmalloc
real 0m0.005s
user 0m0.000s
sys 0m0.004s
[email protected]:~/test_code$ time ./deadbeef
real 0m0.558s
user 0m0.000s
sys 0m0.492s
[email protected]:~/test_code$ time ./justwrites
real 0m0.006s
user 0m0.000s
sys 0m0.008s
bigmalloc कार्यक्रम 20 मिलियन ints आबंटित करता है, लेकिन उनके साथ कुछ भी नहीं है। डेडबीफ 1 9 51 में लिखने वाले प्रत्येक पृष्ठ के लिए एक int लिखता है और लिखता है और लिखता है 1 9 31 के इनट्स को आवंटित करता है और उन्हें शून्य करता है। जैसा कि आप देख सकते हैं कि डेडबीफ को bigmalloc से निष्पादित करने के लिए लगभग 100 गुना अधिक समय लगता है और केवल लिखने से 50 गुना लंबा होता है।
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = malloc(sizeof(int)*20000000); // allocate 80 million bytes
return 0;
}
।
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = malloc(sizeof(int)*20000000); // allocate 80 million bytes
// immediately write to each page to simulate all at once allocation
// assuming 4k page size on 32bit machine
for (int* end = big + 20000000; big < end; big+=1024) *big = 0xDEADBEEF ;
return 0;
}
।
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = calloc(sizeof(int),19531); // number of writes
return 0;
}
स्रोत
2009-05-14 18:46:38
विंडोज़ के लिए समान है? – TStamper
मैं विंडोज़ से क्या परिचित नहीं हूं, क्षमा करें। – bdonlan
bdonlan: सही है, लेकिन वह प्रभाव का कांटा के लिए बाहर देखना चाहिए "। * बच्चे अपने माता-पिता की स्मृति ताले वारिस नहीं करता है (mlock (2), mlockall (2)) " कौन कैसे सबसे एप्लिकेशन के लोड हो जाएगा जब वह शीर्ष पर देख रहा है – RandomNickName42