2015-02-05 11 views
6

जब मैं एक goroutine से सी कोड का आह्वान करता हूं, तो क्या यह किसी अन्य तरीके से अन्य goroutines के शेड्यूलिंग को प्रभावित करता है? मुझे पता है कि अगर मैं एरलांग में एनआईएफ कहता हूं, तो यह फ़ंक्शन लौटने तक अन्य (एरलांग) प्रक्रियाओं को अवरुद्ध करता है। गोलांग में यह मामला है? क्या सी कोड goroutines शेड्यूलर ब्लॉक करता है?सी कोड और goroutine शेड्यूलिंग

उत्तर

8

गो कोड से सी फ़ंक्शन को कॉल करने से अन्य goroutines चलने से नहीं रोका जाता है।

इसका शेड्यूलर पर असर पड़ता है। एक सी फंक्शन चलाने वाला गोरौटाइन GOMAXPROCS सीमा के विरुद्ध जरूरी नहीं है। यह GOMAXPROCS के खिलाफ गिनती शुरू कर देगा, लेकिन यदि सी फ़ंक्शन 20 सेकंड से अधिक समय तक अवरुद्ध हो गया है, तो सिस्मन पृष्ठभूमि गोरौटाइन चलता है, तो शेड्यूलर को चलाने के लिए तैयार होने पर एक और goroutine शुरू करने की अनुमति दी जाएगी। ये विवरण विशिष्ट गो संस्करण पर निर्भर करते हैं और परिवर्तन के अधीन हैं।

6

यह एक बहुत अच्छा सवाल है जिसके लिए मुझे कोड में छोड़कर फ्लाई पर कोई आधिकारिक बयान नहीं मिला। आधिकारिक दस्तावेज के किसी भी संकेत के लिए मुझे खुशी होगी।

जवाब नहीं, सीजीओ कॉल अनुसूचक को ब्लॉक नहीं करती है।

proccessor निम्नलिखित यह पता चला है कि आंतरिक रूप से जाओ goroutines के लिए जी का उपयोग करता है अच्छा है, एम मशीनों के लिए (धागे) के लिए

और पी। गोरोटाइन्स प्रोसेसर पर चलती हैं जो मशीनों पर चलती हैं।

एक सी समारोह कॉलिंग जी से के रूप में code documentation के अनुसार इस प्रकार काम करता है:

// To call into the C function f from Go, the cgo-generated code calls 
// runtime.cgocall(_cgo_Cfunc_f, frame), where _cgo_Cfunc_f is a 
// gcc-compiled function written by cgo. 
// 
// runtime.cgocall (below) locks g to m, calls entersyscall 
// so as not to block other goroutines or the garbage collector, 
// and then calls runtime.asmcgocall(_cgo_Cfunc_f, frame). 
// 
// runtime.asmcgocall (in asm_$GOARCH.s) switches to the m->g0 stack 
// (assumed to be an operating system-allocated stack, so safe to run 
// gcc-compiled code on) and calls _cgo_Cfunc_f(frame). 
// 
// _cgo_Cfunc_f invokes the actual C function f with arguments 
// taken from the frame structure, records the results in the frame, 
// and returns to runtime.asmcgocall. 
// 
// After it regains control, runtime.asmcgocall switches back to the 
// original g (m->curg)'s stack and returns to runtime.cgocall. 
// 
// After it regains control, runtime.cgocall calls exitsyscall, which blocks 
// until this m can run Go code without violating the $GOMAXPROCS limit, 
// and then unlocks g from m. 

entersyscall अनिवार्य रूप से क्रम है कि इस goroutine 'बाह्य' नियंत्रण में अब है, बस स्थिति है जब हम syscalls कर में की तरह कहता है कर्नेल के लिए। एक अन्य संभवतः उपयोगी बिट यह है कि g से m लॉक करना (ओएस थ्रेड में कोर्ग कॉलिंग गोरौटाइन लॉक करना) रनटाइम को एक नया ओएस थ्रेड आवंटित करने में सक्षम बनाता है (सैद्धांतिक रूप से GOMAXPROCS से अधिक)।

+1

कोई आधिकारिक दस्तावेज नहीं है कि "सी फंक्शन को कॉल करना अन्य goroutines को अवरुद्ध नहीं करता है" क्योंकि यह स्वाभाविक रूप से काम करना चाहिए। अगर यह इस तरह से काम नहीं करता है तो इसे दस्तावेज करना आवश्यक होगा। – iant

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