epoll
是一种 I/O 事件通知机制,最初出现在 Linux 操作系统中,用于高效地管理大量的文件描述符(sockets、files、pipes 等)。它是 Linux 下的一种 I/O 复用机制,类似于 BSD 的 kqueue
和 Solaris 的 devpoll
。
从阻塞---
1.一个线程怎么处理多个i/o?
多个线程处理多个io 看起来可以,但会影响更多的性能。
普通-->使用一个while(true)循环不断轮训。结论 如果所有的流都没有数据,那么只会白白浪费cpu。---》cpu空转。
进一步 -〉在while里加一步select(stream)在for循环之前。结论:从select可以知道 有io事件发生了,但是不知道是哪几个流。我们只能无差别的轮训,找出能读写的数据,进行操作。
再进一步epoll -》
while(true){
active_stream() = poll_wait();
for(){read or write
}
}
结论,epoll会把哪个流发生了什么io事件通知我们,此时我们对这些流的操作都是有意义的。复杂度降低到了O(1);
在handle中:
private native static long nativeInit();MessageQueue(boolean quitAllowed) {mQuitAllowed = quitAllowed;mPtr = nativeInit();}
nativeInit(),就有对epoll的初始化;mPtr 是一个标识
在handle的 Message next() 中,有一行
nativePollOnce(ptr, nextPollTimeoutMillis);nextPollTimeoutMillis等待的时间
有等待就会有唤醒,唤醒就是 nativeWake ,-=--》是字节码底层唤醒的