![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
高性能服务器
ch3rry
每天早上醒来,看见你和阳光都在,这就是我想要的未来。
展开
-
select、poll、epoll三者的区别
(1)select==>时间复杂度O(n)它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。(2)poll==>时间复杂度O(n)poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,但是它没有最大连接数的限制,原因是它是基于链表来存.原创 2020-06-07 17:27:09 · 368 阅读 · 0 评论 -
什么情况下异步操作使用消息队列而不是多线程
Redis提供了两种方式来作消息队列。一个是使用生产者消费模式模式,另一个就是发布订阅者模式。前者会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听;’后者也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是平等的。一、异步处理选择1.消息队列和多线程两者并不冲突,多线程可以作为队列的生产者和消费者。使用外部的消息队列时,第一是可以提高应用的稳定性,当程序fail后,写入外部消息队列的...原创 2020-06-07 16:11:11 · 3376 阅读 · 0 评论 -
IO --BIO、NIO、AIO
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到...原创 2020-04-10 12:45:31 · 214 阅读 · 0 评论 -
Nginx源码剖析之内存池,与内存管理
引言 Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。 其特点是占有内存少,并发能力强,事实上nginx的并发...转载 2019-04-02 20:00:22 · 150 阅读 · 0 评论 -
nginx源码分析—启动流程
Content0. 序1. main()分析2. 注意问题2.1 几个初值2.2 nginx工作模式2.3 一些配置2.4 其他开关3. 小结0. 序本文主要分析nginx主程序。nginx主程序main()实现文件:./src/core/nginx.c。.表示nginx-1.0.4代码目录,本文为/usr/src/nginx-1.0.4。1. main()分析...转载 2019-03-17 22:03:09 · 431 阅读 · 0 评论 -
Nginx源码分析—架构设计思想
nginx的源码可以分为三个部分,一个是在ngx_init_cycle之前,这个也算是为了重新启动nginx而准备的代码,比如说在这个时候可以接受外部的信号,也可以保存传递的参数,等等,当然在以后的函数中也考虑了是否正在重启nginx。至于ngx_init_cycle这个函数,是一个很庞大的函数,在这个函数中可以看到调用了各个模块的钩子函数,这里又设计到了nginx结构体的使...转载 2019-03-20 20:08:41 · 327 阅读 · 0 评论 -
nginx源码分析--框架设计 &master-worker进程模型
Nginx的框架设计—进程模型在这之前,我们首先澄清几点事实:nginx作为一个高性能服务器的特点,其实这也是所有的高性能服务器的特点,依赖epoll系统调用的高效(高效是相对select/poll这些系统调用的,底层有一个链表和红黑树,避免了轮询,减少了用户空间和系统空间之间的数据传递等),非阻塞(所有的操作都是非阻塞,这样),多进程(master-slave进程模型),这些事实使得ng...转载 2019-03-20 19:57:46 · 229 阅读 · 0 评论 -
nginx源码分析—hash结构ngx_hash_t
Content0.序1.hash结构1.1ngx_hash_t结构1.2ngx_hash_init_t结构1.3ngx_hash_key_t结构1.4hash的逻辑结构2.hash操作2.1NGX_HASH_ELT_SIZE宏2.2hash函数2.3hash初始化2.4hash查找3.一个例子3.1代码3.2如何编译3.3运行结果3....转载 2019-03-15 22:12:11 · 703 阅读 · 0 评论 -
nginx源码分析—队列结构ngx_queue_t
Content0.序1.队列结构2.队列操作2.1在头节点之后插入2.2在尾节点之后插入2.3删除节点2.4分割队列2.5链接队列2.6获取中间节点2.7队列排序2.8如何获取队列节点数据3.一个例子3.1代码3.2如何编译3.3运行结果4.小结0.序本文继续介绍nginx的数据结构——队列。链...转载 2019-03-15 18:51:42 · 267 阅读 · 0 评论 -
nginx源码分析—链表结构ngx_list_t
Content1.链表结构1.2 ngx_list_t的逻辑结构2.1创建链表3.一个例子3.2如何编译4.小结0. 序本文继续介绍nginx的容器——链表。链表实现文件:文件:./src/core/ngx_list.h/.c。.表示nginx-1.0.4代码目录,本文为/usr/src/nginx-1.0.4。1. 链表结构1.1 ngx_...转载 2019-03-15 14:46:56 · 202 阅读 · 0 评论 -
nginx源码分析—数组结构ngx_array_t
Content0. 序1. 数组结构1.1 ngx_array_t结构1.2 ngx_array_t的逻辑结构2. 数组操作2.1 创建数组2.2 销毁数组2.3 添加1个元素3. 一个例子3.1 代码3.2 如何编译3.3 运行结果4. 小结0. 序本文开始介绍nginx的容器,先从最简单的数组开始。数组实现文件:文件:./src/...转载 2019-03-14 14:45:54 · 187 阅读 · 0 评论 -
nginx源码分析—内存池结构ngx_pool_t及内存管理
Content0. 序1. 内存池结构1.1 ngx_pool_t结构1.2 其他相关结构1.3 ngx_pool_t的逻辑结构2. 内存池操作2.1 创建内存池2.2 销毁内存池2.3 重置内存池2.4 分配内存2.4.1 ngx_palloc()函数分析2.4.2 ngx_palloc_block()函数分析2.5 释放内存2.6 注册c...转载 2019-03-14 14:24:58 · 190 阅读 · 0 评论 -
nginx源码分析—模块及其初始化
Content0. 序1. nginx有哪些模块?2. nginx如何描述这些模块?2.1 模块数据结构2.1.1 ngx_module_t结构2.1.2 ngx_command_t结构2.2 模块类图3. nginx如何组织这些模块?3.1 全局数组ngx_modules3.2 模块组织结构图4. nginx的模块种类5. nginx如何初始化这些...转载 2019-03-14 11:06:40 · 235 阅读 · 0 评论 -
nigix学习框架
1、nigix初始化nginx有5中类型的模块,"CORE","CONF","EVNT","HTTP","MAIL" 2、数组结构ngx_array_t 3、ngx_listening_s结构体中unsigned open:1;这不是给open赋值,这是一种位域的结构体,这里的取值只能是0和1,因为它是用1位来表示的,使用位域可以节省很多空间。4、hash结构ngx_h...原创 2019-03-08 16:51:11 · 227 阅读 · 0 评论 -
vs2012编译libevent-2.1.8-stable源码 可调试
windows下用vs2012编译libevent-2.1.8-stable源码~可调试,可看源代码。step1:下载libevent-2.1.8-stable.tar.gz,解压step2:创建一个空的win32工程step3:在新工程里新建include,src两个文件夹step4将libevent解压后的文件copy到include,src文件夹,具体如下:a.include,compat,...转载 2018-06-05 16:51:41 · 361 阅读 · 0 评论 -
Linux高性能服务器编程——多进程编程
在多进程编程中,我们用fork系统调用创建子进程,值得注意的是,fork函数复制当前进程并在内核进程表中创建一个新的表项,其堆、栈指针,标志寄存器的值都和父进程相同,但是其ppid被设置成父进程pid,信号位图被清除。而子进程代码和父进程完全相同,其数据也会复制自父进程,但是其复制过程是写时复制,即父子任意进程对数据执行写操作时才会复制,首先是缺页中断,然后操作系统给子进程分配空间并复制数据。此外...转载 2018-06-05 16:11:59 · 242 阅读 · 0 评论 -
Linux高性能服务器编程——I/O复用
I/O复用技术是重要的提高服务器工作效率和性能的手段,Linux下实现I/O复用的系统调用主要有select、poll和epoll。 首先我们来看一下select的函数原型和常用的宏:1 #include<sys/select.h>2 int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,...转载 2018-06-05 16:10:36 · 199 阅读 · 0 评论