linux---五种高级IO模型

  • 阻塞IO模型
  • 非阻塞IO模型
  • 信号驱动IO模型
  • 异步IO模型
  • 多路转接IO模型
  • 高级IO重要概念
  1. 阻塞IO模型

在内核将数据准备好,系统调用会一直等待,所有的套接字默认都是阻塞IO方式
阻塞IO是最常见的IO模型
在这里插入图片描述

  1. 非阻塞IO模型

非阻塞IO往往需要程序员循环的方式反复尝试读取文件描述符,这个过程称为轮询,这对于cpu来说的话是较大的浪费,一般只有特定的场景下才能使用
在这里插入图片描述

  1. 信号驱动IO模型

内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作
在这里插入图片描述

  1. 异步IO

由内核在数据拷贝完成的时候,通知应用程序(而信号驱动是高数应用程序什么时候进行数据拷贝)
在这里插入图片描述

  1. IO多路转接

IO多路转接看起来和阻塞IO类似,实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态

在这里插入图片描述

  1. 高级IO概念
    1)同步与异步
  • 所谓的同步,就是在发出一个调用时候,在没有得到结果之前,该调用就不返回,但是一旦调用返回就得到返回值;换句话说,就是有调用栈主动等待这个调用的结果

  • 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果,换句话说就是当一个异步过程调用发出之后,调用者不会立刻得到结果,而是在调用发出之后,被调用者通过状态,通知调用者,或者通过回调函数处理这个调用

  • 两者之间的区别:功能是不是自己来完成

    2)阻塞和非阻塞

    • 阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会被返回
    • 非阻塞调用是指在不能立刻得到结果之前,该调用不会阻塞当前线程。
    • 两者之间的区别:调用函数的时候条件不满足的时候是否会停止该线程的运行。

将一个文件描述符设置成非阻塞IO
一个文件描述符默认都是阻塞IO,可以使用fcntl()函数设置成阻塞IO。

       #include <unistd.h>
       #include <fcntl.h>
       int fcntl(int fd, int cmd, ... /* arg */ );

根据我们传递的cmd的值不同,后面的参数也不相同
fcntl函数有五种功能

  • 赋值一个现有的文件描述符(cmd=F_DUPFD)
  • 获得/设置文件描述符标记(cmd=F_GETFD或者F_SETFD)
  • 获得/设置一个文件状态标记(cmd=F_GETFL或者F_SETFL)
  • 获得/设置异步IO所有权(cmd=F_GETOWN或者F_SETOWN)
  • 或者/设置记录锁(cmd=F_GETLK或者F_SETLKW)

将一个文件描述符设置成非阻塞只需要三行代码

int f1 = fcntl(fd,F_GETFL);
f1 = f1 | O_NONBLOCK;
fcntl(fd,F_SETFL,f1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值