Java NIO分析(7): NIO核心之Channel,Buffer和Selector简介

上次Java NIO分析(6): 从BIO到NIO-设计和概念讲到了NIO的设计思想,
Doug Lea大佬受AWT启发得到的事件驱动机制, 关键点在于

  • 非阻塞处理器
  • 事件分发组件

在NIO的API中,Channel就是实现非阻塞的组件,而事件分发(Dispatcher)使用的是Selector组件,
在传统的I/O流(Stream)是有方向的,而NIO支持双向读写,这样就需要将流中的数据读取到某个缓冲组件里,
Buffer组件.

Buffer组件还有个特殊的实现DirectByteBuffer, 可以申请堆外内存,关于为什么要申请堆外内存后续会谈。

查看更多

Java NIO分析(6): 从BIO到NIO-设计和概念

前面介绍了Unix的I/O模型以及多路复用的c实现,为什么要介绍这些呢? 因为JVM是用c++写的,JDK的native方法也都是用c写的,最后它们调用
的还是操作系统底层的api,所以了解一些关键的底层原理还是有必要的。

查看更多

Java NIO分析(5): I/O多路复用之epoll系统调用

1. epoll概念

poll系统调用相比于select主要解决了文件描述符的数量限制,但是在高并发场景下没有解决根本问题:

  1. fd数组整体在内核空间和用户空间之间拷贝
  2. 遍历整个fd数组找事件浪费资源

这俩性能问题在Banga在1999年写了篇论文A Scalable and Explicit Event
Delivery Mechanism for UNIX
,提出selectpoll都是无状态的,需要用户空间的进程自行遍历查找事件, 一种改进方案是内核内部自己维护事件集合.通过一个类似declare_interest的系统调用,内核能够增量得更新进程感兴趣的事件集合列表, 应用进程通过使用get_next_event调用能派发新事件给内核。

根据论文的研究成果,LINUXFreeBSD各自给出的解决方案:epollkqueue.我们主要讨论epoll, 毕竟日常服务端环境都是LINUX.

在LINUX内核2.6以上,epoll才受到支持。

查看更多

Java NIO分析(4): I/O多路复用之poll系统调用

poll系统调用主要解决了select系统调用的2个问题:

  1. 文件描述符数量(fd_setsize = 32)太小, 而且数值是使用宏写死的,这样在32位机器上最大文件描述符数量只有32*32=1024
  2. 文件描述符集(fd_set)这种值-结果参数的api设计不是很好, select系统调用的时候要分别传读set,写set,更多事件不好细分

poll系统调用使用了pollfd数据结构来表示事件数组,没有了fd_setsize的限制,同时支持更多的事件类型

查看更多

Java NIO分析(3): I/O多路复用之select系统调用

前面讲了一些Java NIO分析(2): I/O多路复用历史杂谈, 谈到了多路复用的发展历史
以及为什么需要它。今天讲广受各大内核支持的select系统调用,select允许进程
指定内核等待1个或者多个事件的任何一个发生, 并且只在有它们发生之后或者等待一段时间后才唤醒进程。

查看更多

Java NIO分析(2): I/O多路复用历史杂谈

前面Java NIO分析(1): Unix网络模型讲过5种经典I/O模型,
现代企业的场景一般是高并发高流量,长连接, 假设硬件资源充足,如何提高应用单机能接受链接的上限?
先讲段历史

查看更多

Java NIO分析(1): Unix网络模型

要谈Java的NIO, 还是先从I/O开始说起。
Unix提供了5种不同的I/O模型,分别是

  • 阻塞I/O(blocking I/O)
  • 非阻塞I/O(non-blocking I/O)
  • I/O复用(I/O multiplexing)
  • 信号驱动式I/O(signal-driven I/O)
  • 异步I/O(asynchronous I/O)

查看更多

luminus整合shadow-cljs打包

shadow-cljs是新一代的cljs打包工具,比起以前的cljsbuild和figwheel的优势主要是:

  1. 支持直接引用npm依赖, 以前还需要使用cljsjs转一次,不仅麻烦而且还是过时的
  2. 和webpack类似的代码分割, 依赖

当然,cljs+css代码重载是最基本的,而且构建速度也足够快

查看更多

使用clj1.9快速启动clojure的repl

随着Clojure1.9的发布,给我们带来了spec和命令行的支持.
mac下通过HomeBrew可以快速安装最新版clojure,自带clj命令行工具

1
brew install clojure

linux平台按照

1
2
3
curl -O https://download.clojure.org/install/linux-install.sh
chmod +x linux-install.sh
sudo ./linux-install.sh

然后通过clj命令就可以快速启动clj的repl.
原来用lein replboot repl启动需要1分钟,clj命令启动只需要短短的几秒。

查看更多

蜀道难

噫吁嚱,危乎高哉!蜀道之难,难于上青天!

查看更多