wordpress怎么修改首页网址,西昌seo,软件设计包括哪些内容,网络营销4c✍个人博客#xff1a;https://blog.csdn.net/Newin2020?typeblog #x1f4e3;专栏地址#xff1a;http://t.csdnimg.cn/fYaBd #x1f4da;专栏简介#xff1a;在这个专栏中#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话#xff0c;欢迎点赞… ✍个人博客https://blog.csdn.net/Newin2020?typeblog 专栏地址http://t.csdnimg.cn/fYaBd 专栏简介在这个专栏中我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话欢迎点赞收藏您的支持就是我创作的最大动力 推荐参考地址https://www.xiaolincoding.com/这个大佬的专栏非常有用 175. 网络模式的实现方式
常见的 Reactor 实现方案有三种。
第一种方案单 Reactor 单进程 / 线程不用考虑进程间通信以及数据同步的问题因此实现起来比较简单这种方案的缺陷在于无法充分利用多核 CPU而且处理业务逻辑的时间不能太长否则会延迟响应所以不适用于计算机密集型的场景适用于业务处理快速的场景比如 Redis6.0 之前 采用的是单 Reactor 单进程的方案。
第二种方案单 Reactor 多线程通过多线程的方式解决了方案一的缺陷但它离高并发还差一点距离差在只有一个 Reactor 对象来承担所有事件的监听和响应而且只在主线程中运行在面对瞬间高并发的场景时容易成为性能的瓶颈的地方。
第三种方案多 Reactor 多进程 / 线程通过多个 Reactor 来解决了方案二的缺陷主 Reactor 只负责监听事件响应事件的工作交给了从 ReactorNetty 和 Memcache 都采用了「多 Reactor 多线程」的方案Nginx 则采用了类似于「多 Reactor 多进程」的方案。
Reactor 可以理解为「来了事件操作系统通知应用进程让应用进程来处理」而 Proactor 可以理解为「来了事件操作系统来处理处理完再通知应用进程」。
因此真正的大杀器还是 Proactor它是采用异步 I/O 实现的异步网络模型感知的是已完成的读写事件而不需要像 Reactor 感知到事件后还需要调用 read 来从内核中获取数据。
不过无论是 Reactor还是 Proactor都是一种基于「事件分发」的网络编程模式区别在于 Reactor 模式是基于「待完成」的 I/O 事件而 Proactor 模式则是基于「已完成」的 I/O 事件。
176. Reactor 模式
要求主线程I/O 处理单元只负责监听文件描述符上是否有事件发生有的话就立即将该事件通知工作线程逻辑单元将 socket 可读可写事件放入请求队列交给工作线程处理。除此之外主线程不做任何其他实质性的工作。读写数据接受新的连接以及处理客户请求均在工作线程中完成。
使用同步 I/O以 epoll_wait 为例实现的 Reactor 模式的工作流程是
主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。主线程调用 epoll_wait 等待 socket 上有数据可读。当 socket 上有数据可读时 epoll_wait 通知主线程。主线程则将 socket 可读事件放入请求队列。睡眠在请求队列上的某个工作线程被唤醒它从 socket 读取数据并处理客户请求然后往 epoll 内核事件表中注册该 socket 上的写就绪事件。当主线程调用 epoll_wait 等待 socket 可写。当 socket 可写时epoll_wait 通知主线程。主线程将 socket 可写事件放入请求队列。睡眠在请求队列上的某个工作线程被唤醒它往 socket 上写入服务器处理客户请求的结果。
Reactor 模式的工作流程 177. Proactor 模式
Proactor 模式将所有 I/O 操作都交给主线程和内核来处理进行读、写工作线程仅仅负责业务逻辑。使用异步 I/O 模型以 aio_read 和 aio_write 为例实现的 Proactor 模式的工作流程是
主线程调用 aio_read 函数向内核注册 socket 上的读完成事件并告诉内核用户读缓冲区的位置以及读操作完成时如何通知应用程序这里以信号为例。主线程继续处理其他逻辑。当 socket 上的数据被读入用户缓冲区后内核将向应用程序发送一个信号以通知应用程序数据已经可用。应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求后调用 aio_write 函数向内核注册 socket 上的写完成事件并告诉内核用户写缓冲区的位置以及写操作完成时如何通知应用程序。主线程继续处理其他逻辑。当用户缓冲区的数据被写入 socket 之后内核将向应用程序发送一个信号以通知应用程序数据已经发送完毕。应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理比如决定是否关闭 socket。
Proactor 模式的工作流程