zoukankan      html  css  js  c++  java
  • 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)

    靡不有初,鲜克有终
  • 相关阅读:
    路由懒加载的实现
    vue中的tab栏切换内容变换
    H5页面的高度宽度100%
    vue中的路由的跳转的参数
    xxxx-xx-xx的时间的加减
    sql server 2008 R2 备份还原到sql 2012
    eval方法将字符串转换成json对象
    CSS3 圆角(border-radius)
    [Easyui
    JavaScript slice() 方法
  • 原文地址:https://www.cnblogs.com/gtsnow/p/10779539.html
Copyright © 2011-2022 走看看