首页 IO模型

IO模型

举报
开通vip

IO模型 2 常用的几种I/O模型          通常在操作I/O时,会用到下面几种模型之一:阻塞型I/O、非阻塞型I/O和复用型I/O。下面以读取串口数据为例,简要说明它们的基本工作原理和特点。          2.1 阻塞型I/O          顾名思义,它以阻塞方式操作I/O,如图1所示。若一个进程以阻塞方式调用read函数读取串口数据,则该进程会一直睡眠在read系统调用上。此时系统内核会一直等待数据,直到串口有数据到达为止。当串口数据准备好后,内核就把数据从内核拷贝至用户空间;而当数据拷贝完成后,才唤醒...

IO模型
 2 常用的几种I/O模型          通常在操作I/O时,会用到下面几种模型之一:阻塞型I/O、非阻塞型I/O和复用型I/O。下面以读取串口数据为例,简要说明它们的基本工作原理和特点。          2.1 阻塞型I/O          顾名思义,它以阻塞方式操作I/O,如图1所示。若一个进程以阻塞方式调用read函数读取串口数据,则该进程会一直睡眠在read系统调用上。此时系统内核会一直等待数据,直到串口有数据到达为止。当串口数据准备好后,内核就把数据从内核拷贝至用户空间;而当数据拷贝完成后,才唤醒串口读取进程,通知它读取数据报。  2.2 非阻塞I/O          图2中,在非阻塞I/O模型下,I/O操作是即时完成的。当进程调用read函数时,设置了O_NONBLOCK标志,那么即使串口没有数据可读,read函数也会立即返回。此时其返回值为EAGAIN,表明串口数据未就绪。如果串口有数据可读,则read函数会读取该数据,并返回所读数据的长度。通常轮询I/O的方法就是采用这种模型来读取串口数据的,此时进程必须通过反复调用来检测是否有数据可读。如果轮询频率过低,则容易丢失数据;轮询频率过高,则占用太多处理器的处理周期。  2.3 I/O复用          上述两种I/O模型,是最常用的两种操作I/O的方式;但在面向较复杂、需要处理多个I/O的系统时,这两种模型存在着不足之处。例如:在应用进程中需要对多个I/O设备进行监听,当某个设备可读或可写时,进程能马上得知,并进行相关处理。这时若采用阻塞方式操作I/O,则进程会阻塞在某个设备的I/O读写操作上而不能适用于这种情况;若采用非阻塞方式,则往往需要定时或循环地探测所有设备,才作相应处理,这种作法相当耗费系统中央处理器的执行周期。可见,上述的两个I/O模型都不能满足这类应用,故此需要引入一种特别的I/O处理机制,即I/O复用。          所谓I/O复用,是指当一个或多个I/O条件(可读、能写或出现异常)满足时,进程能立即知道,从而正确并高效地对它们进行处理。          在uClinux下,系统提供SELECT函数和poll函数,用来支持I/O复用的实现。如图3所示,若使用SELECT的系统调用来查询是否有数据可读时,进程是在等待多个I/O描述接口的任一个变为可读,但此期间并不阻塞进程。当有数据报已准备好时,返回可读条件,并通知进程再次进行系统调用准备读取相应的I/O数据。此时内核就开始拷贝准备好的数据至用户空间,并返回指示进程处理数据报。 与上面提及的两种I/O模型不同的是:在这个处理过程中,使用了两次系统调用来达到读取数据的目的。虽然两次系统调用的开销似乎更大,但它的最大好处在于能同时等待多个描述符准备好。因此SELECT调用功能更多地是借助了内核来监听I/O设备描述符的。下面具体介绍SELECT函数的功能及应用。          3 uClinux中基于SELECT的I/O复用机制和工作原理          在系统存在多个输入或输出流但不希望其中任一个流被阻塞的场合,经常使用复用I/O的方法解决。uClinux中,用户程序多使用SELECT机制实现I/O复用控制,SELECT函数允许进程对一个或多个设备文件进行非阻塞的读或写操作。          SELECT的函数定义于中,原型如下:          int SELECT(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);          该函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程。该函数的第1个参数n表示文件描述符集合中最大值再加1;第2个参数readfds,表示可读的文件描述符集合,用于查看是否有可读取数据;第3个参数writefds表示可写的文件描述符集合,用于查看是否能写入数据;第4个参数exceptfds用于异常控制;最后一个参数timeout决定了SELECT将会阻塞多久才把控制权移交给调用它的进程。调用SELECT之前,必须对此参数进行初始化。若timeout值为0,则SELECT直接返回0。此时I/O操作没有等待就立即返回,相当于一种非阻塞I/O的调用。          在应用中,通常先调用SELECT查看哪个I/O设备可读/写。如果没有可读/写的设备,并且没有设置超时返回功能,那么进程将阻塞在SELECT调用上;如果有,则SELECT函数返回,紧接着可通过测试参数readfds和writefds来确定哪个I/O设备可读或能写,而后以非阻塞方式操作该I/O设备,从而实现期望功能。          在实现SELECT应用的过程中,还会使用到这些SELECT相关接口:          void FD_ZERO(fd_set *fdset);     void FD_SET(int fd, fd_set *fdset);     void FD_CLR(int fd, fd_set *fdset);     int FD_ISSET(int fd, fd_set *fdset);          其中,fd_set表示设备文件描述符集合,fd表示设备文件描述符。FD_ZERO函数用于清除设备文件描述符集合所有元素;FD_SET函数用于把某个文件描述符添加至文件描述符集合;FD_CLR函数用于从文件描述符集合中删除某个文件描述符;而FD_ISSET用于检测设备文件描述符集合的某个文件描述符是否有效,有效则表示该位对应的设备有数据可读或可写。  4.2 SELECT机制能充分利用系统时间的原因          与频繁调用非阻塞读写函数来轮询监听I/O的方法相比, SELECT调用允许用户把进程本身挂起来,同时使系统内核监听所要求的一组文件描述符的任何活动。只要确认在任何被监控的文件描述符上出现活动,SELECT调用将返回指示该设备文件已经准备好的信息。这样就使进程能相对实时地监测到I/O设备上随机的变化,而不必由进程本身去探测输入数据是否准备好。  5 利用SELECT I/O的机制实现GPS与GPSOne数据的接收          本文提出的基于GPS与GPSOne信号的双定位的解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,即对系统两个串口定位信号的监听与处理,充分利用uClinux下基于SELECT的I/O复用机制,更利于较复杂系统的控制和管理。          方案实现的程序流程如图4所示。                    图4 双定位信息获取的程序流程          以下代码为使用SELECT I/O机制接收GPS信息和GPSOne信息的软件实现:          int Maxfd = fd_gps>fd_gpsOne? fd_gps: fd_gpsOne;//得到串口描述符中较大的一个     struct timeval tv;//定义超时控制结构     fd_set fds; //文件描述符集合变量     tv.tv_sec = 5;//设定超时值 5 s     tv.tv_usec = 0;     while(1){//通过GPSOne串口,发送GPSOne定位请求     Rt = send_port (fd_gpsone, "AT+GPSSTRT\r", strlen("AT+GPSSTRT\r");     if (Rt) == -1)     printf("Error happened!");     FD_ZERO (&fds);//初始化文件描述符集合     FD_SET(*fd_gps, &fds);//设置文件描述符集合的相应位     FD_SET(fd_gpsOne, &fds);//使用SELECT,让内核开始监听GPSOne和GPS串口设备     fd_sel = SELECT((Maxfd)+1, &fds_gps, NULL, NULL, &tv);     if (fd_sel < 0){     printf("Error happened while receiving gps data.\n");}     else if (FD_ISSET(*fd_gps, &fds)){//若GPS串口设备有数据可读     recv_len = recv_port(fd_gps, buf, 254);     if (recv_len > 0){     memcpy (gps_info, buf, recv_len);//信息保存到     gps_info数组中gps_info_process(gps_info);//解析定位信息处理     }     }     else if (FD_ISSET(*fd_gpsOne, &fds)){//若GPSOne串口设备有数据可读     recv_len = recv_port(*fd_gpsOne, buf, 254);     if (recv_len > 0){memcpy (gpsOne_info, buf, recv_len); //信息保存到gpsOne_info数组中     gpsOne_info_process(gpsOne_info);//解析定位信息处理     }     }     sleep(1);
本文档为【IO模型】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_380114
暂无简介~
格式:doc
大小:36KB
软件:Word
页数:3
分类:互联网
上传时间:2010-09-26
浏览量:76