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分析(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命令启动只需要短短的几秒。

……

阅读全文