admin 管理员组

文章数量: 887016

io

参考 unix网络编程 chapter6.2 I/O models,windows网络编程

 

1,----------------------理论:socket编程主要有两步

        第一步:   “等待数据”从网络上传到本地。然后将数据包从网络层拷贝到内核的缓存中

        -->用户应用进程-->recvfrom-->系统调用-->内核等待网络数据报-->网络数据报准备好(拷贝到内核) 

        第二步:   “拷贝数据”从内核中把数据拷贝到程序的数据区中。 

        -->内核拷贝数据到用户应用程序(buffer)-->拷贝完成-->返回调用。

         

         

        同步IO和异步IO的区别就在于:应用程序的调用(数据等待+数据拷贝)是否立即返回!

        阻塞IO和非阻塞IO的区别就在于:数据等待的时候进程是否阻塞!

         

         

        书中介绍了5种I/O models:

         

        blocking I/O

        两步全阻塞,并让出CPU,或者出错被系统信号中断。

        nonblocking I/O

        告诉内核,I/O操作无法完成时,不要将进程睡眠,而是返回一个错误EWOULDBLOCK信号,然后不断的polling轮询,直至正常返回调用

        I/O multiplexing (select and  poll)

        阻塞于select()/poll()/epoll()调用,轮询,当返回套接口可读条件时,调用recvfrom拷贝数据到用户应用程序, 好处在于可以轮询多个文件描述符FD

        signal driven I/O ( SIGIO)

        不解释,没有AIO好

        asynchronous I/O (the POSIX  aio_functions)

        暂不解释

 

2,----------------------java 中的应用:(个人感悟2015-03-12 22:26)

        1,传统IO(Old IO):所有的socket链接(线程),两步都阻塞(数据等待+数据拷贝)

        2,NIO(new IO):不是noblocking IO,是 multiplexing I/O。只有selector一处(一个线程)阻塞( 数据等待),

        所有的socket链接(线程)只在数据拷贝处阻塞。

        java代码中的noblocking是对所有socket链接,数据等待这一步的阻塞,转移给了selector,最多是局部的noblocking,炒作之嫌更大。

 

  • 大小: 24.8 KB
  • 查看图片附件

本文标签: io