一文中,应用程序在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

发布评论