admin 管理员组文章数量: 1184232
一文中,应用程序在while中通过read函数循环读取按键值,导致CPU使用率居高不下。本文使用阻塞式I/O方式进行按键的读取,并比较两种不同方式的CPU使用率,那么如何查看CPU使用率:
- 加载驱动后,使用后台模式(加‘&’)打开应用程序
- 使用 top 命令查看CPU使用率
1. 阻塞式I/O按键检测
阻塞访问是指当设备文件不可操作时,进程可进入休眠态,从而将CPU资源让出来;当设备文件可操作时,再唤醒进程;一般在中断函数里完成唤醒工作。Linux内核提供了等待队列来实现阻塞进程的唤醒工作,其使用方法如下:
- 等待队列头:若要在驱动中使用等待队列,需创建并初始化一个等待队列头
//等待队列头定义struct__wait_queue_head{
spinlock_t lock;structlist_head task_list;};/* 创建并初始化等待队列头 */typedefstruct__wait_queue_headwait_queue_head_t;init_waitqueue_head(wait_queue_head_t);- 等待队列项:每个访问设备的进程都是一个队列项
//等待队列项定义struct__wait_queue{
unsignedint flags;void*private;wait_queue_func_t func;structlist_head task_list;};/* 定义并初始化等待队列项 */typedefstruct__wait_queuewait_queue_t;DECLARE_WAITQUEUE(name, tsk);//参数name:等待队列项的名字//参数tsk:表示该等待队列项属于哪个任务(进程),一般为current,表示当前进程- 将队列项添加到等待队列头:设备不可访问时,将进程对应的等待队列项添加到等待队列头中,只有添加到等待队列头中后,进程才能进入休眠态
voidadd_wait_queue(wait_queue_head_t*q,wait_queue_t*wait)//参数q:等待队列项要加入的等待队列头//参数wait:要加入的等待队列项- 将队列项移除出等待队列头:设备可以访问后,将进程对应的等待队列项从等待队列头中移除
voidremove_wait_queue(wait_queue_head_t*q,wait_queue_t*wait)//参数q:要删除的等待队列项所处的等待队列头//参数wait:要删除的等待队列项- 等待唤醒:设备可以使用时,唤醒进入休眠态的进程
//可以唤醒处于TASK_INTERRUPTIBLE和TASK_U版权声明:本文标题:深度解析:如何减少CPU负担——阻塞式IO与循环检测策略比较 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1770818074a3537921.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论