zoukankan      html  css  js  c++  java
  • 一个标准的回射服务器搭建:select 和 poll 函数

    直到客户端检测不到EOF。这个时候需要进程有一种能力。

    这个能力:发现一旦一个多个I/O通道(网络,操作系统)就绪。它就会通知进程。

    这个能力就是I/O复用! 一般由select 和 poll 这两个函数支持。还有一个函数pselect。

    有几个场景需要应用到这个能力:

    1 当客户处理 多个描述符。(处理交互输入 和 网络套接字) (不同描述符 )

    2 一个客户处理多个 网络套接字 。 (不同地址套接字)

    3 如果一个TCP服务器既要处理监听套接字,又要处理连接套接字。(不同类型套接字)

    4 一个服务器同时处理tcp udp。一般也要用 I/O 复用了。(不同协议套接字)

    5 一个处理器处理多个服务或者多个协议。(不同地址/端口套接字)

    Linux 有5种I/O模型:

    1 阻塞式IO

    2 非阻塞式IO

    3 IO复用

    4 信号驱动式IO

    5 异步IO

    但是万变不离其中,本质上都是输入操作,1等待数据准备好 2从内核向进程复制数据

    网络方面则是异曲同工,1等待网络数据到操作系统 2内核把它们分组存在内核缓冲区 3把内核缓冲区数据往进程缓冲区复制

    1 阻塞式IO

    2非阻塞式I/O

    这种就是不断地调用recvfrom 让进程轮询内核,以查看操作就绪没?这么做往往耗费大量CPU资源。

    3 I/O复用模型

    与前两个比起来好像没有什么优势一样。但它真正的优势是可以等待多个描述符就绪。

    4信号驱动式IO模型

    主要优势就是 主程序不需要被阻塞。可以把recvfrom分离出主循环里。

    5异步IO模型

    和前面信号驱动IO有区别。区别在于发出信号的时机。前面那个是数据准备好就发送信号。

    这个则是数据准备好,复制给进程缓冲区完成后才发送信号。这个优势在于一点都不需要阻塞。

    前一个信号驱动型的 有时间损耗(等待数据复制给进程)所以还是需要阻塞一下的。

    这个完全不需要阻塞。等待数据到了进程缓冲区才发送信号!!

    5种模型对比:

    只有第五种才是真正的异步IO.(符合POSIX定义)

    select函数:

  • 相关阅读:
    字符输入流 FileReader
    字符输出流 FileWriter
    字节流复制文件
    字节输入流 FileInputStream
    彻底弄懂jsonp原理及实现方法
    这三个月,我如何一点点地成长(海康前端实习)
    前端chrome浏览器调试总结
    前端常见的布局方案大全
    总结4种常用排序(快排、选择排序、冒泡排序、插入排序)
    详解JS中DOM 元素的 attribute 和 property 属性
  • 原文地址:https://www.cnblogs.com/zzzPark/p/6680811.html
Copyright © 2011-2022 走看看