设为首页 加入收藏

TOP

Linux 内核等待队列解析
2014-11-24 11:27:57 来源: 作者: 【 】 浏览:0
Tags:Linux 内核 等待 队列 解析

在阅读Tun驱动时看到,有一些类似 add_wait_queue 的函数,这些函数正是执行等待队列的相关操作,要说等待队列还得从内核进程调度说起,内核调度系统内进程,分配时间片,但是有些进程如从网卡中读数据,在网卡有数据到达之前进程处于阻塞状态,如果此时给相应进程分配时间片做调度,无疑是浪费系统资源,所以系统内每个进程都有自己的状态标志 task->state,这些状态定义于文件 include/linux/sched.h



内核只会调用标志是 TASK_RUNNING 的进程,如果需要等待资源,可以设置自己的进程标志为 TASK_INTERRUPTIBLE (可中断)或者 TASK_UNINTERRUPTIBLE (不可中断),然后调用 schedule();放弃CPU,此进程就不会被内核调度了,但随之而来的问题是,如果进程所需资源可以使用,如何唤醒进程呢,这就要依赖于等待队列了,进程在放弃控制权之前,把自己加入一个队列中,当所需条件满足,其他进程便可wakeup该队列,修改进程状态为 TASK_RUNNING,等待进程便可顺利往下执行了。


与等待队列相关的操作有如下几种:


结合这些函数,再往simple驱动里添加一些简单的机制支持等待。在 simple_read 函数中修改当前进程状态,加入等待队列后,放弃控制权,另加入 simple_write 函数唤醒队列。


加载模块 insmod simple.ko 后,使用cat读取数据,cat /dev/simple, 会发现进程处于等待状态,不会输出任何信息,新打开一个终端,输入echo “test” > /dev/simple执行写操作,cat便会输出数据,紧接着再次处于等待状态。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux 设备驱动轮询编程 下一篇Linux系统调用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C 内存管理 | 菜鸟教 (2025-12-26 20:20:37)
·如何在 C 语言函数中 (2025-12-26 20:20:34)
·国际音标 [ç] (2025-12-26 20:20:31)
·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)