linux高性能服务器编程 (九) --I/O复用
第九章 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复用的更多相关文章
- Linux 高性能服务器编程——I/O复用
问题聚焦: 前篇提到了I/O处理单元的四种I/O模型. 本篇详细介绍实现这些I/O模型所用到的相关技术. 核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...
- Linux 高性能服务器编程——高性能服务器程序框架
问题聚焦: 核心章节. 服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...
- Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字(so ...
- linux高性能服务器编程
<Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...
- Linux 高性能服务器编程——多进程编程
问题聚焦: 进程是Linux操作系统环境的基础. 本篇讨论以下几个内容,同时也是面试经常被问到的一些问题: 1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调 ...
- Linux 高性能服务器编程——Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
- Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
- Linux 高性能服务器编程——IP协议详解
1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的. ...
随机推荐
- Echarts 学习系列(1)-5分钟上手ECharts
目录 写在前面 下载Echarts和主题 绘制一个简单的图表 写在前面 最近,在做某个项目的时候.需要使用的可视化的图表显数据.最后,选择了百度的Echarts. 下载Echarts和主题 1.获取E ...
- bytearray与矩阵转换对应关系
import numpy as npimport osa=bytearray(os.urandom(27))# for i in range(21):# print(a[i])a=np.array(a ...
- Win10 资源管理器窗口无边框的问题
将“在窗口下显示阴影”关闭,再重新打开即可. 等了这么久,才敢在工作环境使用Win10,没想到还是这么多bug和不方便之处:输入法.托盘区.蓝屏...
- Myeclipse6.5迁移到IDEA
背景 myeclipse开发的javaweb项目用svn管理.现要转用idea开发.因为发现idea实在是太好用了.myeclipse6.5是个纯净版,用了两年,对于新手来说用myeclipse6.5 ...
- 2019-07-31 Jquery
Jquery是什么? jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“ ...
- 英语apyrite红碧玺apyrite单词
红碧玺(apyrite)是粉红.桃红.玫瑰红.深红.紫红等以红色调为主的碧玺,矿物学上主要属于锂电气石和镁电气石.红色起因可能与微量锰及锂和铯有关. 红色是碧玺中价值最高的,其中以紫红色和玫瑰红色最佳 ...
- 第一册:lesson 135.
原文:The latest report. question:Is Karen Marsh going to retire,do you think? Are you really going to ...
- MongoDB Spark Connector 实战指南
Why Spark with MongoDB? 高性能,官方号称 100x faster,因为可以全内存运行,性能提升肯定是很明显的 简单易用,支持 Java.Python.Scala.SQL 等多种 ...
- 动态路由 RIP
不同网段之间进行通信,中间有多个路由器的情况下,我们可以通过配置RIP动态路由来实现数据转发. 实验拓扑 如图所示连接,地址规划如下: 名称 接口 IP地址 R1 f0/0 192.168.10.1/ ...
- 在现有的mysql主从基础上,搭建mycat实现数据的读写分离
环境准备:MySQL服务器做好主从复制:centos6的系统 主:192.168.164.131 从:192.168.164.144 mycat服务器:192.168.164.141 a.将MySQL ...