对jiq中一段程序以及prepare_to_wait的理解
来源:互联网 发布:数据挖掘预测算法 编辑:程序博客网 时间:2024/05/18 19:20
其中一个程序的代码如下:
static int jiq_read_wq(char *buf, char **start, off_t offset,
int len, int *eof, void *data)
{
DEFINE_WAIT(wait);
jiq_data.len = 0; /* nothing printed, yet */
jiq_data.buf = buf; /* print in this place */
jiq_data.jiffies = jiffies; /* initial time */
jiq_data.delay = 0;
prepare_to_wait(&jiq_wait, &wait, TASK_INTERRUPTIBLE);
printk(KERN_ALERT "work qian is %4li/n",jiffies);
schedule_work(&jiq_work);
printk(KERN_ALERT "work hou is %4li/n",jiffies);
schedule();
printk(KERN_ALERT "schedule hou is %4li/n",jiffies);
finish_wait(&jiq_wait, &wait);
*eof = 1;
return jiq_data.len;
}
其中还有一个用于唤醒if (len > LIMIT) {
printk(KERN_ALERT "jiffies of len wake_up is %4li/n",jiffies);
wake_up_interruptible(&jiq_wait);
return 0;
}
还有一个初始化INIT_WORK(&jiq_work, jiq_print_wq, &jiq_data);
我的理解如下:
1 首先在初始化时由INIT_WORK(&jiq_work, jiq_print_wq, &jiq_data)初始化一个工作队列。这个队列并提交给内核由一个单独的线程去管理。
2 程序按照这个步骤执行
prepare_to_wait(&jiq_wait, &wait, TASK_INTERRUPTIBLE);
printk(KERN_ALERT "work qian is %4li/n",jiffies);
schedule_work(&jiq_work);
printk(KERN_ALERT "work hou is %4li/n",jiffies);
其中要说明的是prepare_to_wait的作用是把该进程标记为TASK_INTERRUPTIBLE,并添加到等待队列中。(通过实验知道,程序并不会在这里停下来,不知道理解的对不对)
schedule_work(&jiq_work);使工作队列起作用。
3 程序继续执行
schedule();
printk(KERN_ALERT "schedule hou is %4li/n",jiffies);
finish_wait(&jiq_wait, &wait);
程序通过schedule();调度另一个程序运行。另一个程序通过唤醒当前的这个程序,然后到finish_wait结束。
通过实验知道程序会在schedule();处停住。不知道对不对。只有继续看书,以后在理解了。
挂起的进程并不会自动转入运行的,因此,还需要一个唤醒动作,这个动作由wake_up_interruptible()完成,它将遍历作为参数传入的 log_wait等待队列,将其中所有的元素(通常都是task_struct)置为运行态,从而可被调度到,执行 __wait_event_interruptible()中的代码。
static int jiq_read_wq(char *buf, char **start, off_t offset,
int len, int *eof, void *data)
{
DEFINE_WAIT(wait);
jiq_data.len = 0; /* nothing printed, yet */
jiq_data.buf = buf; /* print in this place */
jiq_data.jiffies = jiffies; /* initial time */
jiq_data.delay = 0;
prepare_to_wait(&jiq_wait, &wait, TASK_INTERRUPTIBLE);
printk(KERN_ALERT "work qian is %4li/n",jiffies);
schedule_work(&jiq_work);
printk(KERN_ALERT "work hou is %4li/n",jiffies);
schedule();
printk(KERN_ALERT "schedule hou is %4li/n",jiffies);
finish_wait(&jiq_wait, &wait);
*eof = 1;
return jiq_data.len;
}
其中还有一个用于唤醒if (len > LIMIT) {
printk(KERN_ALERT "jiffies of len wake_up is %4li/n",jiffies);
wake_up_interruptible(&jiq_wait);
return 0;
}
还有一个初始化INIT_WORK(&jiq_work, jiq_print_wq, &jiq_data);
我的理解如下:
1 首先在初始化时由INIT_WORK(&jiq_work, jiq_print_wq, &jiq_data)初始化一个工作队列。这个队列并提交给内核由一个单独的线程去管理。
2 程序按照这个步骤执行
prepare_to_wait(&jiq_wait, &wait, TASK_INTERRUPTIBLE);
printk(KERN_ALERT "work qian is %4li/n",jiffies);
schedule_work(&jiq_work);
printk(KERN_ALERT "work hou is %4li/n",jiffies);
其中要说明的是prepare_to_wait的作用是把该进程标记为TASK_INTERRUPTIBLE,并添加到等待队列中。(通过实验知道,程序并不会在这里停下来,不知道理解的对不对)
schedule_work(&jiq_work);使工作队列起作用。
3 程序继续执行
schedule();
printk(KERN_ALERT "schedule hou is %4li/n",jiffies);
finish_wait(&jiq_wait, &wait);
程序通过schedule();调度另一个程序运行。另一个程序通过唤醒当前的这个程序,然后到finish_wait结束。
通过实验知道程序会在schedule();处停住。不知道对不对。只有继续看书,以后在理解了。
挂起的进程并不会自动转入运行的,因此,还需要一个唤醒动作,这个动作由wake_up_interruptible()完成,它将遍历作为参数传入的 log_wait等待队列,将其中所有的元素(通常都是task_struct)置为运行态,从而可被调度到,执行 __wait_event_interruptible()中的代码。
- 对jiq中一段程序以及prepare_to_wait的理解
- 对ldd3 中jiq程序的一点笔记
- 一段代码对C++的理解
- 我对一段程序的理解,望大家指教 (对象返回值)
- java程序中对堆栈的理解
- 对程序中“注入”术语的理解
- android中关于对线程池的理解以及操作
- 对JavaEE中mvc模式以及三层架构的理解
- 我对Java中HashMap以及treeMap的理解
- 检验对finally理解是否透彻的一段代码
- JAVA程序开发中对MVC的个人理解
- [深入理解JVM虚拟机]一段程序的解读
- LotusScript 一段对字符串前后做修改的程序
- 对程序注释的理解
- 对小程序的理解以及开发过程中的一些体会
- 对ROS文件系统的理解以及在ROS下编写第一个程序
- 由读《深入理解计算机系统》一书引发对程序本质的探讨以及自己的一些理解
- 一段简单的程序
- (转载)《The New Methodology》
- (转载)Agile方法研究综述
- (转载)微软SharePoint产品开发过程
- 开场白
- (转载)Microsoft 体系结构概述
- 对jiq中一段程序以及prepare_to_wait的理解
- linux桌面切换
- (转载)微软解决方案框架与成熟度模型
- FDD 功能驱动开发模式
- (转载)迭代开发的新思想
- (转载)现实中的软件工程
- DSDM业务中心框架开发方法(一)
- Daily Meeting
- DSDM业务中心框架开发方法(二)