分析构建服务程序时,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操作系统,导致了,系统的运行缓慢。

你可能感兴趣的:(table,linux,struct,null,windows,任务)