九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4172|回复: 0
打印 上一主题 下一主题

x4412&ibox项目实战37-阻塞与非阻塞IO

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-8 19:04:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞操作的进程在不能进行设备操作时并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。
驱动程序通常需要提供这样的能力:当应用程序进行read()、write()等系统调用时,若设备的资源不能获取,而用户又希望以阻塞的方式访问设备,驱动程序应在设备驱动的 xxx_read()、xxx_write()等操作中将进程阻塞直到资源可以获取,此后,应用程序的read()、write()等调用才返回,整个过程仍然进行了正确的设备访问,用户并没有感知到;若用户以非阻塞的方式访问设备文件,则当设备资源不可获取时,设备驱动的xxx_read()、xxx_write()等操作应立即返回,read()、write()等系统调用也随即被返回。
阻塞从字面上听起来似乎意味着低效率,实则不然,如果设备驱动不阻塞,则用户想获取设备资源只能不停地查询,这反而会无谓地耗费CPU资源。而阻塞访问时,不能获取资源的进程将进入休眠,它将CPU资源让给其他进程。因为阻塞的进程会进入休眠状态,因此,必须确保有一个地方能够唤醒休眠的进程。唤醒进程的地方最大可能发生在中断里面,因为硬件资源获得的同时往往伴随着一个中断。
以阻塞方式从串口读取一个字符的方法如下:
  1. char buf;
  2. fd = open("/dev/ttyS1", O_RDWR);
  3. ...
  4. res = read(fd,&buf,1); //当串口上有输入时才返回
  5. if(res==1)
  6. printf("%c\n", buf);
复制代码
       以非阻塞方式从串口读取一个字符的方法如下:
  1. char buf;
  2. fd = open("/dev/ttyS1", O _ RDWR| O _ NONBLOCK);
  3. ...
  4. while(read(fd,&buf,1)!=1); //串口上无输入也返回,所以要循环尝试读取串口
  5. printf("%c\n", buf);
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-6-28 11:11 , Processed in 0.017975 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表