实验六:linux设备驱动中的阻塞与非阻塞io

实验六:linux设备驱动中的阻塞与非阻塞io

ID:15468551

大小:76.00 KB

页数:8页

时间:2018-08-03

实验六:linux设备驱动中的阻塞与非阻塞io_第1页
实验六:linux设备驱动中的阻塞与非阻塞io_第2页
实验六:linux设备驱动中的阻塞与非阻塞io_第3页
实验六:linux设备驱动中的阻塞与非阻塞io_第4页
实验六:linux设备驱动中的阻塞与非阻塞io_第5页
资源描述:

《实验六:linux设备驱动中的阻塞与非阻塞io》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、实验六:Linux设备驱动中的阻塞与非阻塞IO1.阻塞与非阻塞I/O阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活地支持用户空间对设备的这两种访问方式。阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞操作的进程在不能进行设备操作时并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。驱动程序通常需要提供这样的能力:当应用程序进行read()、write()等系统调用时,若设备的资源不能获取,而用户又希望以阻塞的方式访问设备,驱动程序应在设备驱动的xxx

2、_read()、xxx_write()等操作中将进程阻塞直到资源可以获取,此后,应用程序的read()、write()等调用才返回,整个过程仍然进行了正确的设备访问,用户并没有感知到;若用户以非阻塞的方式访问设备文件,则当设备资源不可获取时,设备驱动的xxx_read()、xxx_write()等操作应立即返回,read()、write()等系统调用也随即被返回。阻塞从字面上听起来似乎意味着低效率,实则不然,如果设备驱动不阻塞,则用户想获取设备资源只能不停地查询,这反而会无谓地耗费CPU资源。而阻塞访问时,不能获取资源的进程将进入休眠,它将CPU资源让给其他进程。因为阻塞的进程会进入休眠状态

3、,因此,必须确保有一个地方能够唤醒休眠的进程。唤醒进程的地方最大可能发生在中断里面,因为硬件资源获得的同时往往伴随着一个中断。代码1和代码2分别演示了以阻塞和非阻塞方式读取串口一个字符的代码。实际的串口编程中,若使用非阻塞模式,还可借助信号(sigaction)以异步方式访问串口以提高CPU利用率,而这里仅仅是为了说明阻塞与非阻塞的区别。代码1阻塞地读取串口一个字符charbuf;fd=open("/dev/ttyS1",O_RDWR);...res=read(fd,&buf,1);//当串口上有输入时才返回if(res==1)printf("%c",buf);代码2非阻塞地读取串口一个

4、字符charbuf;fd=open("/dev/ttyS1",O_RDWR

5、O_NONBLOCK);...while(read(fd,&buf,1)!=1);//串口上无输入也返回,所以要循环尝试读取串口printf("%c",buf);2.等待队列在Linux驱动程序中,可以使用等待队列(waitqueue)来实现阻塞进程的唤醒。waitqueue很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现内核中的异步事件通知机制。等待队列可以用来同步对系统资源的访问,第7章中所讲述的信号量在内核中也依赖等待队列来实现。Linux2

6、.6提供如下关于等待队列的操作。(1)定义“等待队列头”。wait_queue_head_tmy_queue;(2)初始化“等待队列头”。init_waitqueue_head(&my_queue);而下面的DECLARE_WAIT_QUEUE_HEAD()宏可以作为定义并初始化等待队列头的“快捷方式”。DECLARE_WAIT_QUEUE_HEAD(name)(3)等待事件。wait_event(queue,condition)wait_event_interruptible(queue,condition)wait_event_timeout(queue,condition,timeou

7、t)wait_event_interruptible_timeout(queue,condition,timeout)第一个参数queue作为等待队列头的等待队列被唤醒,而且第二个参数condition必须满足,否则阻塞。wait_event()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上_timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第三个参数的timeout到达时,不论condition是否满足,均返回。wait()当condition满足时,wait_event()会立即返回,否则,阻塞等待condition

8、满足。(4)唤醒队列。voidwake_up(wait_queue_head_t*queue);voidwake_up_interruptible(wait_queue_head_t*queue);上述操作会唤醒以queue作为等待队列头的所有等待队列中所有属于该等待队列头的等待队列对应的进程。函数wake_up()必须与wait_event()或者wait_event_timeout()成对地使用,而函数w

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。