Tasklet机制

概述:

**********tasklet是关于中断管理的,说白了,也就是当中断发生时,执行中断处理函数

**********tasklet是一个数据结构----------------->在<linux/interrupt.h>头文件中

struct tasklet_struct
{
	struct tasklet_struct *next;
	unsigned long state;
	atomic_t count;
	void (*func)(unsigned long);		//中断处理函数
	unsigned long data;			//传递给中断处理函数的参数
};

**********tasklet类似于定时器timer,但是,tasklet中断处理函数一直在中断时间运行,并且在调用tasklet的进程上下文上运行,也就是它们的运行都在同一CPU上(同一时刻只能一方能运行).

**********tasklet执行函数的执行,是不能够通过指定的时间来让它运行的,它的运行是由内核自己选择的时间来执行

Tasklet的使用步骤:

**********第一步:初始化tasklet

初始化的(宏)函数:

*****动态初始化

void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data);

*****静态初始化

DECLARE_TASKLET(name, func, data)

DECLARE_TASKLET_DISABLED(name, func, data);

**********第二步:调度tasklet执行,

/**
  *如果一个tasklet在它有机会运行前被再次调度,那么它只会运行一次
  *如果tasklet在运行中被调度,它在完成本次调度之后,会再次运行
  **/
void tasklet_schedule(struct tasklet_struct *t);

/**
  *调度高优先级的tasklet
  *当软件中断处理运行时,在其他软中断之前,它处理高优先级的tasklet
  **/
void tasklet_hi_schedule(struct tasklet_struct *t);
其他tasklet相关函数:
/**
  *禁止给定的tasklet
  *如果tasklet还在被tasklet_schedule调度,则此函数的执行将会在tasklet_schedule返回后执行
  **/
void tasklet_disable(struct tasklet_struct *t);


/**
  *禁止这个tasklet
  *不等待任何函数返回,就立即禁止这个tasklet
  **/
void tasklet_disable_nosync(struct tasklet_struct *t);



/**
  *使能一个之前被禁止的tasklet
  *如果tasklet已经被调度了,它会很快的运行
  *tasklet_enable和tasklet_disable必须成对匹配,因为内核跟踪tasklet的"禁止次数"
  **/
void tasklet_enable(struct tasklet_struct *t);


/**
  *杀死tasklet
  *当一个设备正在关闭或者模块被卸载时调用这个函数
  **/
void tasklet_kill(struct tasklet_struct *t);






















































































































































### Tasklet的工作原理与机制详解 #### 定义与初始化 `struct tasklet_struct` 是 Linux 内核中表示 tasklet 的结构体。此结构体包含了指向下一个 tasklet 结构的指针 `next`,状态标志位 `state` 和计数器 `count` 以及要调用的实际处理函数 `func` 及其参数 `data`[^3]。 为了创建一个新的 tasklet 并将其关联到指定的回调函数,可以使用宏 `DECLARE_TASKLET(name, func, data)` 来声明一个名为 name 的 tasklet 实例,并设置它的 handler 函数为 func,同时传递给它额外的数据作为参数 data[^5]。 ```c // 声明并初始化一个tasklet DECLARE_TASKLET(my_tasklet, my_tasklet_func, (unsigned long)&my_data); ``` #### 执行流程 当需要调度某个 tasklet 运行时,可以通过调用 `tasklet_schedule()` 或者直接操作底层接口来完成这一动作。如果当前 CPU 上还没有正在排队等待执行的任务,则新任务会被立即安排至本地 CPU 的 tasklet 向量链表头部;否则就追加到尾部以防止饥饿现象发生[^2]。 一旦软中断 TASKLET_SOFTIRQ 被触发,在对应的处理器核心上的所有已准备好被执行的常规优先级 tasklets 将依次得到服务——即由静态方法 `tasklet_action()` 处理这些待办事项列表中的每一项直至为空为止。 对于高优先级别的 HI_SOFTIRQ 类型而言也有类似的逻辑存在 (`tasklet_hi_action`) ,不过两者之间互不影响各自独立运作[^4]。 #### 状态管理 - **启用/禁用**: 使用原子整数类型的成员变量 `atomic_t count` 控制是否允许 tasklet 接受新的请求。只有当 `count` 设置为零的时候才意味着该实例处于活动可用的状态之下能够响应来自外界发起的新一轮计划指令。 - **同步控制**: 方法如 `void tasklet_disable(struct tasklet_struct *t)` 提供了一种手段使得我们可以安全地阻止某特定对象在未来一段时间内的任何进一步行动直到显式恢复其权限位置之前都不会再接受到来自外部环境所发出的操作命令。这期间如果有其他地方尝试启动已经被停用的目标实体那么将会陷入忙等循环之中直到先前那个已经存在的进程结束之后才会继续向前推进下去[^1]。 ```c // 禁用tasklet tasklet_disable(&my_tasklet); // ...做一些事情... // 恢复tasklet tasklet_enable(&my_tasklet); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值