文章分类 - 四、高性能网络设计
摘要:Reactor 翻译过来的意思是「反应堆」,可能大家会联想到物理学里的核反应堆,实际上并不是的这个意思。 这里的反应指的是「对事件反应」,也就是来了一个事件,Reactor 就有相对应的反应/响应。 事实上,Reactor 模式也叫 Dispatcher 模式,我觉得这个名字更贴合该模式的含义,即
阅读全文
摘要:一、epoll基础数据结构 struct eventpoll { // ... struct rb_root rbr; // 管理 epoll 监听的事件 struct list_head rdllist; // 保存着 epoll_wait 返回满⾜条件的事件 // ... }; struct e
阅读全文
摘要:一、阻塞在哪里? 阻塞在网络线程。 二、什么来决定阻塞还是非阻塞? 默认情况下,IO是阻塞的,要调用下面函数来获取或设置阻塞状态。 fcntl(sockfd, F_SETFL, O_NONBLOCK); 如果是阻塞模型,那么当调用sockefd对用的read、write、accept、connect
阅读全文
摘要:一、网络编程关注的问题 (1)建立连接。(2)断开连接。(3)消息到达。(4)消息发送完毕。 二、⽹络编程流程 注意:当用户调用read和write等系统调用函数时,用户空间和内核空间之间的切换如下: 二、IO多路复⽤(⽹络线程) 注意:IO阻塞和非阻塞在下一节会具体有说明
阅读全文
摘要:一、服务器并发量 是指同时承载(能够处理业务)客户端的数量,注意,服务器连接客户端的数量之和并不叫做并发量,这些客户端还必须能够正常的处理业务。 二、模拟实现百万并发服务器 (1)代码部分 服务器代码: #include <stdio.h> #include <stdlib.h> #include
阅读全文
摘要:一、阻塞模式 Windows套接字在阻塞和非阻塞两种模式下执行I/O操作。在阻塞模式下,在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该函数所在的线程会阻塞在这里。相反,在非阻塞模式下,套接字函数会立即返回,而不管I/O是否完成,该函数所在的线程会继续运行。 当调用recv()函数时,系
阅读全文
摘要:一、为什么需要 WebSocket 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。 举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器
阅读全文
摘要:1、单线程reactor 参考源码:libevent或者redis 2、多线程reactor 参考源码:memcached 这种模式又分为2种: (1)多个worker,每个线程都一样,不区分main线程和worker线程。 (2) 一个主线程master(处理accept),其他线程都是worde
阅读全文
摘要:一、惊群效应简介 当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。 简单地说:就是扔一块食物,所有鸽子来抢,但最终只一个鸽子抢到了食物。 语义分析:食物
阅读全文
摘要:一、LT和ET的区别 ET是一次事件只会触发一次,如一次客户端发来消息,fd可读,epoll_wait返回.等下次再调用epoll_wait则不会返回了。 LT是一次事件会触发多次,如一次客户端发消息,fd可读,epoll_wait返回,不处理这个fd,再次调用epoll_wait,立刻返回。
阅读全文
摘要:一、下图为客户端和服务器之间建立TCP连接的过程 我们可以看到对应有2个队列: (1):未完成队列:每个这样的SYN分节对应其中一项,已有某个客户端发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接口处于SYN_RCVD (2):已完成队列:每个已经完成TCP三路握手过程的客户
阅读全文
摘要:一、初级版本 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/poll.h> #include <sys/epoll.h> #include <sys/socke
阅读全文
摘要:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/poll.h> #include <sys/socket.h> #include <netinet/tcp.h>
阅读全文
摘要:1.select: select本质上是通过设置或者检查存放fd标志位的数据结构数据结构来进行下一步的处理,时间复杂度:O(n) 缺点: 1)、每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大; 2)、同时每次调用select都需要在内核遍历传递进来的所有fd,
阅读全文