在看这三个东西之前,先从宏观的角度去看一下,他们的上一个范畴(阻塞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个人理解的更多相关文章

  1. Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)

    Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...

  2. IO多路复用之select poll epoll

    参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制. ...

  3. Python——IO多路复用之select模块epoll方法

    Python——IO多路复用之select模块epoll方法 使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll. .├── epoll_c ...

  4. Linux IO模式以及select poll epoll详解

    一 背景 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network ...

  5. IO模型与select,poll,epoll

    五种:阻塞,非阻塞,IO复印,信号驱动,异步. select,poll,epoll select: 典型用32个32位的整数表示1024个描述符,并发的局限. poll:功能同上,但数据结构不一样(链 ...

  6. I/O多路复用之select,poll,epoll简介

    一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...

  7. Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】

    一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...

  8. 多路IO复用模型--select, poll, epoll

    select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...

  9. 文档-linux io模式及select,poll,epoll

    文档-Linux IO模式详解 1. 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 1.1 用户空间与内核空间 现在操作 ...

  10. 浅谈网络I/O多路复用模型 select & poll & epoll

    http://blog.csdn.net/nk_test/article/details/50662946

随机推荐

  1. 末学者笔记--Linux网络模式及网卡配置

    一.linux网络的模式 三种模式:桥接,Nat和仅主机模式 一.桥接模式:配置桥接模式的虚拟机作为独立计算机存在 特点: 1. 虚拟机可以上外网2. 可以和局域网内任意一台电脑通信3. 可以和宿主机 ...

  2. [转]国家税务总局:个税专项附加扣除APP正式启用!(附操作指南)

    https://wallstreetcn.com/articles/3462504 12月31日国家税务总局官网消息,个人所得税专项附加扣除政策将于2019年1月1日起实施.2018年12月31日,由 ...

  3. cmake教程

    1 教程 cmake界的hello world[2] 进阶的入门教程参考[3] 2 引用 [1] cmake官网 [2] 在 linux 下使用 CMake 构建应用程序 [3] Valgrind官网

  4. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  5. 使用163.com邮箱发送邮件

    不要直接使用登录的密码,而是用配置中的授权码做为密码

  6. Understanding HBase and BigTable

    Hbase is a distributed data storage systems. A Bigtable is spare , distributed , persistent multidim ...

  7. Linux下的文件切割和文件合并

    linux下文件分割可以通过split命令来实现,可以指定按行数分割和按大小分割两种模式.Linux下文件合并可以通过cat命令来实现. 在Linux下用split进行文件分割: ①:指定分割后文件行 ...

  8. [LeetCode] Construct Quad Tree 建立四叉树

    We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...

  9. shell中,我们可以通过简单的一个判断来判断命令是否存在

    shell中,我们可以通过简单的一个判断来判断命令是否存在 which "Command" > /dev/null if [ $? -eq 0 ] then echo com ...

  10. WcPro项目(WordCount优化)

    1 基本任务:代码编写+单元测试 1.1 项目GitHub地址 https://github.com/ReWr1te/WcPro 1.2 项目PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实 ...