glibc 2.21 लिनक्स
nanosleep
सिस्टम कॉल करने के लिए अग्रेषित करता है।
ग्लिबैक अधिकांश लिनक्स डेस्कटॉप डिस्ट्रोज़ पर सी stdlib के लिए डिफ़ॉल्ट कार्यान्वयन है।
इसे कैसे खोजें: पहला पलटा है:
git ls-files | grep sleep
यह शामिल हैं:
sysdeps/unix/sysv/linux/sleep.c
और हम जानते हैं कि:
sysdeps/unix/sysv/linux/
लिनक्स बारीकियों में शामिल है।
उस फ़ाइल हम देखते हैं के शीर्ष पर:
/* We are going to use the `nanosleep' syscall of the kernel. But the
kernel does not implement the stupid SysV SIGCHLD vs. SIG_IGN
behaviour for this syscall. Therefore we have to emulate it here. */
unsigned int
__sleep (unsigned int seconds)
तो अगर आप टिप्पणियों पर भरोसा है, हम मूल रूप से किया जाता है।
तल में
:
weak_alias (__sleep, sleep)
जो मूल रूप से कहते हैं __sleep
== sleep
।समारोह का उपयोग करता है nanosleep
के माध्यम से:
result = __nanosleep (&ts, &ts);
greppingg के बाद:
git grep nanosleep | grep -v abilist
हम दिलचस्प घटनाओं की एक छोटी सूची मिलता है, और मुझे लगता है कि __nanosleep
में परिभाषित किया गया है: लाइन पर
sysdeps/unix/sysv/linux/syscalls.list
:
nanosleep - nanosleep Ci:pp __nanosleep nanosleep
है जो कुछ सुपर सूखी जादू प्रारूप द्वारा पार्स:
grep -r __nanosleep
करने के लिए हमें लीड:: /sysd-syscalls
है जो make-syscalls.sh
उत्पन्न करता है और शामिल हैं:
sysdeps/unix/make-syscalls.sh
फिर निर्माण निर्देशिका से
#### CALL=nanosleep NUMBER=35 ARGS=i:pp SOURCE=-
ifeq (,$(filter nanosleep,$(unix-syscalls)))
unix-syscalls += nanosleep
$(foreach p,$(sysd-rules-targets),$(foreach o,$(object-suffixes),$(objpfx)$(patsubst %,$p,nanosleep)$o)): \
$(..)sysdeps/unix/make-syscalls.sh
$(make-target-directory)
(echo '#define SYSCALL_NAME nanosleep'; \
echo '#define SYSCALL_NARGS 2'; \
echo '#define SYSCALL_SYMBOL __nanosleep'; \
echo '#define SYSCALL_CANCELLABLE 1'; \
echo '#include <syscall-template.S>'; \
echo 'weak_alias (__nanosleep, nanosleep)'; \
echo 'libc_hidden_weak (nanosleep)'; \
) | $(compile-syscall) $(foreach p,$(patsubst %nanosleep,%,$(basename $(@F))),$($(p)CPPFLAGS))
endif
यह मेकफ़ाइल का हिस्सा दिखता है। git grep sysd-syscalls
से पता चलता है कि यह शामिल है:
sysdeps/unix/Makefile:23:-include $(common-objpfx)sysd-syscalls
compile-syscall
महत्वपूर्ण हिस्सा की तरह लग रहा है, तो हम पाते हैं:
# This is the end of the pipeline for compiling the syscall stubs.
# The stdin is assembler with cpp using sysdep.h macros.
compile-syscall = $(COMPILE.S) -o [email protected] -x assembler-with-cpp - \
$(compile-mkdep-flags)
ध्यान दें कि -x assembler-with-cpp
एक gcc
विकल्प है। जैसे
यह #define
रों पैरामीटर:
#define SYSCALL_NAME nanosleep
और उसके बाद उन पर का उपयोग करें:
#include <syscall-template.S>
ठीक है, यह जहाँ तक मैं अब के लिए मैक्रो विस्तार खेल पर जाना होगा है।
मुझे लगता है कि यह posix/nanosleep.o
फ़ाइल उत्पन्न करता है जिसे सब कुछ के साथ एक साथ जोड़ा जाना चाहिए।
लिनक्स 4.2 x86_64 नैनोस्लीप syscall
अनुसूचक उपयोग करता है: यह एक व्यस्त नींद नहीं है।
खोजें ctags:
sys_nanosleep
kernel/time/hrtimer.c
करने के लिए हमें लीड: उच्च रिज़ॉल्यूशन टाइमर के लिए
SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
hrtimer
खड़ा है।वहां से मुख्य लाइन की तरह दिखता है:
hrtimer_nanosleep
do_nanosleep
set_current_state(TASK_INTERRUPTIBLE);
जो व्यवधान कारक नींद है
freezable_schedule();
जो schedule()
कॉल और अन्य प्रक्रियाओं को चलाने के लिए अनुमति देता है
hrtimer_start_expires
hrtimer_start_range_ns
- कार्यसूची: तक पहुँचने
arch/x86
समय स्तर
इसके बारे में कुछ लेख:
आईआईआरसी, 10ms लिनक्स प्रक्रियाओं के लिए एक सामान्य टाइमलाइस है। लिनक्स इसकी तुलना में बेहतर टाइमर सटीकता प्राप्त करने के लिए 10ms टाइम्सलाइस के बीच में प्रक्रियाओं को पूर्व-खाली कर सकता है। (लिनक्स को पूर्व-उत्सर्जन लागू करने से पहले, कुछ लोगों ने 1 एमएमएस जेफी प्राप्त करने के लिए 'एचजेड = 100' के बजाय' एचजेड = 1000' के साथ अपने कर्नेल को संकलित किया। उदाहरण के लिए, http://serverfault.com/questions/377947/1000- एचजे-लिनक्स-कर्नेल-जरूरी-अगर-मैं-टिक-रहित और उच्च-रिज़ॉल्यूशन-टाइमर। मल्टी-कोर CPUs ने इसे बहुत कम महत्वपूर्ण बना दिया है, क्योंकि एसएमपी के लिए आवश्यक लॉकिंग पूर्व-उत्सर्जन को बहुत सस्ता बनाती है और अक्सर एक नि: शुल्क कोर –
होता है यह एक अच्छी प्रतिक्रिया है लेकिन पाठक को यह भी समझना चाहिए कि सिर्फ इसलिए कि आप सोने की कतार में हैं, आप उस समय तक बाध्य नहीं हैं जब आपने पूछा था। उदाहरण के लिए, यदि आपने सदस्यता ली है एक सिग्नल और सिग्नल नींद की कतार में आता है, प्रक्रिया जल्द ही सीपीयू समय वापस प्राप्त कर सकती है। I/O प्रतीक्षा घटनाओं (चयन ...) का समान प्रभाव होता है। EINTR त्रुटि देखें जो लिनक्स नींद वापस आ सकती है। – Eric