自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Nestle的专栏

源码之前,了无秘密。

  • 博客(27)
  • 收藏
  • 关注

原创 【Nginx】HTTP配置模型

当Nginx检测到配置文件中存在配置块http{}时,会建立一个ngx_http_conf_ctx_t结构体,该结构体定义如下:typedef struct { void **main_conf; // 每个指针元素指向所有由HTTP模块的create_main_conf方法产生的结构体 void **srv_conf; // 每个指针

2014-06-24 19:20:00 1724

原创 【Linux编程】XSI IPC

三种IPC被称作XSI IPC,分别是:消息队列信号量共享存储器下面分别介绍三种IPC的用法。1、消息队列消息队列是消息的链接表,具有如下函数接口:msgget:创建一个新队列或打开一个现存的队列。msgsnd:将消息添加到队列尾端。msgrcv:从队列中取消息。我们可以自行定义一个表示消息的结构体,它由类型字段和实际数据组成:struct

2014-06-22 20:08:35 1216

原创 【Nginx】如何处理HTTP配置

同一个配置项可以同时出现多个块内,例如HTTP块、server块、location块。一个配置项到底是取哪个块中的值完全有我们定义的模块决定。处理HTTP配置项分以下4个步骤:创建数据结构用于存储配置项对应的参数设定配置项在配置文件中出现时的限制条件与回调方法实现上述回调方法,或使用Nginx预设的14个回调方法合并不同级别的同名配置项1、分配用于保存配置参数的数据结构

2014-06-21 22:18:33 1781

原创 【Linux编程】存储映射I/O

存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射,对缓冲区的读、写操作就是对文件的读、写操作,从而可以不再使用read、write系统调用。将文件映射到存储区的函数由mmap完成,函数原型如下:#include /* 成功返回映射区起始地址,出错返回MAP_FAILED */void *mmap(void *addr, size_t len, int prot,

2014-06-21 11:17:16 1363

原创 【Nginx】将磁盘文件作文包体发送

接上一篇文章,当Nginx以文件作为用户的请求时,它不会把文件内容读入内存,然后再从内存发送出去,而是会调用sendfile系统调用在不经过用户空间的情况下,从内核直接发送出去。这样做显然效率要更高,Nginx也为我们封装好了一系列的接口,下面就来说明如何发送一个磁盘文件给客户端。和从内存直接发送数据最大的不同在于ngx_buf_t缓冲区的设置方法,ngx_buf_t结构体的定义如下:

2014-06-18 22:00:33 2211

原创 【Nginx】开发一个简单的HTTP模块

首先来分析一下HTTP模块是如何介入Nginx的。当master进程fork出若干个workr子进程后,每个worker子进程都会在自己的for死循环中不断调用事件模块:for ( ;; ) { .... ngx_process_events_and_timers(cycle); /* 调用事件模块 */ .... }

2014-06-17 21:56:07 5755 1

原创 拥塞避免算法

当网络中的某个节点发生了拥塞,源主机会得到两种分组丢失的指示:发生超时接收到重复的确认拥塞避免算法和慢启动算法相互独立,但发生拥塞时,需要依赖慢启动算法实现拥塞避免。在实际中这两个算法通常一起实现。下面详细分析拥塞避免算法的流程:连接建立后,拥塞窗口cwnd初始化为1个报文段,慢启动门限ssthresh初始化为65535字节。当发生拥塞时(超时或受到重复确认),ss

2014-06-15 14:39:22 1678 1

原创 【Nginx】HTTP请求的11个处理阶段

Nginx将一个HTTP请求分成多个阶段,以模块为单位进行处理。这样做的好处是使处理过程更加灵活、降低耦合度。HTTP框架将处理分成了11个阶段,各个阶段以流水线的方式处理请求。这11个HTTP阶段如下所示:typedef enum { NGX_HTTP_POST_READ_PHASE = 0, // 接收到完整的HTTP头部后处理的阶段 NGX_HTTP_SERVER

2014-06-14 21:41:31 8430

原创 【Nginx】监听端口的管理

监听端口属于server虚拟主机,由server{}块内的listen配置项决定。在处理配置文件http块内main级别的配置项时,每个HTTP模块都会调用create_main_conf、create_srv_conf、create_loc_conf三个方法建立三个结构体,用来分别存储http块、server块、location块内的配置项。ngx_http_core_module是

2014-06-14 19:46:00 7299

原创 快速排序

实践中最快的已知排序算法。平均效率=O(NlogN)的递归算法。算法的思想是,先找出数列中的一个枢纽,然后在每次递归中,把小于枢纽的元素放枢纽左边,大于枢纽的元素放数组右边,即先做到“大概有序”,再切分数组,逐步递归达到全局有序。注意和归并排序的区别:快速排序先调整,后递归。归并排序先递归,后调整。小数组(N代码:#include

2014-06-14 15:13:32 798

原创 【Nginx】HTTP框架概述

HTTP框架的首要任务就是通过调用

2014-06-13 20:47:33 1529

原创 【Linux编程】线程同步

如果每个线程使用的变量都是其它线程不会读取或修改的,那么就不存在一致性问题。同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题。否则,将会出现不一致性问题。为了解决数据不一致问题,必须引入某些机制使线程间同步。 当变量修改时间多于一个存储器访问周期,同时读、写操作又相互交替时,潜在的不一致性就会出现。如下图所示:此时,线程B读取到的数据是错误的。使用一

2014-06-13 12:59:53 1091

原创 慢启动与拥塞窗口

在局域网中,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。但是,如果收发双方不在同一个局域网中,那么发送方一直发送可能会出问题,因为中间路由器有可能发生拥塞,拥塞是指一个或者多个交换点的数据报超载而导致时延剧烈增加的现象。为了解决这个问题,TCP支持一种被称为“慢启动”的算法,该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。为了控制

2014-06-12 12:43:14 2526

原创 TCP滑动窗口

TCP的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据。滑动窗口的大小由接收方确定,接收方在发送确认信号给发送方的同时告诉发送方自己的缓冲区大小(在TCP头部字段中),发送方根据此大小确定窗口大小,从而控制数据发送量。同时,滑动窗口协议允许发送方在停止并等待确认前可以连续发送多个分组,由于发送方不必每发一个分组就停下来等待确认,因此该协议可以

2014-06-11 19:46:57 1624

原创 【Linux编程】竞争条件

当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程进行的顺序时,则我们认为这发生了竞争条件。一个例子是在fork出子进程之后,父、子进程的执行顺序是不确定的,这种不确定决定了后面程序的结果,那么这便产生了一个竞争条件。如果一个进程希望等待一个子进程终止,则它必须调用wait或waitpid函数。如果一个进程要等待其父进程终止,则可使用如下的轮询方式:while (

2014-06-10 11:20:10 1728

原创 动态规划 — 计算二项式系数

如果问题是由交叠的子问题所构成的,那么我们就可以用动态规划技术来解决它。也就是说,一个问题的解可由它的规模更小的子问题的解递推得出。由于子问题的交叠性质,所以采用递归地方法一次又一次地求解子问题时,进行了很多重复的工作。所以动态规划法建议:把子问题的解存入某个表中,通过表一步步反解出原始问题。斐波那契数列就是一个很好的例子:F(n) = F(n-1) + F(n-2)     当n≥2F(

2014-06-09 19:40:09 5935

原创 三次握手建立连接

建立连接的过程如下:客户端发送一个SYN段表示发起连接请求,该段中包含一个初始序号ISN。服务器也发送一个SYN段并包含它自己的初始序号ISN,同时设置ACK标志表示对上一个客户端的SYN的确认,确认序号为客户端的ISN值加1,该确认序号表示服务器希望下一次收到的起始序号。客户端再发送一个ACK以确认服务器发来的SYN,确认序号为服务器ISN加1,含义同上。三次握手完成,连接建立。

2014-06-07 13:40:35 1345

原创 【Linux编程】文件系统的分区、硬链接、软链接

首先从磁盘结构讲起。按结构从小到大区分:扇区,固定512字节磁道柱面,分区时的最小单位,开始柱面到结束柱面为一个分区第一个扇区很重要,它包括:主引导分区MBR(446字节),内含引导加载程序Boot loader。它有如下功能:提供菜单:可选择不同的系统进行加载,多操作系统的基础加载内核文件:直接加载可使用的操作系统内核程序转交其它Boot loader:跳

2014-06-06 19:18:18 1217

原创 TCP首部

TCP的数据被封装在一个IP数据报中:TCP首部如下图所示:下面以此讲解这些字段的含义。16位源端口号、16位目的端口号。用于寻找发送端和接收端应用进程。一个IP地址(IP首部)加一个端口号(TCP首部)称为一个套接字,一对套接字可唯一确定一个TCP连接。32位序号。用来标识数据字节流中的字节,它的值表示该报文段中第一个数据字

2014-06-05 19:52:33 3196

原创 符串匹配 — Sunday

此算法比BM算法的效率还要高。Sunday算法没有规定必须从模式头部开始比较还是从模式尾部开始比较。所以两种方法都是可以的。下面是个例子,假设从头开始比较。文本:A B C A B D B C D模式:B C DA≠B,那么查看文本中越出比较范围后的第一个字符(这里为A)是否在模式中,如果在,则两者对齐,否则跳过A。这里直接跳过A。文本:A B C A B D

2014-06-04 16:17:55 1078

原创 UDP用户数据报协议和IP分组

UDP整体的封装格式如下:下面是8字节UDP首部:当IP层根据协议字段把UDP报文向上传送到UDP模块后,UDP模块再根据端口号将数据发送到相应的进程中,以此实现进程到进程间的通信。16位UDP长度代表UDP首部和UDP数据的总字节数。长度最小可以为8,即数据段不包含实际内容。以下是抓包结果:不

2014-06-04 14:11:22 4392

原创 【8】自己写数据库函数库 — 编译函数库

写出了函数库的源代码,最后一步当然是要编译处函数库了。库函数

2014-06-03 22:26:48 1056

原创 【7】自己写数据库函数库 — 遍历数据库

遍历数据库要有两个函数来p

2014-06-03 21:52:52 1188

原创 【6】自己写数据库函数库 — 存储记录

存储记录的han

2014-06-03 21:45:40 970

原创 字符串匹配 — BM算法

和Horspool不同的是,算法在失配时不光要看那个不配对的字符,而且还要看已经有多少个字符成功配对,把这两个信息相结合得出模式需要移动的距离。此算法在开始匹配之前需要建立两个表:坏符号移动表和好后缀移动表。坏符号移动表的求法和Horspool的求法一样,但好后缀移动表的计算就有一点复杂了。代码如下:效率分析:BM算法的最差效率是线性的,当字母表规模很大时,速度

2014-06-03 16:28:19 1238

原创 ICMP:Internet控制报文协议

ICMP:Internet控制报文协议。是IP层的组成部分,传递差错报文或其它信息。ICMP报文被封装在IP数据报内部:具体格式如下所示:个字段含义如下:8位类型。表示该ICMP报文的含义,如目的不可达、超时、请求回显等。8为代码。进一步描述该ICMP报文。ICMP报文的类型由类型字段和代码字段共同决定。16位检验和。和I

2014-06-03 13:44:33 1491

原创 【5】自己写数据库函数库 — 删除一条记录

删除一条记录的ji

2014-06-03 10:46:16 1484

空空如也

空空如也

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

TA关注的人

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