驱动的三种IO模型

本文介绍了阻塞IO和非阻塞IO的工作机制,阻塞IO在等待数据时会使进程进入休眠状态,而非阻塞IO则会继续执行并轮询检查数据。接着,文章详细阐述了IO多路复用的概念,特别是select、poll和epoll这三种实现方式,强调了它们在处理多个硬件数据输入输出请求时的效率和资源节省优势。
摘要由CSDN通过智能技术生成

阻塞IO概述:

例如读取硬件数据时,如果硬件数据没有准备好,此时进程阻塞在read()函数位置直到硬件数据就绪,通过read()函数读取硬件数据,程序向下执行,进程阻塞等待数据时处于休眠态。

阻塞IO特点:

最常用,简单,但效率最低的。常见一些read,write等函数。

非阻塞IO概述:

例如读取硬件数据时,不管硬件数据有没有准备好,此时进程都不会阻塞在read()函数位置,而是继续往下执行。如果想要获取到有效数据,需要轮询

非阻塞IO特点:

只判断此时此刻情况,不会影响进程其他操作

IO多路复用概述:

在一个进程中同时监听多个硬件的数据,就需要使用IO多路复用,IO多路复用的实现机制有三种:select/poll/epoll。IO多路复用的基本思想是在用户空间中将监听的事件文件描述符添加到事件集合中,调用函数进行判断集合中文件描述符对应的硬件数据是否准备就绪,如果没有一个事件发生,将进程切换到休眠状态(可中断休眠状态)。当有一个或者多个硬件数据准备好了,将休眠的进程唤醒,对准备好的硬件数据进行读写

IO多路复用特点:

        1> 在单进程单线程的情况下,同时处理多个硬件数据输入输出请求。

        2> 由于不需要创建新的进程和线程,减少系统的资源开销,减少上下文切换的次数。

Select:阻塞函数,让内核检测指定文件描述符集合中,是否有文件描述符准备就绪

 当文件描述符准备就绪后,该函数解除阻塞。

 当事件产生后,集合中会只剩下触发事件的文件描述符。

操作集合函数有

void FD_CLR(int fd, fd_set *set);      将fd从集合中剔除

int  FD_ISSET(int fd, fd_set *set);     判断fd是否在集合中,在返回真,不在返回假

void FD_SET(int fd, fd_set *set);      将fd加入到集合中

void FD_ZERO(fd_set *set);          清空集合

Poll:阻塞函数,让内核检测指定文件描述符集合中,是否有文件描述符准备就绪

 当文件描述符准备就绪后,该函数解除阻塞。

Epoll:一颗树、一张表、三个接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值