- 博客(46)
- 资源 (12)
- 收藏
- 关注
原创 STL之仿函数实现详解
1、何为仿函数仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。 仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。仿函数本质就是类重载了...
2018-03-28 21:34:19 22881 4
转载 一致性Hash(Consistent Hashing)原理剖析
https://blog.csdn.net/lihao21/article/details/54193868 引入在业务开发中,我们常把数据持久化到数据库中。如果需要读取这些数据,除了直接从数据库中读取外,为了减轻数据库的访问压力以及提高访问速度,我们更多地引入缓存来对数据进行存取。读取数据的过程一般为: 图1...
2018-03-27 18:57:09 1561
转载 Nignx服务器CLOSE_WAIT和TIME_WAIT过高分析
来自:http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下:http://blog.csdn.net/shootyou/article/details/6615051里头的分析过程有提到,通过查看服务器网络状态检测到服务器有大量的CLOSE_WAIT...
2018-03-27 15:48:22 2187 1
原创 STL之hash_set和hash_multiset、hash_map和hash_multimap详解
hash_set1、介绍 虽然STL只规范复杂度和接口,并不规范实现方法,但STL set多半以RB-tree为底层机制。SGI在标准之外提供了hash_set,以hashtable作为底层机制。用set为的是能快速搜寻元素。这一点无论底层是RB-tree还是hashtable都能实现。但RB-tree有自动排序能力(二叉树特性)而hashtable(肯定没有啊)没有,其结果就是set元...
2018-03-24 22:06:47 731
原创 STL之hashtable详解
hash介绍前面讲解二叉树实现键和值的存储。平衡二叉树就是插入和搜寻的速度非常快。那么我们是否可以使用一种方法,将键和值都存在在一段连续的空间内呢?可以,我们只需要将键通过一个函数映射成一个整数即可。这样在时间和空间上面做到了平衡,因为查找很快,索引也很快。关键在于散列函数和碰撞处理,很简单,具体可以参考。 **碰撞处理主要是线性分离(通过链表处理)和线性探测。**SGI-STL采用了线性分...
2018-03-24 21:24:02 4076 2
原创 STL之set和multiset、 map和multimap详解
基本用法参考这篇,本篇主要讲解内部实现过程。set和multiset介绍set/multiset以底层红黑树为结构,set的key和value是合一的,value就是key,因此通过比较key插入平衡二叉树,因此可以可以通过迭代器,从小到大输出key,也就是所谓的自动排序,二叉树以及排好序了。禁止通过迭代器修改key,否则二叉树结构变化了。特性和set集合差不多,唯一的区别就在于允许键...
2018-03-21 19:03:04 1428
原创 HTTP协议简单解释
#1、简单的HTTP协议HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同, 用于客户端和服务器之间的通信。请求访问文本或图像等资源的一端称为客户端, 而提供资源响应的一端称为服务器端。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4G5InmmX-1670146185875)(//img-blog.csdn.net/20180321104418441?waterma
2018-03-21 10:47:38 128152 8
转载 关于HTTP协议,一篇就够了
关于HTTP协议,一篇就够了 HTTP简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HT...
2018-03-21 00:47:40 4172
原创 TCP交互数据流及成块数据流
引言建立在TCP协议上的应用层协议有非常多,如FTP、HTTP、Telnet等。这些协议依据数据传输的多少能够分为两类:交互数据类型和成块数据类型。交互数据类型,如:Telnet。这类协议一般仅仅做小流量的数据交换,比方每按下一个键,要回显一些字符。成块数据类型,如:FTP,这类协议须要传输的数据比较多。一般传输的数据量比较大。针对这两种不同的情况,TCP采用不同的策略进行数据传...
2018-03-20 22:02:22 3874 1
原创 预防死锁的银行家算法
安全与不安全状态安全状态:如果没有死锁发生,并且即使所有的进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每个进程运行完毕,那么称该状态安全。 这里使用完后,必须理解归还给系统。不安全状态:下图说明了不安全,不安全不一定发生死锁,只是安全一定不会发生死锁。 ...
2018-03-20 21:16:44 569
原创 Linux经典同步问题3-读者与写者问题
1、问题描述 简而言之就是,对一个共享内存,都可读但只能一个写。2、读者优先解决方案读进程只要看到有其他读进程正在访问文件,就可以继续作读访问;写进程必须等待所有读进程都不访问时才能写文件,即使写进程可能比一些读进程更早提出申请。semaphore mutex = 1;//对readcount保护semaphore db = 1;//对数据库保护int readrCount ...
2018-03-20 16:14:33 1659
原创 Linux经典同步问题2-哲学家就餐问题
死锁 死锁是 《操作系统原理》课程中的1个很重要的概念, 它描述的是多个进程因竞争资源而造成的1种僵局 ,若无外力作用 ,这些进程将永远不能再向前推进。产生死锁的原因主要有2点: 1是竞争资源 ; 2是进程推进顺序不当。1、哲学家就餐问题一张圆桌上坐着 5 名哲学家,桌子上每两个哲学家之间摆了一根叉子,桌子的中间是一碗米饭,如图所示,并且假如按照下面方式进行编号,那么第i为科学家,它的左手边筷
2018-03-20 15:46:44 5915
转载 高性能网络服务器7--TCP连接的内存使用
当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。socket编程方法提供了SO_SNDBUF、SO_RCVBUF这样的接口来设置连接的读写缓存,linux上还提供了以下系统级的配置来整体设置服务器上的TCP内存使用,但这些配置看名字却有些互相冲突、概念模糊的感觉,如下(sysctl ...
2018-03-20 00:15:31 233
转载 高性能网络服务器6--reactor反应堆与定时器管理
反应堆开发模型被绝大多数高性能服务器所选择,上一篇所介绍的IO多路复用是它的实现基础。定时触发功能通常是服务器必备组件,反应堆模型往往还不得不将定时器的管理囊括在内。本篇将介绍反应堆模型的特点和用法。首先我们要谈谈,网络编程界为什么需要反应堆?有了IO复用,有了epoll,我们已经可以使服务器并发几十万连接的同时,维持高TPS了...
2018-03-20 00:13:51 203
转载 高性能网络服务器5--IO复用与并发模型
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发。服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持...
2018-03-20 00:12:53 348
转载 高性能网络服务器4---TCP连接的关闭
TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。为方便阅读,我们可以带着以下5个问题来阅读本文:1、当socket被多进程或者多线程共享时,关闭连接时有何区别?2、关连接时,若连接上有来自对端的还未处理的消息,会怎么处理?3、关连接时,若连接上有本进程待发送却未来得及发送出的消...
2018-03-20 00:11:00 705
转载 高性能网络服务器3--TCP消息的接收
这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读:1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?2、若socket为默认的阻塞套接字,此时...
2018-03-20 00:09:37 661
转载 高性能网络编程2--TCP消息的发送
在高性能网络编程1–accept建立连接中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字。操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,在操作系统内核中发生了什么事情呢?我们带着以下3个问题来细细分析:发送方法成功返回时,能保证TCP另一端...
2018-03-20 00:06:50 175
转载 高性能网络编程1--accept建立连接
最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现...
2018-03-20 00:05:05 192
原创 Linux进程控制之深入理解fork
进程标识深入理解fork 创建新的进程,调用一次返回两次。父进程返回子进程ID,子进程返回0,之后子进程和父进程继续执行fork之后的指令。子进程获取父进程的数据空间、堆、栈的副本。父子进程不共享这些存储空间,但是代码段(正文段,指令)是父子进程共享的,这点可以参考C程序内存空间布局,这个很重要哦。传统fork vs 写时拷贝fork首先每个进程都是由实体的,有实际的...
2018-03-19 20:56:04 1287
原创 进程、僵死进程、孤儿进程、守护进程
僵死进程子进程在父进程之前终止了,内核为每个终止子进程保存了一定量的信息,所以父进程需要调用waitpid可以得到这些信息,包括进程ID、终止状态、使用的CPU时间总量,内核可以释放终止进程所使用的内存空间及其打开的文件描述符。一个已经终止,但是其父进程尚未对其进行善后处理(获取信息,释放资源)的进程称为僵死进程。通过ps命令,我们可以看到该进程的状态为Z(表示僵死)。fork很多子进程,除非...
2018-03-19 15:59:53 354
原创 STL之tree的实现详解
1、红黑树介绍关联容器都有一个key(键)和一个value(值)。当元素被插入到关联式容器中时,内部结构依照其键值的大小,以特定的规则将元素放到合适的位置(实现查找算法吧)。 一般关联时容器内部结构是一个平衡二叉树,用于在恶劣的环境下获得良好的搜寻效率。平衡二叉树的实现有:AVL-tree、RB-tree、AA-tree。用的最广的就是RB-tree,不论是在Nginx还是Linux内核任务...
2018-03-17 21:46:27 11110 1
原创 调试错误:invalid initialization of non-const reference of type
error: invalid initialization of non-const reference of type ‘std::__cxx11::string& {aka std::__cxx11::basic_string&}’ from an rvalue of type ‘std::__cxx11::string {aka std::__cxx11::basic_stringclass
2018-03-17 21:28:30 20072 1
原创 STL之priority_queue实现详解
优先队列优先队列可以从尾部插入元素,然后从头部取出优先级(通过一个数值表示)最高的对象。这种支持插入,然后每次仅仅取出一个对象数据结构,完全天然和堆一一对应,所以通过堆实现优先队列适配器是天然的选择。也就是说最大堆其实就是优先队列。优先队列没有迭代器,进出都有一定的规则,只有queue顶端的元素(权重最高者),才有机会被外界取用。STL源码#ifndef __STL_LIMIT...
2018-03-17 21:21:39 1469
原创 STL之heap实现详解(内部使用)
堆先前的文章已经对堆说得足够清楚了,可以参考。 可以参考 libevent之最小堆 经典排序算法堆无非就是分为最大堆(父节点大于等于子节点)和最小堆(父节点小于等于子节点)。STL里面实现的都是最大堆。还有就是堆一般通过数组实现。那么问题就有两个。假如不用数组索引0的位置,那么算法会很简单,那么N的父节点索引就是N/2;N的左右子节点分别是2N和2N+1。假如使用了索引0位置,那么N...
2018-03-16 22:09:05 2074 1
原创 STL之queue实现详解
队列承接上节栈的讲解,因为实现的list和dqueue这种双进双出的底层容器,那么对于queue这种适配器,实现起来就非常简单了。queue具有先进先出的数据结构。仅仅支持新增元素、移除元素、从最底端加入元素、取最顶端元素。这些方法而已。只要细心分析了deque,这个适配器就很容易了。 STL-queue实现起来非常简单,那么直接给出源代码,解释其中比较重要的地方。 队列不提供迭代...
2018-03-15 21:35:22 7011
原创 STL之stack实现详解
STL栈介绍stack是先进先出,没有迭代器,只允许push和pop操作以及读取和修改栈顶top元素的操作。由于stack利用了底层容器实现工作,所以称之为配接器而已。 栈的完整定义#define __STL_NULL_TMPL_ARGS <> //模板传入的是一个类template <class T, class Sequence = deque<T...
2018-03-13 14:57:28 3229 1
原创 STL之deque实现详解
何为dequedeque是双向开口的连续线性空间(动态将多个连续空间通过指针数组接合在一起),随时可以增加一段新的空间,所以数据想vector里面的分配,复制,释放操作不会发生。deque头尾两端分别做插入和删除操作都是常数时间。能用vector尽量使用vector,通过deque用来做队列即可,十分方便的。不浮躁,慢慢看,就会理解其中的奥妙。 花了半天的时间仔细看了一遍SGI-STLd...
2018-03-13 14:56:27 30194 7
原创 数据结构之数组
数组可以说是最简单的一种数据结构,它占据一块连续的内存并按照顺序存储数据。创建数组时,我们需要首先指定数组的容量大小,然后根据大小分配内存。即使我们只在数组中存储一个数字,也需要为所有的数据预先分配内存。因此数组的空间效率不是很好 , 经常会有空闲的区域没有得到充分利用。 深入理解数组题目1、二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按...
2018-03-12 14:14:32 1012
原创 STL之list实现详解
STL中的list容器底层数据结构用的是双向链表。这样数据在存储和删除的时候都可以做到时间复杂度是O(1)。但是由于其存储空间并不是连续的,所以导致在里面查找数据会很不容易。1、介绍list如何使用的demo#include <iostream>#include <list>#include <algorithm>#include <...
2018-03-11 21:30:06 1430
原创 Libevent之信号事件管理
1、原理性介绍:1、Linux操作系统,对于信号的处理,都是调用先前注册给系统的回调函数,例如通过sigaction(evsignal, &sa, sig->sh_old[evsignal])注册回调了sa里面的回调函数。当对应的信号到来时候,将调用相应的回调函数。2、Libevent为了将信号事件和IO事件统一起来,即对于信号的处理也通过epoll可以检测到。因此Libev...
2018-03-07 23:59:52 1922
原创 Libevent之定时器事件管理
事件如何管理先来对应的demo#include <event.h>struct event ev;struct timeval tv;void time_cb(int fd, short event, void *argc){ printf("timer wakeup\n"); event_add(&ev, &tv); // reschedu...
2018-03-07 23:56:14 877
原创 数据结构之树
https://blog.csdn.net/xiaominkong123/article/details/51567437 https://www.cnblogs.com/gl-developer/p/7259251.html https://www.cnblogs.com/fly-me/p/wei-ti-jiaoer-cha-shu-de-si-zhong-bian-li-fang-fa.h...
2018-03-05 14:41:45 535
原创 数据结构之链表
链表:将很多块内存区域通过指针的形式连接起来。其中在每块没存区域都存储了上一块数据或者下一块数据的地址,链表的优点在于删除元素和添加元素都非常快速。为了写出鲁棒性好的程序,防御性编程很重。对于指针必须考虑当指针为空的情况,对于字符串考虑内容为空的情况。对于链表的题目大多数都是通过遍历解决的。理解链表的练习题1、求单链表中的倒数第k个节点 输入一个键表,输出该链表中倒数第k个...
2018-03-05 14:41:12 1068
CCSv6 License
2017-09-20
TCP/IP进行网际互联 卷1 原理、协议与结构和TCP-IP详解卷一:协议
2017-09-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人