自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 Nginx高级数据结构源码分析(五)-----红黑树

红黑树是一种二叉平衡树,在每一个结点增加了一个存储位表示结点的颜色,以维持它的平衡。红黑树性质(1)红黑树结点有如下域:color,key,left,right,p;我们把这些NIL结点是为指向外结点的指针,可以自己定义;(2)每一个结点不是红的就是黑的,根节点和NIL结点都是黑的;(3)如果一个节点是红的,那么它的父亲和两个孩子都是黑的;(4)

2015-08-28 19:49:13 820

原创 Nginx高级数据结构源码分析(四)-----内存池

内存池的使用給Nginx带来了很多好处,比如内存使用的便利,逻辑代码的简化以及程序性能的提升。几个关键知识点罗列如下:(1)函数ngx_palloc()尝试从内存中分配size大小的内存时,分两种情况,一种是size大小小于pool->max,称为小块内存分配,若当前内存池节点小于size,则申请一个新的等同大小的内存池节点,然后从这个新内存池节点分配出size大小的内存空间。若size

2015-08-27 17:24:33 577

原创 二叉树各种遍历的实现(递归、非递归、层次、高度和节点数目)

以下代码将实现下列函数:(1)建树(2)递归前序遍历(3)递归中序遍历(4)递归后序遍历(5)非递归前序遍历(6)非递归中序遍历(7)非递归后序遍历(8)层次遍历(9)树的高度(10)节点数目#include#include#include#includeusing namespace std;struct BinaryTree{

2015-08-27 15:07:22 664

原创 字符串操作的实现:strstr、strcat、strcmp和stcpy

几个重点强调一下:(1)注意使用assert;(2)strcat 和 strcpy最后注意赋值'\0';(3)strcpy注意内存覆盖的情况;(4)strcmp中:while(!(ret = *(unsigned char *)s1 - *(unsigned char *)s2) && *s2 != '\0');???为什么要转换类                  型;(5)

2015-08-27 15:02:46 1015

原创 字符串类的实现:构造函数、析构函数、复制构造函数和赋值操作符

强调一下几个重点:(1)new 操作符申请内存失败,是抛出异常,并不是返回NULL,若想申请失败返回NULL,需要加 (std::nothrow);(2)使用std::nothrow 需要加头文件 #include(3)使用assert(4)构造函数有参数时最好加默认参数,这样就有默认构造函数了,且不要忘了定义为const(5)赋值操作符函数体if语句中的条件必须是 this

2015-08-27 10:14:22 2035

原创 Nginx高级数据结构源码分析(三)-----链表

ngx_list_t是Nginx封装的链表容器,使用的很频繁。它有两个结构体,ngx_list_t描述的是整个链表,而ngx_list_part_t只描述链表的一个元素。为了方便理解,我们可以将它称为数组的链表。也就是是说,ngx_list_t是一个链表容器,而链表中的元素又是一个数组。事实上,ngx_list_part_t数组中的元素才是用户需要存储的东西。这样的结构表达方式有什么样的好处:

2015-08-26 17:21:29 506

原创 Nginx高级数据结构源码分析(二)-----动态数组

ngx_array_t是一个顺序容器,它在Nginx中被大量使用。它以数组的形式存储元素,并支持在达到数组容量的上限动态时改变数组的大小。它类似于C++中的vector容器,而且内置了Nginx封装的内存池,因此,它分配的内存也是在内存池中申请得到。        ngx_array_t具备以下三个优点;        (1)访问速度快;(2)允许元素个数具备不确定性;(3)负责元

2015-08-26 15:59:40 485

原创 排序方法总结和实现

由于很多大神已经总结过各种排序算法的性能及适合坏境,这里便不再总结,只是强调几个重点。(1)快排的空间复杂度不是o(1),是o(logn)~o(n);(2)四种不稳定的排序算法:简单选择,快排,希尔和堆排序(3)冒泡排序最有情况下时间复杂度可优化为o(n);(4)归并排序的空间复杂度为o(n);(5)快排在整体倒序的情况下时间复杂度为o(n2)(6)建一个最大堆的复杂度为o

2015-08-26 11:47:04 607

原创 九度 1366 栈的压入弹出序列

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。输入:每个测试案例包括3行:第一行为1个整数n(1第二行包含n个整数,表示栈的压入顺序。第三行包含

2015-08-17 10:04:19 878

原创 C++ Primer 第(4-5)章一句话知识点总结

注意制定每个规则背后的原因。(1)没有所有的元素都是引用的数组。(2)数组的维数必须是大于等于1的常量表达式定义。非const变量以及要到运行时才知道其值的const变量都不能用于定义数组的维数。(3)数组不允许直接赋值。char a[] = {'a'}; 一个字节 ;char a = "a";两个字节(4)指针用于指向单个对象,而迭代器只能用于指向容器内的元素。(5)stri

2015-08-15 21:24:05 439

原创 C++ Primer 第(1-3)章一句话知识点总结

C++ Primer 知识点繁多,容易忘记,故有此总结。需要注意的是许多一句话的规定不要死记硬背,尽量去思考规则背后的原因,便能事半功倍。(1) endl是一个特殊值,称为操作符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。(2) while(cin >> value);输入操作符返回其左操作数,所以括号里测试输入流的状态,当遇到EOF或无效输入时,流状态无效,则导致

2015-08-11 08:55:02 554

原创 nginx高级数据结构源码分析(一)-----双向链表

ng_queue_t是Nginx提供的一个顺序容器,它以双向链表的方式将数据组织在一起。链表作为顺序容器的优势在于,它可以高效的执行插入、删除、合并等操作,在移动链表中的元素时只需要修改指针的指向,因此,它很适合频繁修改容器的场合。相对于其他顺序容器,它的优势有以下三点:  (1)  实现了排序功能,采用额是插入排序,虽然不太适合超大规模数据的排序,但是简单实用。(2)  它非常轻

2015-08-10 20:01:56 572

原创 C++实现基于IO复用模型的echo服务器

IO复用,即IO multiplexing,是使用select/poll/epoll这一系列的多路选择器,可使进程或线程能够处理多个连接;实质上不是复用IO,而是多个IO复用进程或线程;编程模型(1)单进程IO复用服务器,它适合IO密集型的应用,不适合计算密集性的应用,因为计算需要耗费CPU资源,使得其他IO连接无法得到服务;网络延迟也可能会大一些,本来进行一次read系统调用可以

2015-08-09 17:32:33 1161

原创 C++实现基于单线程单客户模型的echo程序

一个客户一个子线程,也是阻塞式网络编程,它的初始化要比一个客户一个进程模型开销要小;但是仍适合于长连接,不适合短连接、并发数不大的情况,尤其不适合pthread_create()的开销大于本身服务的情况;编程模型(1)并发服务器1,类似于一个客户一个进程的并发服务器1,它通常阻塞在accept,阻塞返回后派生一个子线程来处理每个客户端,每一个客户一个线程,创建线程的开销比f

2015-08-08 23:02:05 708

原创 nginx进程间的通信机制源码分析(二)-------原子操作、自旋锁、文件锁

原子操作原子操作指的是由多步组成的一个操作.如果该操作原子的执行,则要么执行玩所有步骤,要么一步也不执行,不可能值执行所有步骤的一个子集.想要使用原子擦操作来修改,获取整型变量,自然不能使用加减号,而要使用nginx提供的两个方法:ngx_atomic_cmp_set和ngx_atomic_fetch_add.static ngx_inline ngx_atomic_uint_tng

2015-08-06 15:49:02 580

原创 c++封装线程池

线程池ThreadPool声明class Thread; class ThreadPool final { public: ThreadPool(const ThreadPool&) = delete; ThreadPool& operator=(const ThreadPool&) = delete; explicit ThreadPool

2015-08-05 21:15:26 524

原创 C++封装互斥量和条件变量

互斥量(1)互斥量是保护临界区的另一种方法,当执行线程在临界区的执行时间很长时,那么就最好使用互斥量了,否则会造成其他的线程将会在临界区外忙等,浪费CPU时间;此时其他线程发现临界区已经被互斥量锁住,那么它们将会阻塞;当互斥量被释放时,有多个线程在阻塞,多个线程均会被唤醒,但是只有一个线程可以获得该锁,其他的线程将会继续阻塞;(2)当执行线程需要在临界区睡眠时,那么就最好使用互斥量

2015-08-04 19:46:46 1188

原创 c++实现基于单进程单客户编程模型的echo程序

一个客户一个子进程,是阻塞式网络编程,适合于长连接,不适合短连接、并发数不大的情况,尤其不适合fork()的开销大于本身服务的情况.编程模型(1)迭代服务器,TCP迭代服务器总是完全处理完某个客户的请求之后才会转向为下一个客户服务,因此对下一个用户的响应时间不够好,比较适合短连接服务(一般会有一方主动断开TCP连接);如果在单核处理器上,由于其没有进程控制的时间,可以使用该程序

2015-08-03 20:02:15 758

空空如也

空空如也

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

TA关注的人

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