随笔分类 - C++
摘要:template <typename T> struct singleton_default { private: struct object_creator { object_creator() { singleton_default<T>::instance(); } inline void d
阅读全文
摘要:性能的目标 跑得更快吗?是用更少的资源跑得更快。如果不能兼得,我们通常选择跑得更快,这也是大多数时候性能优化的目的,也有些时候性能优化是为了减少资源消耗。 系统性能的定义 1.吞吐量,系统每s能处理的请求数、任务数 2.时延,系统处理一个请求或者任务的耗时 3.并发数,次级指标,同时接入的客户端数量
阅读全文
摘要:内存池技术是一种饱受争议的技术 争议热点在于到底有没有必要自己实现。 1.内存池技术出现在libc尚不成熟的时候,当时程序经常在运行一段时间后性能下降,当时维护内存池很有必要 2.现在64位服务器经常是32G以上的内存,管理内存碎片意义不打 3.写malloc的各位都是大神,自己写有99%的可能会更
阅读全文
摘要:跳跃表是一种插入、查询、删除的平均时间复杂度为O(nlogn)的数据结构,在最差情况下是O(n),当然这几乎很难出现。 和红黑树相比较 最差时间复杂度要差很多,红黑树是O(nlogn),而跳跃表是O(n) 平均时间复杂度是一样的 实现要简单很多 https://en.wikipedia.org/wi
阅读全文
摘要:1.调用alarm,在调用超过指定时间时产生SIGALARM信号,这涉及到信号处理,而且可能和进程中其他的alarm冲突 2.使用select阻塞在等待I/O上,select内部有时间限制,一次代替在read和write上阻塞超时 3.使用新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项
阅读全文
摘要:设置和影响套接口选项的方法有 1.getsockopt和setsockopt 2.fcntl 3.ioctl getsockopt和setsockopt 这两个方法仅适用于套接字 有两种基本类型的套接口选项:打开或关闭某个特性的二进制标志,取得并返回我们可以设置或检验的特定值的选项,标有标志的列指明
阅读全文
摘要:典型应用于以下场合 1.处理多个描述字时,比如同时处理套接字和磁盘IO、终端IO 2.一个客户同时处理多个套接字 3.服务器既要处理监听套接字,又要处理已连接套接字 4.既要处理TCP、也要处理UDP 5.一个服务器要处理多个服务和协议 I/O多路复用不局限于网络编程,也可以用于其他程序。 UNIX
阅读全文
摘要:概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer { /* Pubsub */ // 字典,键为频道,值为链表 // 链表中保存了所有订阅某个频道的客户端 // 新客户端总是被添加到链表的表尾 dict *pubsub
阅读全文
摘要:前言 C10K problem提出了一个问题,如果1w个客户端连接到server上,间歇性的发送消息,有哪些好的方案? 其中的一种方案是,每个线程处理多个客户端,使用异步I/O和就绪通知机制,redis无疑是一个很好的榜样 redis的特点和C10K proble的契合点 内存数据库; 单线程支持上
阅读全文
摘要:引言 C10K problem提到一种zero-copy的技术,可以提高网络的吞吐量,分布式消息队列kafka中在消费者消费消息的时候根据offset进行zero-copy。linux下的zero-copy通过sendfile API实现。 什么是zero-copy zero-copy在概念上是值操
阅读全文
摘要:什么是C10K问题 I/O策略 软件架构 1.单线程解决多重I/O调用 不要使用阻塞/同步的调用,如果非要这么做,那就采用多进程或者多线程来并发处理。 使用非阻塞的调用和就绪通知策略,当下一个I/O可用时通知调用者。适用于套接字I/O,而不是磁盘I/O. 使用异步的调用和通知策略,当下一个I/O可用
阅读全文
摘要:reactor介绍 reactor的工作模式就像它的名字一样,是一种反射模式,当事件发生时,根据发生的事件调用注册的处理器。 Reactor的优点和应用 Reactor最常用于非阻塞的socket 传统的设计是一种同步的停等协议,读写操作执行后要等待当前fd的下一次可读/写事件,这期间什么都不能干,
阅读全文
摘要:libev是一个开源库,实现了一个reactor模式事件驱动任务调度库。代码非常精简,包含所有实现的.c文件只有不到5000行。 支持的事件类型: ev_io ev_timer ev_periodic ev_signal ev_child ev_stat ev_idle ev_prepare and
阅读全文
摘要:引用类型的返回值与非引用类型的返回值 非引用类型的返回值处理: 调用函数的时候会创建一个临时对象,用函数返回值初始化临时对象与用实参初始化形参是一样的。如果返回值不是引用,会将返回值复制给临时对象,且其返回值既可以是临时对象,也可以是表达式求解的结果。 引用类型的返回值处理: 当函数返回引用类型时,
阅读全文
摘要:char a[10][100] = {"1","2","3","4","5","6","7","8", "9","10"}; char a[10][100] = {"1","2","3","4","5","6"
阅读全文
摘要:通过多路复用构建高性能服务器是一种常见的模型,单个I/O多路复用线程+一组工作线程,I/O线程负责协调分配任务,而实际工作交给工作线程处理。这种模型的好处在于高效并发和充分利用多线程的处理能力。 以memcached的构架图为例 memcached的主线程用epoll监听到EPOLLIN事件,并且触
阅读全文
摘要:做项目过程接触到disque,记录一下。 disque是redis之父开源的基于内存的分布式作业队列,用c语言实现的非阻塞网络服务器。 disque的设计目标:Its goal is to capture the essence of the "Redis as a jobs queue" use
阅读全文
摘要:zeromq是什么? zeromq是一套专注于消息通信的网络库,把它称作消息队列其实不恰当,zeromq的竞争对手也不是kafka、rocketmq、memchedmq这些消息队列。 zeromq不是什么? zeromq不是对socket的封装,可以认为zeromq在应用层和传输层之间又构建了一层。
阅读全文
摘要:许多异步操作需要申请一个对象来保存操作状态,比如,win32需要OVERLAPPED导出的对象来传递给win32 API函数。此外,程序通常包括简单的可辨明的异步操作链,一个半双工协议(比如HTTP)为每一个client保存一个异步操作链(发送以后就是接收),一个全双工的协议可能拥有两个并行执行的
阅读全文
摘要:许多广泛应用的网络协议是基于行的,这意味着许多协议元素通过"\r\n"来分割,比如HTTP、SMPT、FTP,为了更方便的实现基于行的协议,和其他基于分隔符的协议一样,Boost::Asio包括了read_until() 和async_read_until()。下面的例子阐述了async_read_
阅读全文