通天战队|「015期」JavaSE面试题(十五):网络IO流( 四 )


Q:
什么是零拷贝技术?
linux提供了sendfile , 也就是零拷贝技术
这个零拷贝技术 , 就是先从用户态切换到内核态 , 在内核态的状态下 , 把磁盘上的数据拷贝到内核缓冲区 , 同时从内核缓冲区拷贝一些 offset和length到Socket缓冲区;接着从内核态切换到用户态 , 从内核缓冲区直接把数据拷贝到网络协议引擎里去
同时从Socket缓冲区里拷贝一些offset和length到网络协议引擎里去 , 但是这个offset和length的量很少 , 几乎可以忽略
只要2次切换 , 2次拷贝
Q:
说一下select , poll , epoll的区别?
selectpoll实现需要自己不断轮询所有fd集合 , 直到设备就绪 , 期间可能要睡眠和唤醒多次交替 。
epoll也需要调用epoll_wait不断轮询就绪链表 , 期间也可能多次睡眠和唤醒交替 , 但是它是设备就绪时 , 调用回调函数 , 把就绪fd放入就绪链表中 , 并唤醒在epoll_wait中进入睡眠的进程 。 虽然都要睡眠和交替 , 但是select和poll在“醒着”的时候要遍历整个fd集合 , 而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了 , 这节省了大量的CPU时间 。 这就是回调机制带来的性能提升 。
selectpoll每次调用都要把fd集合从用户态往内核态拷贝一次 , 并且要把current往设备等待队列中挂一次 , 而epoll只要一次拷贝 , 而且把current往等待队列上挂也只挂一次(在epoll_wait的开始 , 注意这里的等待队列并不是设备等待队列 , 只是一个epoll内部定义的等待队列) 。 这也能节省不少的开销 。
祝大家都能拿到心仪的offer!
通天战队|「015期」JavaSE面试题(十五):网络IO流
通天战队|「015期」JavaSE面试题(十五):网络IO流等风也等你
文章都看完了
通天战队|「015期」JavaSE面试题(十五):网络IO流不点个
通天战队|「015期」JavaSE面试题(十五):网络IO流


推荐阅读