2011-10-29 15 views
11

लिनक्स कार्य कतार प्रक्रिया संदर्भ के साथ कर्नेल स्तर धागे होने के लिए हैं। मैं इसे kthread के विकल्प के रूप में उपयोग करने की कोशिश कर रहा था जिसमें कोई विशिष्ट प्रक्रिया संदर्भ नहीं है। लेकिन मैं काम कतार में डेटा कैसे पास करूं? work_struct में एक डेटा फ़ील्ड है जो atomic_long_t प्रकार है। मैं इस क्षेत्र में सूचक पास नहीं कर सका। मैं यह कैसे करुं?लिनक्स वर्क कतार का उपयोग कैसे करें

इसके अलावा मुझे कार्य कतार का एक ठोस उदाहरण नहीं मिला। क्या आप एक सुझाव दे सकते हैं?

+3

एक उत्कृष्ट ब्लॉग उदाहरण के साथ सभी बुनियादी लिनक्स कर्नेल अवधारणा की व्याख्या: मैं सिर्फ देरी संस्करण जोड़ा http://tuxthink.blogspot.co.il/2011/09 /workqueues-1-introduction.html http://tuxthink.blogspot.co.il/2011/09/workqueue-2-declarework.html http://tuxthink.blogspot.co.il/2011/09/workqueue -3-उपयोग-रनटाइम-निर्माण.html – 0x90

उत्तर

16

यदि आप अपने काम कतार समारोह में डेटा पास करना चाहते हैं, तो बस अपनी खुद की डेटा संरचना के अंदर work_struct संरचना को एम्बेड करें और इसे पुनर्प्राप्त करने के लिए अपने कार्य फ़ंक्शन के अंदर container_of का उपयोग करें।

एक साधारण उदाहरण के लिए, कर्नेल इससे भरा है - बस git grep work_struct। आप एक साधारण उदाहरण के लिए drivers/cpufreq/cpufreq.c (handle_update फ़ंक्शन) देख सकते हैं। नीचे दिए गए आलेख के अंत में एक उदाहरण एम्बेड करता है, लेकिन यह container_of उपयोग नहीं करता है और बदले में तथ्य एक संरचना के पहले सदस्य अपनी मूल रूप में एक ही पता है कि पर निर्भर करता है:

http://www.ibm.com/developerworks/linux/library/l-tasklets/index.html

+0

धन्यवाद। यह काम करता है और आश्चर्यजनक रूप से सरल है। – max

+0

http://www.makelinux.net/ldd3/chp-7-sect-6 - यह एक दूसरे पढ़ने के लिए गोथ्रू (केवल कार्य कतार) –

0

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

के बारे में workqueue

worqueue नीचे आधा mechanishm, जहां काम का एक हिस्सा एक बीच में आता है सक्षम पर preemtion के साथ बाद में निष्पादित करने के लिए एक कर्नेल धागा को दिया जाता है व्यवधान से निपटने कर रहे हैं एक सरल विवरण। एक percpu थ्रेड इवेंट/n कर्नेल द्वारा बनाया गया है, थ्रेड को ड्राइवर कोड द्वारा भी बनाया जा सकता है। संरचना का उपयोग करने के लिए संरचना का एक महत्वपूर्ण पैरामीटर नाम फ़ील्ड है। इसमें एक प्रति सीपीयू संरचना भी शामिल है जिसमें मोड़ में वेटक्यू हेड होता है जिस पर थ्रेड इंतजार करता है और उस लिंक को जोड़ने के लिए एक लिंक सूची जो कार्य को परिभाषित करता है यानी कार्य और डेटा। कार्यकर्ता थ्रेड उस संरचना को इनपुट पैरामीटर के रूप में प्राप्त करता है। थ्रेड चलता है और किसी के लिए वेटकु्यू पर प्रतीक्षा करता है धागे को जगाने के लिए। फ़ंक्शन को परिभाषित करने के लिए एक कार्य संरचना बनाई गई है। जब वर्कक्यू शेड्यूल होता है, तो संरचना को लिंक सूची की पूंछ में जोड़ा जाता है और कार्यकर्ता थ्रेड जागृत हो जाता है। जागने पर, कार्यकर्ता थ्रेड प्रति सीपीयू संरचना में परिभाषित लिंक सूची के माध्यम से चलता है और कार्य संरचना के साथ परिभाषित कार्यों को पैरामीटर के रूप में परिभाषित करना प्रारंभ करता है। इसे निष्पादित करने के बाद लिंक सूची से प्रविष्टि को हटा दिया जाता है।

2

ऐसा लगता है जैसे हल हो गया है, और कार्य कतारों का उपयोग करने के तरीके को समझने के लिए आप मेरे लिए बहुत उपयोगी रहे हैं।मैंने तुम्हें अपनी GitHub में एक सरल उदाहरण से कुछ कोड दे, उम्मीद है कि यह किसी के लिए उपयोगी हो जाएगा:

https://github.com/m0r3n/kernel_modules/blob/master/workQueue.c

आप निम्न Makefile साथ संकलन कर सकते हैं:

KVERSION = $(shell uname -r) 
obj-m = workQueue.o 

all: 
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules 
clean: 
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean 

सम्मिलित मॉड्यूल द्वारा:

# sync; insmod workQueue.ko; sync 

और देख लॉग:

# tailf /var/log/kern.log 

संपादित करें:

https://github.com/m0r3n/kernel_modules/blob/master/workQueueDelayed.c

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