分析构建服务程序时,select过度消耗资源的原因。

对于设备驱动的编写者来说,我们经常要告诉应用程序设备的状态,也就是说经常要 告诉应用程序我们是否有数据已经准备好了。Linux在这个问题上面没有windows处理得好,它得消息处理机制并不完善,应用程序通常只能使用 read/write/ioctl等方法调用进入驱动程序,如果驱动程序没有数据就阻塞进程,否则就返回相应得数据。但是,如果应用程序同时要服务多个硬 件,就不能被一个设备挂起。这就要实现为异步得方式,有数据的返回数据,没有数据就返回0或者-1等方法,然后应用程序就不断得读取来对硬件进行操作。这 样的话,应用程序就每隔一段时间去读各个文件,然后判断是否由数据,如果没有就继续sleep。这样写得程序结构不清晰,而且反复的sleep会使得系统 效率降低。

对于这个问题,Linux提供了一个另外一个方法,那就是poll(select)驱动例程。 poll(select)驱动例程由操作系统每隔一个固定的时间间隔调用一次(多少个时钟周期),如果poll返回1,就说明可以操作,就在相应的位置 1,然后唤醒相应的执行select等待的进程。需要同时服务多个硬件的应用程序就把多个设备文件放到一个select_table当中,然后呼叫 select系统调用,改系统调用会进入阻塞队列,直到select_table中至少有一个文件进入可操作状态为之。

对于驱动程序的poll(select)方法比较简单

int (*select) (struct inode * ,struct file *, int ,select_table *);

判断第三个参数的值是表示的写操作、读操作还是异常操作,如果是写操作,就看看当前是否可以写,如果可以就返回1,否则返回0,其它的就以此类推。

当驱动程序提供了这个方法之后,应用程序就不再辛辛苦苦的去轮询了,一个select调用就可以等待多个设备,设备的轮询就交给操作系统去完成了。

 

         for(;;){

                  select(fd+1,&fdt,NULL,NULL,NULL);

                 if(FD_ISSET()){

                                  ..................

                 }

         }

      由于select将等待通知的任务丢给了linux操作系统,导致了,系统的运行缓慢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值