2.2.2 在阅读《深刻Linux内核架构与底层原理》 做者:刘京洋 韩方,发现一些错误,有些本身的理解,特以此记录linux
一、工做队列(workqueue)数据结构
队列是一种能够先进先出的数据结构,经常用来将一些工做任务缓冲的状况中。在linux下的workqueue能够用来处理内核中的任务链。架构
linux内核有workqueue,用户能够实现本身的workqueue,若是须要workqueue时,都临时建立,会致使系统开销大,为了减小开销,内核使用了workqueue的线程池的技术,将建立好的workqueue,应用完毕后,返回到线程池中,须要新workqueue时,先看池里,若是有则直接使用,不然再新建,避免了频繁的workqueue的建立和销毁。经过这种动态绑定workqueue的机制就是cwmq(Concurrency Managed Workqueue)函数
见原书上p37页,感受排版形成的问题很多阿 spa
1 #include <linux/module.h> 2 #include <linux/init.h> 3 #include <linux/workqueue.h> 4 5 static struct workqueue_struct *queue = NULL; 6 static struct workqueue_struct work; 7 8 static void work_handler(struct work_struct *data){ 9 printk(KERN_ALERT "work hadler\n"); 10 } 11 12 static init __initqueue_init(void){ 13 queue = create_singlethread_workqueue("Hello world"); 14 INIT_WORK(&work, work_handler); 15 schedule_work(&work); 16 17 return 0; 18 } 19 20 static void __exit queue_exit(void){ 21 destroy_workqueue(queue); 22 } 23 24 MODULE_LICENSE("GPL"); 25 module_init(queue_init); 26 module_exit(queue_exit);
二、中断系统和tasklet线程
Linux下中断分为3个层次,code
一、最低层次是在linux kernel源码的arch目录下与硬件有关的代码下,个人是在/linux-4.20.6/arch/x86/include/asm/irq_vectors.h,这个文件定义了一些硬件中断号,直接完成硬件的映射blog
二、中层是do_IRQ函数,根据下层传来的中断号查找中断函数、处理CPU访问和中断重入等队列
三、上层是直接调用真实的中断处理函数源码
tasklet主要用于专用中断,不能阻塞,耗时长的操做都有tasklet在上下文以外调度执行,经常使用软中断实现。