高级IO、详细的IO多路转接

1 篇文章 0 订阅
1 篇文章 0 订阅

高级IO:

五种典型IO: 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接

IO操作的流程: 等待IO操作条件具备,然后进行数据拷贝。
任何IO过程中, 都包含两个步骤. 第一是等待, 第二是拷贝. 而且在实际的应用场景中, 等待消耗的时间往 往都远远高于拷贝的时间. 让IO更高效, 最核心的办法就是让等待的时间尽量少.

  • 阻塞IO:
    为了完成IO操作发起的调用,当前不具备IO操作条件,则等待,直到条件具备,完成IO操作后调用返回。 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式. (效率低)
  • 非阻塞IO:
    如果内核还未将数据准备好(不具备IO操作条件), 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码. 进程干点其他事情,循环过来判断。(等待时间不确定,非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, 一 般只有特定场景下才使用. )
  • 信号驱动IO:
    提前对IO信号自定义处理方式,当IO条件具备时,操作系统通过信号来通知进程,直接发起调用进行数据拷贝。
    内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作。
  • 异步IO:
    IO操作条件的等待和数据拷贝都由操作系统来进行等待和操作,等到IO操作完成后,通过信号通知进程,进程直接对数据进行操作。
    由内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据).

特点: 从上到下效率越来越高,但是流程控制却越来越复杂。

同步通信 vs 异步通信

同步和异步关注的是消息通信机制.

所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得 到返回值了; 换句话说,就是由调用者主动等待这个调用的结果;

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

阻塞 vs 非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

阻塞调用是指调用结果返回之前,当前线程会被挂起. 调用线程只有在得到结果之后才会返回.
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程.

- IO多路转接:

  • (IO多路复用)
    虽然从流程图上看起来和阻塞IO类似. 实际上最核心在于IO多路转接能够同时等待多个文件 描述符的就绪状态. 对大量的描述符进行事件(可读事件/可写事件/异常事件)监控。
    作用:替进程监控大量的描述符什么时候有什么事件,进而进程可以轮询针对发生了相应事件的描述符进行相应操作。

IO多路转接模型:select/poll/epoll

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值