工作队列和tasklet
名称 | 描述 |
---|---|
中断上下文 | 1、不能发生睡眠或者延时等操作 |
进程上下文 | |
tasklet | 基于软中断实现的,因此是运行在软中断上下文 |
workqueue | 工作推后,交由一个内核线程去执行 由内核线程+链表+等待队列来实现的 唯一能在进程上下文运行的下半部实现的机制 |
内核线程与用户线程
区别:
clone->do_fork->copy_process(创建task_struct、thread_info结构及内核栈)->拷贝/共享打开的文件、文件系统信息、信号处理函数、进程地址空间
名称 | 描述 | |
---|---|---|
进程 | 普通进程使用的则是进程页表 active_mm=mm=不为空 | thread_info存在进程/线程的基本信息,伙伴系统分配 task_struct进程描述符,由slab分配器其分配 |
线程 | 线程也有自己独立的内核栈 每个线程都有自己的用户栈空间和寄存器,而用户堆仍然是所有线程共享的 多线程共享主线程的进程页表 | thread_info存在进程/线程的基本信息 task_struct进程描述符,由slab分配器其分配 |
内核线程 | 一种只运行在内核地址空间的线程 内核线程共享内核地址空间,同一份内核页表 active_mm不为NULL,mm=NULL |
普通进程与内核线程有如下区别:
内核线程只运行在内核态,而普通进程既可以运行在内核态,也可以运行在用户态;
内核线程只使用 3-4GB (假设为 32 位系统) 的内核地址空间(共享的),但普通进程由于既可以运行在用户态,又可以运行在内核态,因此可以使用 4GB 的虚拟地址空间。
完成量 completion
- 内核轻量级的同步机制,互斥常采用mutext和自旋锁
- 基于等待队列实现wait_queue_head_t wait
- 静态初始化:COMPLETION_INITIALIZER
- 动态初始化:init_completion
- PV操作:complete和wait_for_completion
spin_lock & spin_lock_irqsave
- spin_lock中断可打断,单核程序可能问题
- spin_lock_irq_save禁用了中断,单核也没关系