IO模式:对于一次IO操作
数据会先被拷贝到操作系统内核缓冲区,然后从操作系统内核缓冲区再拷贝到应用程序内存空间。
当一个IO操作发生时会发生两个阶段:
1、等待数据准备,
2、将数据从内核拷贝到进程中。
因为这两个阶段Linux系统产生了五种网络模式方案:
1、阻塞IO:在数据准备阶段,用户进程会被阻塞,一直等到数据的到来。知道数据到来并被拷贝到用户内存后该阻塞才会解除
2、非阻塞IO:数据还未准备好的时候会立刻返回error,用户进程收到error时就知道数据还未准备好,于是可再次发起改操作。当数据准备好后就马上拷贝到用户内存并返回结果
3、IO多路复用:多路IO复用有三种模式select、poll、epoll,有些地方也称这种模式为事件驱动IO。select、epoil的好处在于单个进程就可以同时处理多个网络链接的IO.它的基本原理是select、poll、epoil这个方法会不断的轮询所负责的所有socket,当某个socket有数据到达了就通知用户进程。当用户进程调用了select,进程就会阻塞,同时kemel会监听所有select负责的socket,当任何一个socket的数据准备好了,select就会返回,这个时候用户再调用时间操作将数据从kemel拷贝到用户进程。IO多路复用的特点是通过一种机制一个进程能同时访问多个文件描述符,而这些文件描述符中的其中任意一个进入就绪状态,select函数就可以返回
4、信号驱动IO
5、异步IO:当用户发起一个操作后就立即去做其他事情了,内核会等待、检测数据直到数据准备完成,然后将数据拷贝到用户内存(无需先拷贝到内核缓冲区),这一切完成后会给用户进程发送一个信号告知操作完成了
阻塞IO、非阻塞IO、多路复用IO都是同步IO,都需等待将数据从内核缓冲区拷贝到用户内存,会阻塞进程。异步IO是异步IO
事件驱动模型:当有一个事件(如鼠标点击)发生时,会将该事件放入一个消息队列,不断循环处理队列中的事件,遵循先进先出的原则,该事件中包含其处理函数的指针,所以可根据事件调用其对应的处理函数。
常见的编程范式:单线程、多线程、事件驱动编程
Java对BIO、NIO、AIO的支持:
Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。(底层是epoll)
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
实现RPC需要运用到的技术点4个:
通信
序列化/反序列化
反射
动态代理