IO模型 阻塞IO 非阻塞IO IO多路复用

阻塞IO

 概念

当应用程序中读取硬件数据时,如果硬件数据没有准备好,此时进程阻塞在read()函数位置,直到硬件数据就绪,通过read()函数读取硬件数据,程序向下执行,进程阻塞等待数据时处于休眠态,
D    uninterruptible sleep (usually IO)    //不可中断休眠态,不能通过外部信号将进程结束
S    interruptible sleep (waiting for an event to complete) //可中断休眠态

  • 最常用,最简单,效率最低的
  • 默认处于阻塞IO模式

代码

应用层

fd=open("/dev/mycdev",O_RDWR);

内核层

mycdev_read(struct file*file,ubuf,size,lof)
{
   
    if(!(file->f_flags&O_NONBLOCK))
    {
        //1.判断硬件数据是否准备好
        //2.如果准备好,把准备好的硬件数据拷贝到用户
        //3.如果硬件数据没准备好,将进程切换到休眠状态,直到数据准备好再将进程唤醒
    }
}

非阻塞IO

 概念

当我们再应用程序中读取硬件数据时,不管硬件数据有没有准备好,read()函数不会阻塞,而是继续向下执行

  • 防止进程阻塞在IO函数上,但是如果想要获取到有效数据,需要轮询
  • 当一个程序使用了非阻塞IO模式的套接字,那么它需要使用一个循环来不停的判断该文件描述符是否有数据可读,称之为polling
  • 应用程序不停的polling内核监测IO事件是否产生,cpu消耗率高

代码

应用层

//打开文件时添加非阻塞属性
fd=open("/dev/mycdev",O_RDWR|O_NONBLOCK);

内核层

mycdev_read(struct file*file,ubuf,size,lof)
{
   
    if(file->f_flags&O_NONBLOCK)
    {
        //当前是非阻塞
        //直接读取硬件寄存器的数据
        //copy_to_user();   
    }
}

IO多路复用

 概念

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

  • 进程中如果同时需要处理多路输入输出流,在使用单进程单线程的情况下,同时处理多个输入输出请求
  • 在无法用多进程多线程,可以选择用IO多路复用
  • 由于不需要创建新的进程和线程,减少系统的资源开销,减少上下文切换的次数
  • 允许同时对多个IO进行操作,内核一旦发现进程执行一个或多个IO事件,会通知该进程

select/poll/epoll在设备驱动中的操作方法只有一个,就是下面的这个poll方法

​__poll_t (*poll) (struct file *file, struct poll_table_struct *wait)

select(时间复杂度O(n))

 概念

  • 阻塞函数,让内核检测指定文件描述符集合中,是否有文件描述符准备就绪
  • 当文件描述符准备就绪后,该函数解除阻塞。
  • 当事件产生后,集合中会只剩下触发事件的文件描述符。

epoll(时间复杂度O(1))

 概念

核心操作:一颗树、一张表、三个接口

将监听的文件描述符放入树中,事件发生后,将触发事件的文件描述符放入表中

 三个接口

1.int epoll_create(int size);
功能:创建一个新的epoll
2.int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:进行epoll管理
3.int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
功能:阻塞等待事件发生

区别

  • select只知道事件的发生,不知道具体发生了什么事件
  • epoll知道事件的发生,也知道具体发生了什么事件
  • epoll是linux独有的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值