IO多路复用之select,poll,epoll个人理解
在看这三个东西之前,先从宏观的角度去看一下,他们的上一个范畴(阻塞IO和非阻塞IO和IO多路复用)
阻塞IO:套接口阻塞(connect的过程是阻塞的)。套接口都是阻塞的。 应用程序进程-----recvfrom-----系统内核,这个过程是阻塞的,进程调用recvfrom后发现没有数据可用,就杵在原地等着了。数据从网络返回,再到内核缓冲区,再到进程缓冲区。这时,recvfrom发现数据来了,开始上班了。比较有惰性,你不给我资源我不做事情,就在这干等
非阻塞IO:套接口非阻塞(connect的过程是非阻塞的),就是链接未建立好,没关系可以先去做别的事,但是不能做像收发数据这样的事,因为链接还没有建立好,所以接下来做的事是那些不受建立链接这件事而影响的事。应用程序进程-----recvfrom-----系统内核(轮询),这里就和阻塞IO不一样了,这里会一直问有没有数据啊,还没来么,什么时候来啊,突然发现这非阻塞IO不仅做不了事情还一直占用cpu资源在这轮询(polling)。好了,数据来了,这时又不一样了,这时发现数据到内核缓冲区了,来数据了,赶快干活了,你看这一层就是到内核缓冲去就要干活了,内核缓冲区-----进程缓冲区
IO多路复用:此模型用到select和poll函数,这两个函数也会使进程阻塞,select先阻塞,有活动套接字才返回,但是和阻塞I/O不同的是,这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写(就是监听多个socket)。select被调用后,进程会被阻塞,内核监视所有select负责的socket,当有任何一个socket的数据准备好了,select就会返回套接字可读,我们就可以调用recvfrom处理数据。
正因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个I/O操作,所以才叫做多路复用。
再来理解socket编程数据流的过程
read过程:建立链接-----数据从网络到达内核缓冲区-----数据从内核copy到应用程序进程缓冲区-----应用程序操作数据
write过程:建立链接-----应用程序进程缓冲区-----内核缓冲区-----网络
以上的两个过程可以总结一下:1.数据到达内核之前的过程2.数据从内核copy到应用程序的过程
数据的流向分为三个层次:应用程序,操作系统内核,物理层(这里比较笼统不特指tcp/ip协议的物理层)。应用程序是建立在操作系统之上的,为了安全考虑应用程序与操作系统都有独立内存,应用程序是不允许直接访问操作系统内存的,而他们是通过一个recvfrom函数,或者理解为一个接口进行通信的。
(先写到着吧,之后有时间在补充epoll,异步IO)
IO多路复用之select,poll,epoll个人理解的更多相关文章
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...
- IO多路复用之select poll epoll
参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制. ...
- Python——IO多路复用之select模块epoll方法
Python——IO多路复用之select模块epoll方法 使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll. .├── epoll_c ...
- Linux IO模式以及select poll epoll详解
一 背景 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network ...
- IO模型与select,poll,epoll
五种:阻塞,非阻塞,IO复印,信号驱动,异步. select,poll,epoll select: 典型用32个32位的整数表示1024个描述符,并发的局限. poll:功能同上,但数据结构不一样(链 ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】
一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...
- 多路IO复用模型--select, poll, epoll
select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...
- 文档-linux io模式及select,poll,epoll
文档-Linux IO模式详解 1. 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 1.1 用户空间与内核空间 现在操作 ...
- 浅谈网络I/O多路复用模型 select & poll & epoll
http://blog.csdn.net/nk_test/article/details/50662946
随机推荐
- vs 2012 更新update4 后出现问题
Could not load file or assembly 'file:///C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7 ...
- BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)
LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内 ...
- windows安装nexus3
1.下载nexus3 https://www.sonatype.com/download-oss-sonatype 2.解压文件D:\javatool\ 3.在path中配置环境变量 D:\javat ...
- 2017-11-4—LTspice
LTspice这个软件基本上上手就能用,没什么好说的. ADI的一些器件下载的spice文件可能是.cir的需要使用cadence的pspice软件打开后另存为.dir文件使用.(比如ad4096) ...
- Mac下GTest的基本使用
Mac下GTest的基本使用 gtest全称Google C++ Testing Framework,它是从谷歌内部诞生并受到业界追捧的一个非常优秀的测试框架,支持如自动发现测试.自定义断言.死亡测试 ...
- Vue使用中常见问题
1.安装sass时报未找到 1.原因应该同时安装:1.npm install --save-dev sass-loader 2.npm install --save-dev node-sass ...
- linux locate命令
1.命令简介 locate(locate) 命令用来查找文件或目录. locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/ml ...
- 26 Arcpy跳坑系列——ExportToPNG
最近在学习Arcpy的时候,还真是遇到了一个磨人的小妖精,我本来是想得到一个透明背景的png图的,根据官方的帮助文档, https://desktop.arcgis.com/zh-cn/arcmap/ ...
- 小程序上拉加载更多数据(onReachBottom)
<!--pages/test/test.wxml--> <block wx:for="{{list}}" wx:key="item.id"&g ...
- SSIS - 2.使用脚本任务弹出对话框
步骤如下: 1.打开Visual Studio 2012或者SSDT工具->单击“文件”->选择"新建"打开创建新工程的对话框如下: 2.在"Business ...