1. 简介
epoll 是Linux内核为了解决io问题而引入的一种机制,避免了poll模型的几个缺点
- poll每次系统调用都要传递文件描述符集合,epoll在内核开辟了一个空间来存储文件描述符集合
- poll系统调用,内核每次都要遍历文件描述符集合,epoll通过和网卡中断做关联,避免了遍历文件描述符集合
2. 笔者环境
- Ubuntu 18.04
- JDK1.8
3. 示例代码
- vim SocketMultiplexingSingleThreadv1.java
- javac SocketMultiplexingSingleThreadv1.java
- strace -ff -o out java SocketMultiplexingSingleThreadv1
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class SocketMultiplexingSingleThreadv1 {
private ServerSocketChannel server = null;
private Selector selector = null;
int port = 9090;
public void initServer() {
try {
server = ServerSocketChannel.open();
server.configureBlocking(false);
server.bind(new InetSocketAddress(port));
selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
initServer();
System.out.println("init server finish");
try {
while (true) {
Set<SelectionKey> keys = selector.keys();
System.out.println("keys size : "+keys.size());
while (selector.select() > 0) {
Set<SelectionKey> selectionKeys = selector.selectedKeys(); //返回的有状态的fd集合
Iterator<SelectionKey> iter = selectionKeys.iterator();
while (iter.hasNext()) {
Se