[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工程师面试突击(第三季)-- 中华石杉

原文地址:https://www.cnblogs.com/fyql/p/12325093.html