2009-12-07 26 views
10

में शामिल ओवरहेड क्या होता है कई बार मैं तर्क को पढ़ता/सुनता हूं कि बहुत से सिस्टम कॉल इत्यादि अक्षम होते हैं क्योंकि एप्लिकेशन एक मोड स्विच करता है यानी उपयोगकर्ता मोड से कर्नेल मोड में जाता है और निष्पादन के बाद सिस्टम कॉल फिर से मोड स्विच करके उपयोगकर्ता मोड में निष्पादन करना शुरू कर देता है।मोड स्विच

मेरा प्रश्न यह है कि एक मोड स्विच का ओवरहेड क्या है? क्या सीपीयू कैश अमान्य हो जाता है या टीएलबी प्रविष्टियां फिसल जाती हैं या क्या होता है जो ओवरहेड का कारण बनता है?

कृपया ध्यान दें कि मैं मोड स्विच में शामिल ओवरहेड के बारे में पूछ रहा हूं, संदर्भ संदर्भ नहीं। मुझे पता है कि मोड स्विच और संदर्भ स्विच दो अलग-अलग चीजें हैं और मैं संदर्भ स्विच से जुड़े ओवरहेड के बारे में पूरी तरह से अवगत हूं, लेकिन मुझे समझने में असफल रहा है कि मोड स्विच द्वारा ओवरहेड क्या होता है?

तो इसके संभावित Linux, FreeBSD, सोलारिस आदि जैसे किसी विशेष * nix मंच के बारे में कुछ जानकारी प्रदान करें

सादर

लाली

उत्तर

8

कोई सीपीयू कैश या एक पर TLB फ्लश किया जाना चाहिए सरल मोड स्विच।

एक त्वरित परीक्षण मुझे बताता है कि, मेरे लिनक्स लैपटॉप पर एक साधारण साइस्कॉल को पूरा करने के लिए एक उपयोगकर्ता स्पेस प्रक्रिया के लिए लगभग 0.11 माइक्रोसॉन्ड लेता है जो कर्नेल मोड और पीछे स्विच के अलावा काम की एक महत्वपूर्ण राशि करता है। मैं getuid() का उपयोग कर रहा हूं, जो केवल इन-मेमोरी स्ट्रक्चर से एक पूर्णांक की प्रतिलिपि बनाता है। strace पुष्टि करता है कि syscall MAX बार दोहराया जाता है।

#include <unistd.h> 
#define MAX 100000000 
int main() { 
    int ii; 
    for (ii=0; ii<MAX; ii++) getuid(); 
    return 0; 
} 

यह मेरा लैपटॉप, time ./testover का उपयोग कर मापा पर के बारे में 11 सेकंड लेता है, और 11 सेकंड विभाजित 100 मिलियन आप 0.11 माइक्रोसेकंड देता द्वारा।

तकनीकी रूप से, यह दो मोड स्विच है, इसलिए मुझे लगता है कि आप दावा कर सकते हैं कि एक मोड स्विच 0.055 माइक्रोसॉन्ड लेता है, लेकिन एक तरफा स्विच बहुत उपयोगी नहीं है, इसलिए मैं वहां और पीछे की संख्या पर विचार करता हूं अधिक प्रासंगिक होने के लिए।

1

x86 CPUs (जिसे मैं यहां मान रहा हूं) पर मोड स्विच करने के कई तरीके हैं। फ़ंक्शन नामक उपयोगकर्ता के लिए, सामान्य तरीका टास्क कूद या कॉल करना है (टास्क गेट्स और कॉल गेट्स के रूप में जाना जाता है)। इनमें से दोनों में एक टास्क स्विच (एक संदर्भ स्विच के बराबर) शामिल है। कॉल से पहले प्रसंस्करण का थोड़ा सा हिस्सा, कॉल के बाद मानक सत्यापन, और वापसी। यह कम से कम एक सुरक्षित मोड स्विच के लिए राउंड अप करता है।

एरिक के समय के लिए, मैं एक लिनक्स विशेषज्ञ नहीं हूं, लेकिन अधिकांश ओएस में मैंने निपटाया है, सरल प्रणाली इस ओवरहेड से बचने के लिए उपयोगकर्ता स्थान में कैश डेटा (अगर इसे सुरक्षित रूप से किया जा सकता है) कॉल करता है। और मुझे ऐसा लगता है कि एक डेटायूड() इस तरह के डेटा कैशिंग के लिए एक प्रमुख उम्मीदवार होगा। इस प्रकार एरिक का समय किसी और चीज की तुलना में उपयोगकर्ता स्थान में प्री-स्विच प्रोसेसिंग के ऊपरी हिस्से का प्रतिबिंब हो सकता है।

+1

कोई डेटा कैशिंग नहीं हो रहा है; यही कारण है कि मैंने यह सत्यापित करने के लिए स्ट्रेस का इस्तेमाल किया कि सिस्टम कॉल हो रहा है। परिभाषा के अनुसार एक syscall, कर्नेल अंतरिक्ष में एक कॉल है। –

+1

इसके अलावा, आपका दावा है कि एक मोड स्विच एक संदर्भ स्विच के बराबर है, यह सच नहीं है। एक संदर्भ स्विच में पूरे सीपीयू राज्य और पेज टेबल को स्वैप करना शामिल है; यह महत्वपूर्ण काम है जो सिस्टम कॉल के लिए आवश्यक नहीं है। एक सिस्कल एक साधारण सॉफ़्टवेयर बाधा है (x86 असेंबली "int $ 0x80") –

+0

तो सिस्कोल में केवल एक प्रस्तावना और एक आईएनटी निर्देश है? – Juice

संबंधित मुद्दे