一点随笔,胡扯,有很多自己还没学习验证的地方。
1. bossGroup中,每个线程维护一个包装的ServerSocket,监听一个端口。ServerSocket监听到新连接后,得到Socket并包装,并**注册**到workerGroup其中一个EventLoop所维护的selector上。每个workerGroup有多个EventLoop,每个EventLoop维护着一个Selector实例,类似单线程Reactor模式地工作着([参考](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.cnblogs.com%2Fheavenhome%2Farticles%2F6554262.html)) 。
2. workerGroup有多个线程通过多路复用监听读写事件。每个EventLoop都是一个单线程Reactor模型,不断循环 监听事件的发生->取出激活的socket->依次处理事件->监听事件的发生。redis中,由
Level Triggered (LT) 水平触发
事件的触发是以缓冲区的空/满状态决定的,只要状态满足,就会触发。
既然如此,java的nio是水平触发吗?
我写了此文进行探究
以ae.c/aeProcessEvents
(其中包含文件事件分派器)为主的源码让我受益匪浅。该函数作用是完成事件处理的一次循环。
ae_epoll.c/aeApiPoll
函数讲述了redis如何用epoll实现事件监听
如何保证线程在切换到另一个CPU上运行之前,cache里的变量已经被写回内存?因为如果没写回内存,其它CPU的cache就会读到错误的数据。