问大家个问题,IO多路复用,和同步阻塞比,优化在哪里呀,IO多路复用说是可以处理多个网络请求,但也是阻塞的,那同步阻塞同样也是阻塞的呀?没get到io多路复用优化在哪里了
在处理网络的请求的时候,譬如有100个socket,如果是阻塞同步,需要开100个线程去处理,线程创建销毁有开销,即使用线程池解决创建销毁开销,还有上下文切换的开销。
io 多路复用,100个socket 只要一个线程,如果是 epoll 的话,把100个文件fd交给内核,等待内核处理完几个socket后返回,我们只要直接处理这几个socket就行,减少的上下文开销,效率就比较高了
100个fd 可以是不同的端口么?可以的吧.不过大部分服务器的socket都是一个端口
https://blog.csdn.net/historyasamirror/article/details/5778378
我讲讲我的理解: 客户端连接进来一些socket 假如连接了10万个socket 那么着10万个socket交给epoll 去管理,epoll底层用红黑树把这些连接管理起来,等到有可读写的就绪的socket的时候,epoll内部会维护一个双端链表,把这些就绪的fd交给链表,链表传给用户态,用户态去处理。fd本身在用户态和内核态来回切换,会很浪费内存,epoll用了,nmap来共享内存,来减少用户态和内核态的交互。
mmap(mmap原理是内核的页表和用户空间的页表都映射到同一个物理内存减少拷贝)。。还有一点是 epoll 返回的是准备好的数量,调整的话是在红黑树调整的,我看到的好像是这样,而不是移动到新的链表(也可能是我看错了)
epoll会为每一个sockfd 注册一个事件回调,epoll维护了一个数据结构events,就绪的socketfd就扔到链表里面,回调给用户态,
select 是要全部轮询一遍,所以比较慢。epoll高效的地方之一,就是只把就绪的返回回来。不用集中处理。
红黑树查询的效率比较高,红黑树把就绪的fd 传给链表,链表传给用户态
Epoll通过链表在用户态和内核态 来回切换的
用户态和内核态都指向了链表
Epoll没有用到mmap 博客都是抄来抄去