zoukankan      html  css  js  c++  java
  • [Java复习] 面试突击

    聊聊Socket的工作原理?Socket跟TCP IP之间是啥关系?

    socket属于传输层的一个编程规范。

    socket就是在传输层把tcp/ip协议给封装了,Java原生支持socket网络编程。一般都是面试socket来编程。

    你能聊聊BIO、NIO、AIO分别都是啥?有什么区别?

    BIO: 同步阻塞式IO

    服务端创建一个ServerSocket,客户端用一个Socket去连接那个ServerSocket,然后ServerSocket接收到Socket连接请求就创建一个Socket和一个线程去和客户端Socket通信。

    缺陷:客户端socket发送一个请求,服务端socket进行处理后返回响应,响应必须是等处理完成之后才能返回,这期间不能做其他事,只能等待(卡住)。。而且每一个客户端接入,服务端就需要创建一个线程来服务,会导致客户端大量增加时,服务端线程会负责过高(可能几千几万个线程。。),最后服务端崩溃。

    优化:可以用线程池,固定线程来处理客户端请求,但是高并发时,会导致大量排队和延时。

    NIO: 同步非阻塞IO,基于Reactor模型。

    Channel:表示为一个已经建立好的支持I/O操作的实体(如文件和网络)的连接,在此连接上进行数据的读写操作,使用的是缓冲区来实现读写。

    Buffer:在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储。

    好处:1. 减少实际的物理读写次数 2. 缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数

    好比从A工地搬1w块砖到B工地,路途远(IO性能消耗大),没有工具时(缓冲区),一次搬1块,要搬1w次(IO读写1w次)。用卡车(缓冲区),一次运送5K块,2次就运完了,性能大大提高了。

    Selector(多路复用器):selector会不断轮询注册的channel,如果某个channel上发生了读写事件,selector就会将这些channel获取出来,我们通过SelectionKey获取有读写事件的channel,就可以进行IO操作。一个Selector就通过一个线程,就可以轮询成千上万的channel,这就意味着你的服务端可以接入成千上万的客户端。

    核心就是非阻塞,selector一个线程可以不停轮询channel,所有客户端都不会阻塞,最多排队。只有某个客户端发送了一个请求,才会启动一个线程来处理。客户端接入不会耗费一个线程,只会创建一个channel连接,然后注册到selector上,一个selector线程不断轮询所有的socket连接(channel),发现有事件就通知,启动工作线程处理一个请求。

    工作线程,从channel-buffer读数据,如果数据没有读完卡住,等待,然后处理后往buffer-channel里写数据,也是自己做,写数据时数据没有写完,也卡住等待,是同步的。

    AIO: 是基于Proactor模型的,就是异步非阻塞模型。

    核心:每个请求会绑定一个buffer,通知操作系统去异步完成读写,此时工作线程可以做别的事情(异步),等操作系统完成之后,回调接口,把操作系统完成的数据给工作线程。

    参考资料:

    互联网Java工程师面试突击(第三季)-- 中华石杉

  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/fyql/p/12325093.html
Copyright © 2011-2022 走看看