自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

鱼思故渊的专栏

不积跬步,无以至千里;不积小流,无以成江海

  • 博客(48)
  • 资源 (3)
  • 收藏
  • 关注

原创 C++ 经验条款

C++经验谈:一、绝不让构造函数称为虚函数:         从最简单的思想来看,C++对象模型中是根据虚函数表来管理虚函数的,那么在调用虚函数时,需要找到虚函数表,在对象没有创建成功时是没有虚函数表指针的,构造函数就是构造对象的,在对象没有创建成功之前来寻找虚函数表是不合理的。         一般情况下,编译器会为每个类生成一个公有的默认构造函数,但是有两种特殊情况例外:

2014-11-30 10:32:40 1154

原创 关于c++ const的全面总结

C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用   如下表所示:No.作用说明参考代码

2014-11-27 21:36:04 865

原创 const常量引用的使用方法

C++编程语言中,对于常量的引用是一个非常重要的应用技巧。在这篇文章中,我们将会为大家详细介绍一下有关C++常量引用的相关应用方法,相信大家可以从中学到很多知识。C++单例模式基础内容详解C++创建Web服务相关方法剖析C++构造函数如何进行初始化C++标识符命名规则相关应用技巧分享C++函数模板基本概念讲述如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的

2014-11-27 21:07:07 4660

原创 const修饰函数参数 const修饰函数返回值 const修饰成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设

2014-11-27 21:03:28 1915

原创 Nginx源码分析—HTTP框架执行流程

Nginx源码分析—HTTP框架执行流程         HTTP框架动态执行中的大概流程:先与客户端建立TCP连接,接收HTTP请求行、头部并解析出他们的意义,再根据nginx.conf配置文件找到一些HTTP模块,使其一次合作者处理这个请求。         为了精确地控制超时,还需要把读写事件放置到定时器中。         通过事件模块提东的ngx_handle_read_ev

2014-11-26 15:10:24 2297

原创 Nginx源码分析—定时器事件

Nginx源码分析—定时器事件对于每一个进程都有一个事件缓存,对于worker进程而言,除了nginx启动时更显一次时间外,任何更新时间的操作都只能由ngx_epoll_process_events方法执行。在此方法中,当flags参数中有NGX_UPDATE_TIME标志位,或者ngx_event_timer_alarm标志位为1时,就会调用ngx_time_update方法更新缓存时间。

2014-11-26 15:09:46 1551

原创 Nginx源码分析—过期事件和惊群事件的处理

Nginx源码分析—过期事件和惊群事件的处理过期事件:每个事件的date域都是一个结构体ngx_connection_t结构体,表示对应的连接。对于一个结构体struct epoll_event 中的data.ptr成员存储的是ngx_connection_t连接,这里使用Instance标志位来标识,下面就配合ngx_epoll_process_events方法说明他的用法。Data.p

2014-11-26 15:09:08 2148 2

原创 Nginx源码分析—架构设计思想

Nginx源码分析—架构设计思想我任务nginx的源码可以分为三个部分,一个是在ngx_init_cycle之前,这个也算是为了重新启动nginx而准备的代码,比如说在这个时候可以接受外部的信号,也可以保存传递的参数,等等,当然在以后的函数中也考虑了是否正在重启nginx。         至于ngx_init_cycle这个函数,是一个很庞大的函数,在这个函数中可以看到调用了各个模块的钩

2014-11-26 15:08:21 2399

原创 Nginx源码分析—nginx的配置

Nginx源码分析—nginx的配置Nginx都是一个master进程来管理多个worker进程。Worker进程的数量与服务器上的CPU核心数相等。Master是管理worker,接受外部信号,worker进程之间通过共享内存、原子操作实现通信和同步。任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务。不同worker进

2014-11-26 15:07:22 1588

原创 nginx源码分析--进程间通信机制 & 同步机制

Nginx源码分析—进程间通信机制从nginx的进程模型可以知道,master进程和worker进程需要通信,nginx中通信的方式有套接字、共享内存、信号。对于master进程,从外部接受信号,master进程主要就是监控、接受外部信号,将有必要的信号传递给worker进程,master进程大部分时间都是阻塞在sigsuspend()函数调用上。Worker进程屏蔽了所有的外部信号,那么Ma

2014-11-20 22:54:19 2035

原创 nginx源码分析--事件模块 & 琐碎

通过HUP信息使得NGINX实现重新读取配置文件,使用USR2信号使得NGINX实现平滑升级。在nginx中有模块这么一说,对外所有的模块都是ngx_module_t类型,这个结构体作为所有模块的通用接口,它只定义了init_master、init_module、init_process、init_thread、exit_thread、exit_process、exit_master这7个回调

2014-11-20 21:55:28 1665

原创 nginx源码分析--多阶段请求处理

读取完请求头后,nginx进入请求的处理阶段。简单的情况下,客户端发送过的统一资源定位符(url)对应服务器上某一路径上的资源,web服务器需要做的仅仅是将url映射到本地文件系统的路径,然后读取相应文件并返回给客户端。但这仅仅是最初的互联网的需求,而如今互联网出现了各种各样复杂的需求,要求web服务器能够处理诸如安全及权限控制,多媒体内容和动态网页等等问题。这些复杂的需求导致web服务器不再是一

2014-11-19 21:05:01 1285

转载 nginx源码分析--请求体的读取(2)

2,丢弃请求体一个模块想要主动的丢弃客户端发过的请求体,可以调用nginx核心提供的ngx_http_discard_request_body()接口,主动丢弃的原因可能有很多种,如模块的业务逻辑压根不需要请求体 ,客户端发送了过大的请求体,另外为了兼容http1.1协议的pipeline请求,模块有义务主动丢弃不需要的请求体。总之为了保持良好的客户端兼容性,nginx必须主动丢弃无用的请求体

2014-11-19 21:03:32 1000

原创 nginx源码分析--请求体的读取(1)

上节说到nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外还提供了一个丢弃请求体的接口-ngx_http_discard_request_body(),在请求执行的各个阶段中,任何一个阶段的模块如果对请求体感兴趣或者希望丢掉客户端发过来的请求体,可以分别调用

2014-11-19 20:58:51 2221

转载 nginx源码分析--请求头接受流程(2)

在ngx_http_process_request_line函数中,解析完请求行之后,如果请求行的uri里面包含了域名部分,则将其保持在请求结构的headers_in成员的server字段,headers_in用来保存所有请求头,它的类型为ngx_http_headers_in_t:[cpp] view plaincopy"font-size: 18px; ">type

2014-11-19 20:57:42 1357

转载 nginx源码码分析--请求头的接受流程(1)

篇文章主要会介绍nginx中请求的接收流程,包括请求头的解析和请求体的读取流程。首先介绍一下rfc2616中定义的http请求基本格式:[cpp] view plaincopy"font-size:18px;">Request = Request-Line         *(( general-header                      | req

2014-11-19 20:55:57 1359

转载 nginx源码分析--module开发(4)

3、对HTTP body的处理上面我们已经开始处理http request header了,接下来,如果请求中有body内容,那么需要处理body了。这里你肯定不会想要去阻塞式的读取body吧?body的长度可大可小,网络环境也巨复杂,只要有阻塞操作肯定玩完。Nginx这时已经准备了一个现成的读取body的非阻塞模式给用户,就是ngx_http_read_client_request_body

2014-11-19 20:54:12 953

转载 nginx源码分析--module开发(3)

2、HTTP框架继续上面这个例子,比如当nginx收到一个http请求时,我的module需要处理这个请求,那么我应该怎么做?实际这个问题还要再细分。如果是希望nginx收到完整的HTTP请求,再交给我的module处理?又或者只需要接收到完整的http header就给我呢?我把接收完header就交给module处理的code列下,再说下它的处理流程。首先我要在ngx_XXX_init

2014-11-19 20:52:15 704

转载 ngxin的Module开发(2)

nginx的module开发很弱,首先它不是采用动态库的形式被主进程加载,而是要求module的源码必须和nginx的源码一起编译。我是第一次见到这么BT的家伙,呵呵。所以呢,对module开发者来说,nginx就是一个开发平台,可以把它理解为在nginx这个“OS”上用C语言开发application,而且要遵循nginx的框架。既然是平台,那么像其他OS一样,我们需要搞明白几点:1、程序入

2014-11-19 20:50:26 857

原创 linux下的epoll如何高效处理百万连接

开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽,确实快,那么,它到底为什么可以高速处理这么多并发连接呢?先简单回顾下如何使用C库封装的3个epoll系统调用吧。

2014-11-19 20:27:38 2585 2

原创 Nginx源码分析—业务流程

Nginx源码分析—业务流程到此为止,我们假设ngx_init_cycle已经结束,我们暂时不管他做了什么,我们从他做的效果进入。从常理上来讲,如果一个请求到达,那么我们需要接受这个请求,那么就从请求来介绍!在ngx_event_process_init函数中将监听套接字上的读事件注册为ngx_event_accept,ngx_event_accept是为了接受请求的,它负责接收一个连

2014-11-19 20:02:34 1597

原创 Nginx源码分析—worker进程的创建

Nginx源码分析—worker进程的创建假设现在ngx_init_cycle已经结束(毕竟这个函数确实庞大),也就是说关于nginx的初始化都已经结束。那么看看如何创建进程模型ngx_master_process_cycle。在这个函数中,首先情况一些信号,然后将需要关注的信号注册进去(这个时候关于信号的处理函数已经被注册),可以看出来master进程关注的信号有10个。比如SIGCHL

2014-11-19 20:01:43 1374

原创 nginx源码分析--框架设计 & master-worker进程模型

Nginx的框架设计—进程模型在这之前,我们首先澄清几点事实:nginx作为一个高性能服务器的特点,其实这也是所有的高性能服务器的特点,依赖epoll系统调用的高效(高效是相对select/poll这些系统调用的,底层有一个链表和红黑树,避免了轮询,减少了用户空间和系统空间之间的数据传递等),非阻塞(所有的操作都是非阻塞,这样),多进程(master-slave进程模型),这些事实使得ng

2014-11-19 19:56:52 2927

原创 nginx中时间的管理

nginx出于性能考虑采用类似lib_event的方式,自己对时间进行了cache,用来减少对gettimeofday()的调用,因为一般来说服务器对时间的精度要求不是特别的高,不过如果需要比较精确的timer,nginx还提供了一个timer_resolution指令用来设置时间精度,具体的机制再后面会做介绍。在ngx_times.c中提供了ngx_time_update()函数来更新时间缓存,

2014-11-18 23:16:35 1638 1

原创 nginx源码分析--nginx进程间通信

Linux下的IPC很多,nginx的进程都是有亲缘关系的进程,对于他们的通信我们选择TCP socket进行通信。   TCP socket 用来做进程通信的好处有,   1.socket是文件描述符,操作简单。 2.双向流动。3.另外还有一个重要好处:可记录可重现,我们可以用tcpdump抓取信息,方便调试。当然对于进程间大量数据的共享 自然而然的我们采用共享内存。采用socketpa

2014-11-15 07:50:01 1637

转载 nginx启动期都做了哪些事

nginx是个多进程web容器,不同的配置下它的启动方式也是不同的,这里我只说说最典型的启动方式。它有1个master进程,和多个worker进程(最优配置的数量与CPU核数相关)。那么,首先我们要找到main函数,它在src/core/nginx.c文件中。谈到源码了,这时我们先简单看下源码的目录结构吧。nginx主要有下列目录:src/core,这个目录存放了基础的数据结构

2014-11-14 22:14:46 791

转载 "惊群",看看nginx怎么解决它的

在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群。可以想见,效率很低下,许多进程被内核重新调度唤醒,同时去响应这一个事件,当然只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠(也有其他选择)。这种性能浪费现象就是惊群。惊群通常发生在ser

2014-11-14 07:48:56 844

转载 vim中简单配置

注:这里的vim使用技巧既可用于Linux下的vim,也能用在Windows下的gvim中,1、  打开_vimrc文件(默认在gvim的安装目录下),在文件后面添加syntax enablesyntax onset nucolo torte2、  从http://sourceforge.net/projects/ctags/files/ctags/5.8/ctag

2014-11-13 22:35:19 1414

原创 vim中自动添加注释 添加文本信息

工欲善其事,必先利其器。在开发过程中,方便、快捷的开发环境,能提高工作效率;优美的界面能让我们心情愉悦;最重要的是,能保持我们在外行严重高深莫测的牛逼~  如果在创建新的源程序文件时希望能自动产生一些注释,比如作者、创建日期,联系方式等,可以这样做:  编辑~/.vimrc 文件,加入代码:  autocmd BufNewFile *.[ch],*.hpp,*.cpp exec ":c

2014-11-13 22:32:48 1913

转载 为什么muduo中的shutdown没有直接关闭TCP连接?

今天收到一位网友来信:在 simple 中的 daytime 示例中,服务端主动关闭时调用的是如下函数序列,这不是只是关闭了连接上的写操作吗,怎么是关闭了整个连接?void DaytimeServer::onConnection(const muduo::net::TcpConnectionPtr& conn) 2: { 3: if (conn->con

2014-11-13 21:16:57 1211

原创 n个骰子各点数和出现的概率--动态规划

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。声明思想非原创!只因动态规划思想的使用很好,记下!分析:动态规划就是分阶段考虑问题,给出变量,找出相邻阶段间的关系。具体定义给忘了。1.现在变量有:骰子个数,点数和。当有k个骰子,点数和为n时,出现次数记为f(k,n)。那与k-1个骰子阶段之间的关系是怎样的?2.当我有k-1个骰子时

2014-11-12 19:01:52 5058

原创 C++类特殊成员变量(引用、静态、常成员变量)的初始化操作

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:a.引用b.常量c.静态d.静态常量(整型)e.静态常量(非整型)    常量和引用,必须通过参数列表进行初始化。    静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。参考下面的代码以及其中注释:

2014-11-09 16:41:55 1755

原创 STL中heap的使用方法

在STL中heap的用法主要是make_heap(),push_heap(),pop_heap()的用法。具体均在代码中:// range heap example  用heap构造出来的实际上是一棵树#include #include #include using namespace std;int main (){ int myints[] = {10,20,30,5,15

2014-11-09 16:30:44 2927

原创 static关键字在C和C++中的使用方法

一、C语言的static关键字的两种使用方法1)、用于函数内部修饰变量,即函数内的静态变量。这种变量的生存期长于该函数,是的函数具有一定的“状态”,使用静态变量的函数一般是不可重入的,也不是线程安全的,比如strtok()2)用在文件级别(函数体外),修饰变量或函数,变量该变量或函数只能在文本可见,其他文件看不到,也访问不到该变量或函数。二、C++语言的static关键字的四种用法

2014-11-09 15:23:41 1352

转载 muduo源码分析--多线程模型适用场合

“服务器开发”包罗万象,本文所指的“服务器开发”的含义请见《常用模型》一文,一句话形容是:跑在多核机器上的 Linux 用户态的没有用户界面的长期运行的网络应用程序。“长期运行”的意思不是指程序 7x24 不重启,而是程序不会因为无事可做而退出,它会等着下一个请求的到来。例如 wget 不是长期运行的,httpd 是长期运行的。正名与前文相同,本文的“进程”指的是 fork() 系统调用的

2014-11-08 20:43:40 1302

原创 nginx源码分析--高性能服务器开发 常见进程模型

1、高性能服务器对一个高性能服务器来说,处理速度快和资源占用小是典型特性,尤其是当服务器遇到C10K问题的时候(网络服务器在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题)。要做到处理速度足够快,其并发模型的设计相当关键,而要做到资源尤其是内存资源的占用少,就要依赖于其资源分配和资源管理的方案设计。服务器的并发模型设计是网络编程中很关键的一个部分,服务器的并

2014-11-08 20:31:56 2380

原创 nginx源码分析--master和worker进程模型

一、Nginx整体架构正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程。一个较为完整的整体框架结构如图所示:二、核心进程模型启动nginx的主进程将充当监控进程,而由主进程fork()出来的子进程则充当工作进程。nginx也可以

2014-11-08 20:09:45 7848 1

原创 nginx中父子进程工作的主体函数

根据Nginx(0.7.67版本)的代码,对Nginx基本的进程创建,进程主体以及事件处理进行了简要的分析。基本上,父进程(即主进程)一开始会初始化及读取配置,并加载各模块的功能,然后fork()出N个子进程(即工作进程),具有相同的工作逻辑和功能。父进程负责监听信号(如HUP,QUIT等),通过socket pair把信号传递给子进程(子进程间一般不通信)。子进程通过事件来处理父进程

2014-11-08 19:49:07 1208

原创 TCP/IP详解--TCP/UDP优化设置总结& MTU的相关介绍

首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。   其中以太网(Ethernet)的数据帧在链路层   IP包在网络层   TCP或UDP包在传输层   TCP或UDP中的数据(Data)在应用层   它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}   -----------------------------------------

2014-11-08 19:34:37 4721 1

转载 寻找数组中只出现一次的数

首先来看题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。    考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这个数字。这个题目在之前的《位操作基础篇之位操作全面总结》中的“位操作趣味应用”中就已经给出解答了。根据异或运算的特点,直接异或一次就可以找出这个数字。    现在数组中有两个数字只出现1次

2014-11-07 22:33:11 717

nginx源码分析--带注释

nginx源码分析,分析过程中将重要的部分进行了注释,以便理解

2014-11-26

libevent-1.4.12-stable-注释版

注释了libevent中很关键的部分,很重要的接口函数。

2014-03-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除