最近在看muduo,其中有些东西相对来说还是有些生涩。
- 服务器模型
- c/s模型
- p2p模型
两种高效的事件处理模式
Reactor
Reactor模式是指主线程只负责监听文件描述符上是不是有事件发生,有的话就将该事件通知工作线程,除此之外,主线程不需要做其他任何工作,其他的数据读写、逻辑处理等都是在工作线程中完成的。
- Proactor
Proactor模式与Reactor一样,都是对某个IO事件进行通知,不同的是,Proactor模式中主线程不止监听文件描述符上的事件是否发生,还要完成所有的读写操作,而工作线程要做的只是处理逻辑问题。也就是说,Proactor模式将所有的I/O操作都交给主线程和内核来处理。
- 两种高效的并发模式
这里的“同步”和“异步”和“IO”的“同步”“异步”是完全不同的概念。在IO模型中,“同步”和“异步”区分的是内核向应用程序通知的是何种IO事件(是就绪事件还是完成事件),以及该由谁来完成IO读写(是应用程序还是内核)。在并发模式中,“同步”指的是程序完全按照代码序列的顺序执行;“异步”指的是程序的执行需要由系统事件来驱动。常见的系统事件包括中断、信号等。 - 半同步/半异步模式
- 半同步半异步反应堆模式
半同步/半反应堆中,异步线程只有一个,即主线程,他负责监听所有事件,有事件发生则将事件插入请求队列中。工作线程休眠在请求队列中,当任务到来时,通过竞争获取任务处理权
- 高效的半同步半异步
主线程只管理监听socket,连接socket由工作线程来管理。当有新的连接到来时,主线程就接受之并将新返回的连接socket派发给某个工作线程,此后该socket上的任何IO操作都由被选中的工作线程来处理,直到客户端关闭连接。
- 领导者/追随者模式
这是多个工作线程轮流获得事件源集合,轮流监听、分发并处理时间的一种模式。在任意时间点,程序都仅有一个领导者线程,他负责监听I/O时间,而其他线程都是他的追随者,他们休眠在线程池中等待成为新的领导者。当前的领导者如果检测到I/O时间,首先从线程池中选出新的领导者线程,然后处理I/O事件。
- epoll对文件描述符的操作有两种 :
- ET边沿模式
当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以ET模式来操作这个文件描述符。 - LT电平触发
LT模式是默认的工作模式。
对于采用LT工作模式的文件描述符,当epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件。当应用程序下次调用epoll_wait的时候,epoll_wait还会向应用程序通知此事件,直到该事件被处理。而对于采用ET工作模式的文件描述符,当epoll_wait检测到其上有事件发生并通知应用程序后,应用程序必须立即处理该事件,因为后续的epoll_wait将不在向应用程序通知此事件。