IO网络模型学习总结

学习源:https://blog.csdn.net/yinwenjie/article/details/48274255

 

常用的网络IO:阻塞式同步IO、非阻塞式同步IO、多路复用IO、和真正的异步IO。这些IO模式都是要靠操作系统进行支持,应用程序只是提供相应的实现,对操作系统进行调用。

 

1.1 阻塞和非阻塞是针对应用程序来说的
    阻塞在程序中表现为:
        Socket socket = serverSocket.accept(); java 利用jni调用系统询问是否有新的连接过来,如果没有会被一直阻塞,直到有连接。所以称之为阻塞。
        InputStream in = socket.getInputStream();  in.read(contextBytes, 0, maxLen)  read的时候,程序也会被阻塞,直到操作系统把网络传来的数据准备好。操作系统也是准备一批数据才传给程序的。


    非阻塞在程序中表现为
        serverSocket.setSoTimeout(100);  socket = serverSocket.accept(); 就是在调用系统时阻塞等待时间,轮询去调用(10秒一次,在只空闲的时间线程可以做其他事)。read方法也一样。(向系统中写不会被阻塞)。
        
    对已上问题总结:
        一个线程只能处理一个连接。线程会多次被阻塞,导致线程不能充分利用。所以支持不了高并发。
    改进方案:
        当soket.accept()到一个请求后,将请求交给别一个线程去处理业务。但解决不了根本问题,就是发出系统调用accept()还是一个一个来处理的,因为系统本向是同步io.


        
1.2 同步IO、异步IO、多路复用IO概念是操作系统级别的,主要描述的是操作系统在收到程序请求IO操作后,如果IO资源没有准备好,该如何相应程序的问题:


    同步IO不响应,直到IO资源准备好以后


    异步IO返回一个标记,好让程序和自己知道以后的数据往哪里通知,当IO资源准备好以后,再用事件机制返回给程序。采用“订阅-通知”模式:即应用程序向操作系统注册IO监听,然后继续做自己的事情。当操作系统发生IO事件,并且准备好数据后,在主动通知应用程序,触发相应的函数


    多路复用是程序线程注册select,select轮询调用系统方法(一个线程处理、批量处理)在操作系统级别上实现了一个端口同一时间内接受多个客户端IO事件,系统核心线程一次收集多个连接信息,将信息批量反馈。(1毫秒内至少同时有上千个连接请求准备好才能发辉优化)。
    多路复用其实也是同步IO的一种,就是只有程序询问是否发生了某个事件时,系统才会回应程序(批量的)。系统绝不会主动告知程序某个事件来了。

利用设备执行IO操作的时间,操作系统可以继续执行IO请求。并同样采用周期性轮询的方式,获取一批IO操作请求的执行响应。操作系统支持的多路复用IO技术主要有select、poll、epoll、kqueue。

普通轮训和select轮训是有区别的。普通是轮训调用系统的read。select是得到系统通知后轮训每一个连接看是否有可读的数据。原理是select 被wait 到一个公共的object对象上,其他链接有事件就会唤醒这个object上等待的线程。

程序可用少量的线程处理多个并发请求任务(业务线程不会被阻塞,一需要一个select的线程轮询)。
    
    系统网络模型的标准方法 accept read  write  close 等。
    
1.3多路复用的几个重要概念

    Channel:通道:
    1.被建立的一个应用程序和操作系统交互事件、传递内容的渠道(注意是连接到操作系统)被建立的一个应用程序和操作系统交互事件、传递内容的渠道(注意是连接到操作系统)应用程序可以通过通道读取数据,也可以通过通道向操作系统写数据


    2.ServerSocketChannel:应用服务器程序的监听通道。只有通过这个通道,应用程序才能向操作系统注册支持“多路复用IO”的端口监听。同时支持UDP协议和TCP协议。


    3.ScoketChannel:TCP Socket套接字的监听通道,一个Socket套接字对应了一个客户端IP:端口 到 服务器IP:端口的通信连接。


    4.DatagramChannel:UDP 数据报文的监听通道。

 

    Buffer:
    数据缓存区:在JAVA NIO 框架中,为了保证每个通道的数据读写速度JAVA NIO 框架为每一种需要支持数据读写的通道集成了Buffer的支持。

 

 

    Selector:选择器:
    1.事件订阅和Channel管理:应用程序将向Selector对象注册需要它关注的Channel,以及具体的某一个Channel会对哪些IO事件感兴趣。Selector中也会维护一个“已经注册的Channel”的容器


    2.轮询代理:应用层不再通过阻塞模式或者非阻塞模式直接询问操作系统“事件有没有发生”,而是由Selector代其询问


    3.实现不同操作系统的支持:多路复用IO技术 是需要操作系统进行支持的,其特点就是操作系统可以同时扫描同一个端口上不同网络连接的时间。所以作为上层的JVM,必须要为 不同操作系统的多路复用IO实现 编写不同的代码。

 


1.4 异步IO: 注意在JAVA NIO框架中,我们说到了一个重要概念“selector”(选择器)。
    它负责代替应用查询中所有已注册的通道到操作系统中进行IO事件轮询、管理当前注册的通道集合,
    定位发生事件的通道等操操作;但是在JAVA AIO框架中,由于应用程序不是“轮询”方式,而是订阅-通知方式,
    所以不再需要“selector”(选择器)了,改由channel通道直接到操作系统注册监听。    

 

总结:

第一步.网卡驱动将网络数据读的系统内核缓存中。

第二步.系统内核将数据拷贝到用户空间(进程)中。

如果第一步为不阻塞应用线程,则是非阻塞同步IO。

如果第二步不阻塞,则是AIO(异步IO),系统处理好数据直接调用(或通知)应用程序。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值