第九章 I/O复用

  I/O复用就是一个线程可以同时监听多个文件描述符,提高程序性能。虽然I/O复用可以同时监听多个文件描述符,但是它本身是阻塞的,如果多个文件描述符准备就绪,如果不采取措施它仍然是串行工作的。所以只能通过多进程或者多线程来处理。linux下实现I/O复用主要使用到 select poll epoll 三种都是IO多路复用的机制;

  select :

    1)当有多个I/O流进来了,它不知道哪一个准备就绪可执行(读、写)所以select 只能采用轮询的方式去访问,所以 select 的时间复杂度是 O(n) .所以当流越来越多,轮询的时间就越来越长。

    2)select 方案单个进程所监听的数量是被限制的,也就是说同时可监听的端口号大小有限。通常情况下监听的数量和系统内存的大小有关,32位机默认监听大小为1024个,64位机监听的大小是2048个。

    3)采用该方案 还需要维护一个用来存放大量 fd(文件描述符)的数据结构,这样使得用户空间和内核空间在传递该结构时复制开销比较大。因为它将文件标识符数组被整体从用户空间和内核地址空间来回拷贝。

  poll :

    1) poll 本质上和 select 执行方案没有什么区别。就是它没有最大连接数的限制。因为他是基于链表存储的。复杂度为O(n)

  epoll :

    1) epoll 可以理解为 event poll 它和 select 和 poll 有很大的不同。 event 会将哪个具体的流I/O事件通知到我们。所以说epoll 实际上是事件驱动 每个事件上都关联一个fd (文件描述符) 。epoll的复杂度是 O(1) 所以说它的效率提升了很高。

    2) epoll 没有最大并发连接限制,1G的内存上能监听约10万个端口。

    3) 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。

  参考:https://www.cnblogs.com/lixiaoliuer/p/6735821.html

       https://www.cnblogs.com/aspirant/p/9166944.html

  

   

linux高性能服务器编程 (九) --I/O复用的更多相关文章

  1. Linux 高性能服务器编程——I/O复用

    问题聚焦:     前篇提到了I/O处理单元的四种I/O模型.     本篇详细介绍实现这些I/O模型所用到的相关技术.     核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...

  2. Linux 高性能服务器编程——高性能服务器程序框架

    问题聚焦:     核心章节.     服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...

  3. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  4. linux高性能服务器编程

    <Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...

  5. Linux 高性能服务器编程——多线程编程

    问题聚焦:     在简单地介绍线程的基本知识之后,主要讨论三个方面的内容:    1 创建线程和结束线程:    2 读取和设置线程属性:    3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...

  6. Linux 高性能服务器编程——多进程编程

    问题聚焦:     进程是Linux操作系统环境的基础.     本篇讨论以下几个内容,同时也是面试经常被问到的一些问题:     1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...

  7. Linux 高性能服务器编程——Linux服务器程序规范

    问题聚焦:     除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范.     工欲善其事,必先利其器,这篇主要来探 ...

  8. Linux 高性能服务器编程——TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  9. Linux 高性能服务器编程——IP协议详解

    1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的.     ...

随机推荐

  1. System.ArgumentException:路由集合中已存在名为“XXX”的路由。路由名称必须唯一。

    软件环境:Visual Studio 2017 + MVC4 + EF6 问题描述:System.ArgumentException:路由集合中已存在名为“XXX”的路由.路由名称必须唯一. 解决办法 ...

  2. mybatis中用注解如何处理存储过程返回的多个结果集?

    sql代码: create procedure sptest.getnamesanditems() reads sql data dynamic result sets 2 BEGIN ATOMIC ...

  3. Java 数组(三)二维数组

    如果一维数组的各个元素仍然是一个数组,那么它就是一个二维数组.二维数组常用于表示表,表中的信息以行和列的形式组织,第一个下标代表元素所在的行,第二个下标代表所在的列. 一.二维数组的创建 1.先声明, ...

  4. AF step、Bokeh等说明

    基本概念:FV: Focus Value, 用来衡量图像AF的清晰度. DOF: Deep Of Field, 景深,表示物距清晰的范围,景深越长表示物距前后清晰的范围越大. AF step一般来说, ...

  5. React 之 Redux 的使用

    Redux可以简单概况为:将需要修改的state都存入到store里,发起一个action用来描述发生了什么,用reducers描述action如何改变state tree .创建store的时候需要 ...

  6. 解决apscheduler报错:Run time of job …… next run at: ……)” was missed by

    在Django中使用apscheduler django_apscheduler 实现定时任务, 来完成数据拉取. 一段时间后发现数据量对不上,遂查日志 发现报错如下: Run time of job ...

  7. 【漏洞复现】PHPStudy后门

    0x01 概述 Phpstudy软件是国内一款免费的PHP调试环境程序集成包,通过集成Apache.PHP.MySQL.phpMyAdmin.ZendOptimizer多款软件一次性安装,无需配置即可 ...

  8. 【Spring】@PathVariable 获取带点参数,获取不全

    一.修改前 @GetMapping("/{name:.+}") public String profile(@PathVariable String name, Model mod ...

  9. flask项目

    虚拟环境需要 pipenv install flask pipenv install flask-sqlalchemy pipenv install python-dotenv pipenv inst ...

  10. Markdown Mermaid

    Mermaid 是一个用于画流程图.状态图.时序图.甘特图的库,使用 JS 进行本地渲染,广泛集成于许多 Markdown 编辑器中. 之前用过 PlantUML,但是发现这个东西的实现原理是生成 U ...