netty

不得不说尼恩编著的《Netty、redis、zookeeper高并发实战》写的非常好,让我明白IO是怎么回事
1 高并发IO
主要的IO模型有四种,同步阻塞IO,同步非阻塞IO,IO多路复用、异步IO,这里记录一下理解的内容。
1.1 同步阻塞IO与同步非阻塞IO
java所有的socket连接的IO操作默认都是同步阻塞IO,因为在阻塞等待数据期间,用户线程挂起,故而在阻塞期间基本不会占用CPU资源,虽然这是个优点,但是在高并发情况下,就需要大量的线程来维护这些连接,又将涉及内存、线程切换的开销。
而同步非阻塞IO当数据没有准备时,会直接返回,故而如果要实现最终的调用,就需要轮询调用,这样就耗费了CPU。
既然上面两者都有缺点,于是就想了个这种的方案,能不能既不让我等着,又不让我频繁轮询发起IO调用呢?
1.2 IO多路复用与异步IO
既然问题发生在轮询IO调用,于是操作系统就引入了一个新的调用,去查询IO的就绪状态,linux通过select/epoll来调用,只需要查询状态是否就绪,如果就绪执行读写操作,这样不是更合理吗?
负责select/epoll状态查询的线程可以同时处理成千上万个连接,系统不必创建大量的线程,这样减小了系统的开销,但select/epoll系统调用是阻塞的
因为是IO多路复用还是轮询,那么最好的方式就主动回调,于是就有了AIO模型
1.3 jdk与tomcat
BIO(同步阻塞IO)是JDK1.4以前的唯一选择,JDK1.4之后就支持了NIO,AIO则是从JDK1.7后支持的。虽然JDK支持,但是我们的应用服务器tomcat支持吗?tomcat8以前默认确实BIO的,故而性能不是很好。tomcat8之后默认是NIO了
Tomcat8 配置NIO
Tomcat 源码分析 NIO (基于8.0.5),多路复用设计模式tomcat估计参考了netty。
1.4 文件句柄
linux系统中文件句柄(文件描述符)是内核为了高效管理已被打开的文件所创建的索引,所有的IO系统调用,包括socket的读写调用,都是通过文件句柄完成。ulimit -n定义了一个进程最多接口的socket连接数量,默认是1024,临时调整可以通过ulimit -n 10000,如果要持久化修改则需要编辑/etc/rc.local,添加ulimit -SHn 10000, -S是软极限,超出会警告;-H是硬极限,这个就是上线了。解除最大文件打开数量限制,更改/etc/security/limits.conf
1.5 java NIO
OIO是面向流(stream oriented),以流式的方式顺序从一个stream中读取字节,不能随意更改读取指针的位置。
NIO是面向缓冲区(buffer oriented),一个网络连接使用一个通道表示,从通道中读取数据到缓冲区,从缓冲区写入数据到通道中。
一个进程/线程可以同时监视多个文件描述符(一个网络连接,操作系统底层使用一个文件描述符来表示),一旦其中一个或多个文件
描述符可读或写,系统内核就通知进程/线程。
一个选择器只需要一个线程来监控多个通道,系统开销就小多了,系统不必为每个网络连接(文件描述符)创建线程/进程
1.5.1 buffer
缓冲区设计模式比较经典,capacity、limit、poisition、mark,然后就是一些方法来创建、读取、清空操作缓冲区。
1.5.2 channel
一个通道表示一个底层的文件描述符,包括硬件设备、文件、网络连接甚至更多。
Filechannel:文件通道,用于文件的数据读写。文件操作是阻塞模式,不能设置为非阻塞模式。
Filenchannel获取、读取、写入、关闭常规操作外,还有一个强制刷新磁盘,确保将缓冲区的数据写入到磁盘,force操作貌似是必须的。
SocketChannel:套接字通道,用于socket套接字TCP连接的数据读写,对应OIO的socket。一个连接,两端都有一个负责传输的SocketChannel
DatagramChannel:用于udp协议的数据读取
上面三个就包含了文件IO、TCP网络、UDP网络IO
ServerSocketChannel:服务器嵌套字通道(服务器监听通道),对用OIO中的ServerSocket,为每个监听到的请求,创建一个SockectChannel
疯狂创客圈/netty_redis_zookeeper高并发实战源码
1.5.3 selector
可供选择器监控的通道IO事件类型:可读、可写、连接、接收,这四种状态已经抽象到位了。ServerSocketChannel仅支持Accept IO事件,而SocketChannel则不支持,因为也没必要。
FileChannel是阻塞的,故不能被选择器复用,能被复用的继承了SelectableChannel(可选择通道),所有的网络连接socket套接字通道均继承了selectablechannel,也就是说都支持选择器。
1.6 Reactor反应器模式
Java设计模式之Reactor(反应器)模式初探
nginx、redis、netty均是基于反应器模式实现,可见高性能网络编程绕不开反应器模式。
1.6.1 Reactor反应器线程

1.6.2 Handlers处理器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warrah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值