2011-10-29 9 views
11

Hàng đợi công việc của Linux có nghĩa là các luồng cấp hạt nhân có ngữ cảnh quy trình. Tôi đã cố gắng sử dụng nó như là một thay thế cho kthread mà không có bối cảnh quá trình cụ thể. Nhưng làm cách nào để chuyển dữ liệu vào hàng đợi công việc? work_struct có một trường dữ liệu thuộc loại atomic_long_t. Tôi không thể chuyển con trỏ đến trường này. Tôi phải làm nó như thế nào?Cách sử dụng Hàng đợi công việc của Linux

Ngoài ra, tôi không thể tìm thấy một ví dụ cụ thể về hàng đợi công việc. Bạn có thể đề nghị một?

+3

Một blog xuất sắc giải thích tất cả các khái niệm hạt nhân Linux cơ bản với các ví dụ: 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-using-runtime-creation.html – 0x90

Trả lời

16

Nếu bạn muốn chuyển dữ liệu vào chức năng hàng đợi công việc, chỉ cần nhúng cấu trúc work_struct bên trong cấu trúc dữ liệu của riêng bạn và sử dụng container_of bên trong chức năng công việc của bạn để truy xuất.

Ví dụ đơn giản, hạt nhân đầy - chỉ git grep work_struct. Bạn có thể xem drivers/cpufreq/cpufreq.c (handle_update chức năng) cho một ví dụ đơn giản. Các bài viết dưới đây cũng đồng thời nhúng một ví dụ ở cuối, nhưng nó không sử dụng container_of và thay vào đó dựa trên thực tế là thành viên đầu tiên của một cấu trúc có địa chỉ giống như mẹ của nó:

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

+0

Cảm ơn. Nó hoạt động và đáng kinh ngạc đơn giản. – max

+0

http://www.makelinux.net/ldd3/chp-7-sect-6 - gothrough này cho lần đọc thứ hai (Chỉ hàng đợi công việc) –

0

Theo mặc định chức năng làm việc được gọi với công việc được đánh thành tham số. Bên trong luồng, phần tử dữ liệu của cấu trúc có thể dễ dàng thu được. Cũng là một Gnurou, để truy cập nhiều dữ liệu hơn, cấu trúc công việc có thể được đặt bên trong một cấu trúc cụ thể thực hiện và sử dụng vùng chứa macro bên trong luồng tất cả dữ liệu có thể được truy cập.

Một mô tả đơn giản về workqueue

worqueue là ngắt xử lý nửa mechanishm dưới, nơi một phần của công việc được trao cho một sợi hạt nhân để thực hiện sau đó với preemtion trên một ngắt cho phép. Một sự kiện chủ đề percpu/n được tạo ra bởi hạt nhân, chủ đề cũng có thể được tạo ra bởi trình điều khiển mã.Một cấu trúc được sử dụng để xác định các chủ đề, một tham số quan trọng bên trong cấu trúc là trường name.It cũng chứa một cấu trúc CPU trong đó lần lượt chứa đầu waitqueue mà thread chờ đợi và một danh sách liên kết để thêm cấu trúc xác định công việc tức là chức năng và dữ liệu. Chuỗi công nhân nhận cấu trúc đó như tham số đầu vào. Chuỗi chạy và đợi trên waitqueue cho ai đó để đánh thức luồng. Một cấu trúc công việc được tạo ra xác định hàm. Khi workqueue là lịch biểu, cấu trúc được thêm vào đuôi của danh sách liên kết và chuỗi công nhân được đánh thức. Khi thức dậy, luồng công nhân chạy qua danh sách liên kết được xác định trong cấu trúc CPU và bắt đầu thực hiện các hàm được định nghĩa với cấu trúc công việc làm tham số. Sau khi thực hiện nó sẽ loại bỏ mục nhập từ danh sách liên kết.

2

Dường như đã được giải quyết và bạn đã rất hữu ích với tôi để hiểu cách sử dụng Hàng đợi công việc.Tôi cung cấp cho bạn một số mã của một ví dụ đơn giản trong github của tôi, hy vọng nó sẽ rất hữu ích cho bất cứ ai:

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

Bạn có thể biên dịch với các Makefile sau:

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 

Chèn module theo:

# sync; insmod workQueue.ko; sync 

Và xem các bản ghi:

# tailf /var/log/kern.log 

EDIT: Tôi chỉ cần thêm phiên bản chậm:

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