基本内容:NIO,unix五种网络编程模型,大小端模式,读写缓冲区与死锁,future模式基本雏形
1.NIO与BIO
BIO:同步阻塞IO。接收一个客户端连接请求时,新建一个线程为该客户端服务;在客户端释放连接前,该线程将一直被该客户端占用;当客户端释放连接时,该线程被销毁。线程数与并发量呈1:1的关系。问题:1.存在高占用问题、2.大量创建/销毁线程的资源消耗、3.服务器响应缓慢,甚至任务排队过久导致超时丢失。
伪异步IO:在BIO的基础上,用线程池处理任务,避免每个连接都创建一个新线程,可以实现线程的复用。线程数与并发量呈M:N的关系(M<<N)。减少了线程创建/销毁的问题,解决了相应缓慢问题,但仍然不能解决高占用问题,无法应对高并发阻塞场景。
NIO:同步非阻塞IO,且基于selector实现线程的多路复用,一个线程在生命期间可以为多个客户端服务。线程占用情况也大幅降低。
NIO的3大组件
1.Channel通道。对原IO的抽象,可以从一个通道读数据或者往这个通道写数据。对通道的读写必须通过Buffer进行。对Channel的读/写操作时非阻塞的。
2.Buffer缓冲区。实质是一个数组。clean()方法进入写模式:position=0,limit=capicity,position是下一个写入位置,最多能写到limit位置,position<=limit;flip()方法实现从写模式切换到读模式:limit=position,position=0,positon是下一个读位置,最多能读到limit位置,position<=limit。
3.Selector多路复用器,基于epoll实现。把BIO中多个阻塞集中到一个Selector上,再通过Selector实现分用。
5.future模式基本雏形
两个线程一个共享对象:数据请求线程(业务线程)、数据获取线程(临时辅助线程)、共享数据对象。
数据请求线程发出数据获取请求,一段时间后从共享数据对象拿数据(最终落到共享对象上)。拿的时候,若数据还没有准备好,则线程阻塞。
数据获取线程负责具体数据获取,设置共享数据对象的数据,唤醒在共享数据对象上等待的线程。
参:java tcp/ip socket编程