07 2021 档案

摘要:一、智能指针 1.1为何使用智能指针 首先我们先谈为何需要智能指针,C++11之前操作堆内存空间都是使用new,delete来维护,但是很容易造成new出来的内存忘记delete,开发人员需要大量时间维护修复。而new出来返回的指针也叫裸指针。 1)裸指针:直接用new返回的指针。这种指针强大,灵活 阅读全文
posted @ 2021-07-31 11:02 Mr-xxx 阅读(429) 评论(0) 推荐(0)
摘要:一、介绍 lock_guard和unique_lock都是RAII机制下的锁,即依靠对象的创建和销毁也就是其生命周期来自动实现一些逻辑,而这两个对象就是在创建时自动加锁,在销毁时自动解锁。所以如果仅仅是依靠对象生命周期实现加解锁的话,两者是相同的,都可以用,因跟生命周期有关,所以有时会用花括号指定其 阅读全文
posted @ 2021-07-30 20:06 Mr-xxx 阅读(2753) 评论(0) 推荐(0)
摘要:1、阻塞队列/线程安全队列 实现: 注意问题: 1、防止虚假唤醒的lambda表达式需要传入this,也就是调用变量 2、lambda表达式的函数体不可以使用自己写的判断队列满或者空函数 template <typename T> class block_queue { public: block_ 阅读全文
posted @ 2021-07-30 11:33 Mr-xxx 阅读(354) 评论(0) 推荐(0)
摘要:一、介绍 .plt的作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址 .rel.dyn重定向表,在程序启动时就需要重定位完成。 .rel.plt保存了重定位表的信息,可以使用lazy的连接方式 .got据说是保存了elf文件本身的各个符 阅读全文
posted @ 2021-07-29 17:02 Mr-xxx 阅读(855) 评论(0) 推荐(0)
摘要:一、引言 Memcached采用LRU(Least Recent Used)淘汰算法,在内存容量满时踢出过期失效和LRU数据,为新数据腾出内存空间。不过该淘汰算法在内存空间不足以分配新的Slab情况下,这时只会在同一类Slab内部踢出数据。即当某个Slab容量满,且不能在内存足够分配新的Slab,只 阅读全文
posted @ 2021-07-29 15:41 Mr-xxx 阅读(154) 评论(0) 推荐(0)
摘要:一、为什么使用缓存 如图1,为了快速应对早期的业务快速发展,我们架设一个超级简单的Web服务,只有一台应用服务器和DB,这种架构简单,便于快速开发和部署。但随着应用服务器的QPS不断增长,水涨船高,DB的QPS也逐渐提升,对DB的响应时间也有很高要求,单DB已无法快速满足业务发展。这时候可以考虑对D 阅读全文
posted @ 2021-07-28 21:39 Mr-xxx 阅读(153) 评论(0) 推荐(0)
摘要:一、Libevent简介 Libevent是开源社区一款高性能的I/O框架库,其具有如下特点: 1、跨平台支持。Libevent支持Linux、UNIX和Windows。 2、统一事件源。libevent对i/o事件、信号和定时事件提供统一的处理。 3、线程安全。libevent使用libevent 阅读全文
posted @ 2021-07-25 23:12 Mr-xxx 阅读(530) 评论(0) 推荐(0)
摘要:一、简介 move语义使得你可以用廉价的move赋值替代昂贵的copy赋值,完美转发使得你可以将传来的任意参数转发给其他函数,而右值引用使得move语义和完美转发成为可能。然而,慢慢地你发现这不那么简单,你发现std::move并没有move任何东西,完美转发也并不完美,而T&&也不一定就是右值引用 阅读全文
posted @ 2021-07-25 09:38 Mr-xxx 阅读(799) 评论(0) 推荐(0)
摘要:一、TCP三次握手除了建立连接(发送SYN、SEQ、ACK),还会完成什么工作(也就是在报文的传输过程中还会携带什么信息) (1)最大报文段长度(MSS)选项 TCP连接初始化时,通信双方使用该选项来协商最大报文段长度,防止IP分片。每一方都有用于通告它期望接收的MSS选项(MSS选项只能出现在SY 阅读全文
posted @ 2021-07-24 17:09 Mr-xxx 阅读(79) 评论(0) 推荐(0)
摘要:TCP的选项有哪些内容 TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。典型的TCP头部选项结构如图所示。 选项的第一个字段kind说明选项的类型,有的TCP选项没有后面两个字段,仅包含 阅读全文
posted @ 2021-07-24 17:05 Mr-xxx 阅读(765) 评论(0) 推荐(0)
摘要:一、协程如何被调度? 调度器的实现,有两种方案,一种是生产者消费者模式,另一种多状态运行。 1.1 生产者消费者模式 逻辑代码如下: 1 while (1) { 2 3 //遍历睡眠集合,将满足条件的加入到ready 4 nty_coroutine *expired = NULL; 5 while 阅读全文
posted @ 2021-07-24 16:04 Mr-xxx 阅读(196) 评论(0) 推荐(0)
摘要:一、什么是CPU缓存 1.1 CPU缓存的来历 众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据。在很多年前,CPU的频率与内存总线的频率在同一层面上。内存的访问速度仅比寄存器慢一些。但是,这一局面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线 阅读全文
posted @ 2021-07-24 11:56 Mr-xxx 阅读(654) 评论(0) 推荐(0)
摘要:一、介绍 概念:线程局部存储(Thread Local Storage,TLS)用来将数据与一个正在执行的指定线程关联起来。 进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量。在一个线程修改的内存内容,对所有线程都生效。这是一个优点也是一个缺点。说它是优点,线程 阅读全文
posted @ 2021-07-23 23:13 Mr-xxx 阅读(360) 评论(0) 推荐(0)
摘要:1.libco简介 libco是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上,使得微信后端服务能同时hold大量请求,被誉为微信服务器稳定性的基石。libco在2013年的时候作为腾讯六大开源项目首次开源。libco源码地址 libco首先能解决CPU利用率与 阅读全文
posted @ 2021-07-23 16:56 Mr-xxx 阅读(753) 评论(0) 推荐(0)
摘要:引言 生产者消费者模型 1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <queue> 5 #include "co_routine.h" 6 using namespace std; 7 str 阅读全文
posted @ 2021-07-23 11:35 Mr-xxx 阅读(194) 评论(0) 推荐(0)
摘要:基础知识 首先我们来看下栈帧的定义: In C and modern CPU design conventions, the stack frame is a chunk of memory, allocated from the stack, at run-time, each time a fu 阅读全文
posted @ 2021-07-23 11:17 Mr-xxx 阅读(210) 评论(0) 推荐(0)
摘要:引言 协程 yield 和 resume 的第三种情况,也就是会发生协程切换的第三种情况,即调用 read(), write() 等 I/O 操作而陷入 “阻塞”和最后又恢复执行的过程,需要注意的是, 这里的“阻塞”依然是用户态实现的过程。我们知道,libco 的协程是在底层线程上串行 执行的。如果 阅读全文
posted @ 2021-07-23 10:53 Mr-xxx 阅读(213) 评论(0) 推荐(0)
摘要:引言 poll是libco中所有hook后的函数中可以说是最重要的一个,因为我们不但可以这个函数来隐式的转移CPU执行权,而且其他hook后的函数还可以使用这个hook后的poll在不切换线程的情况下去监听套接字,并在超时或者套接字有事件到来的时候唤醒这个调用poll的协程。 在example_co 阅读全文
posted @ 2021-07-22 23:01 Mr-xxx 阅读(210) 评论(0) 推荐(0)
摘要:引言 我们总能在运行libco协程代码的最后看到对于函数co_eventloop的调用,它可以理解为主协程执行的函数。我们举一个简单的例子来说明它的作用: 1 void* routinefun(void* args){ 2 co_enable_hook_sys(); 3 while(true){ 4 阅读全文
posted @ 2021-07-22 22:38 Mr-xxx 阅读(297) 评论(0) 推荐(0)
摘要:一、什么是库 1. 概念 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll), 阅读全文
posted @ 2021-07-20 23:01 Mr-xxx 阅读(2011) 评论(0) 推荐(0)
摘要:引言 在探究这个机制之前我们先来看看libco为什么被腾讯的工程师们创造出来。 如今微信已经是一个月活近12亿的现象级软件,不可否认其背后的技术架构一定是首屈一指的。但是罗马不是一日建成的。实际在微信运行之初其并发能力并不是像现在一样。事实上当时大部分模块都采用了半同步半异步模型。接入层为异步模型, 阅读全文
posted @ 2021-07-20 15:39 Mr-xxx 阅读(305) 评论(0) 推荐(0)
摘要:C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量 阅读全文
posted @ 2021-07-20 10:57 Mr-xxx 阅读(311) 评论(0) 推荐(0)
摘要:事件驱动与协程调度 协程的“阻塞”与线程的“非阻塞” 生产者消费者模型 1 /* 2 * Tencent is pleased to support the open source community by making Libco available. 3 4 * Copyright (C) 20 阅读全文
posted @ 2021-07-19 22:16 Mr-xxx 阅读(158) 评论(0) 推荐(0)
摘要:Libco 协程的生命周期 创建协程(Creating coroutines) 前文已提到,libco 中创建协程是 co_create() 函数。函数声明如下: 1 int co_create( stCoRoutine_t **co,const stCoRoutineAttr_t *attr,vo 阅读全文
posted @ 2021-07-18 22:59 Mr-xxx 阅读(221) 评论(0) 推荐(0)
摘要:libco 的协程 通过上一篇的分析,我们已经对 libco 中的协程有了初步的印象。我们完全可以把 它当做一种用户态线程来看待,接下来我们就从线程的角度来开始探究和理解它的实现机制。 以 Linux 为例,在操作系统提供的线程机制中,一个线程一般具备下列要素: (1) 有一段程序供其执行,这个是显 阅读全文
posted @ 2021-07-18 22:15 Mr-xxx 阅读(313) 评论(0) 推荐(0)
摘要:导论 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情。在没有应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此。即便使用 libevent, libev 这样事件驱动的网络框架去构建你的服务,程序结构依然不会很简单。为何会这样?因为这类框架提供的都是非阻塞式 阅读全文
posted @ 2021-07-18 21:25 Mr-xxx 阅读(599) 评论(0) 推荐(0)
摘要:今天我们来了解一下 Redis 命令执行的过程。在之前的文章中《当 Redis 发生高延迟时,到底发生了什么》我们曾简单的描述了一条命令的执行过程,本篇文章展示深入说明一下,加深读者对 Redis 的了解。 上篇 如下图所示,一条命令执行完成并且返回数据一共涉及三部分,第一步是建立连接阶段,响应了s 阅读全文
posted @ 2021-07-13 22:08 Mr-xxx 阅读(865) 评论(0) 推荐(0)
摘要:Murmurhash: 是一种非加密型哈希函数,适用于一般的哈希检索操作。高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出 阅读全文
posted @ 2021-07-13 16:55 Mr-xxx 阅读(438) 评论(0) 推荐(0)
摘要:一、引言 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是一旦进程退出,Redis 的数据就会丢失。 为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据保存到磁盘中,避免数据丢失。RDB的介绍在这篇文章 阅读全文
posted @ 2021-07-13 16:33 Mr-xxx 阅读(479) 评论(0) 推荐(0)
摘要:一、引言 1.1 持久化简介 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是一旦进程退出,Redis 的数据就会丢失。 为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据保存到磁盘中,避免数据丢失。 阅读全文
posted @ 2021-07-13 11:31 Mr-xxx 阅读(475) 评论(0) 推荐(0)
摘要:一、简介 Redis是一个开源的 key-value 存储系统,它使用六种底层数据结构构建了包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象的对象系统。今天我们就通过12张图来全面了解一下它的数据结构和对象系统的实现原理。 本文的内容如下: 首先介绍六种基础数据结构:动态字符串,链表,字典 阅读全文
posted @ 2021-07-13 10:44 Mr-xxx 阅读(197) 评论(0) 推荐(0)
摘要:一、建立主从关系 在配置文件中加入slaveof {masterHost} {masterPort}启动生效 在redis_server启动命令后加入--slaveof {masterHost} {masterPort}生效 直接使用命令:slaveof {masterHost} {masterPo 阅读全文
posted @ 2021-07-12 23:18 Mr-xxx 阅读(127) 评论(0) 推荐(0)
摘要:Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redi 阅读全文
posted @ 2021-07-12 22:34 Mr-xxx 阅读(227) 评论(0) 推荐(0)
摘要:整个分析的代码多数都在ae.c、ae.h、ae_epoll.c、ae_evport.c、ae_kqueue.c、ae_select.c,某些不在这些文件的函数会特别指出位置 一、Redis的事件模型库 Redis服务器是一个事件驱动程序。下面先来简单介绍什么是事件驱动。 所谓事件驱动,就是当你输入一 阅读全文
posted @ 2021-07-12 11:42 Mr-xxx 阅读(702) 评论(0) 推荐(0)
摘要:一、线程模型(网络连接库的整体实现框架) 1.1 文件事件处理器 Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型 阅读全文
posted @ 2021-07-11 22:36 Mr-xxx 阅读(251) 评论(0) 推荐(0)
摘要:一、quicklist简介 为什么说quicklist是“二合一”呢?如果你看过STL中的deque的实现,就会知道deque是由一个map中控器和一个数组组成的数据结构,它既具有链表头尾插入便捷的优点,又有数组连续内存存储,支持下标访问的优点。Redis中是采用sdlist和ziplist来实现q 阅读全文
posted @ 2021-07-10 22:12 Mr-xxx 阅读(113) 评论(0) 推荐(0)
摘要:在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接。于是查询了一些资料,最后找到了hiredis。然而直接用它的话,难免有点不方便。于是,对其进行封装。 hiredis直接去git上克隆,地址:https://github.com/redis/hiredis。 下载好之后,由 阅读全文
posted @ 2021-07-07 09:47 Mr-xxx 阅读(466) 评论(0) 推荐(0)
摘要:redis中压缩列表ziplist相关的文件为:ziplist.h与ziplist.c 压缩列表是redis专门开发出来为了节约内存的内存编码数据结构。源码中关于压缩列表介绍的注释也写得比较详细。 一、数据结构 压缩列表的整体结构如下 1 /* 2 <zlbytes> <zltail> <zllen 阅读全文
posted @ 2021-07-07 09:25 Mr-xxx 阅读(275) 评论(0) 推荐(0)
摘要:redis中整数集合intset相关的文件为:intset.h与intset.c intset的所有操作与操作一个排序整形数组 int a[N]类似,只是根据类型做了内存上的优化。 一、数据结构 1 /** 2 * 整型有序集合intset 3 */ 4 typedef struct intset 阅读全文
posted @ 2021-07-06 17:36 Mr-xxx 阅读(65) 评论(0) 推荐(0)
摘要:redis中并没有专门给跳跃表两个文件。在5.0.2的版本中,结构体的声明与定义、接口的声明在server.h中,接口的定义在t_zset.c中,所有开头为zsl的函数。 一、数据结构 单个节点: 1 /** 2 * ZSETs use a specialized version of Skipli 阅读全文
posted @ 2021-07-05 22:48 Mr-xxx 阅读(95) 评论(0) 推荐(0)
摘要:redis中字典相关的文件为:dict.h与dict.c 与其说是一个字典,道不如说是一个哈希表。 一、数据结构 1.1 dictEntry结构体 1 /** 2 * dictEntry是一个kv对的单向链表,其中v是一个联合体,支持数字,或者是指向一块内存的指针。 3 */ 4 typedef s 阅读全文
posted @ 2021-07-05 09:44 Mr-xxx 阅读(65) 评论(0) 推荐(0)
摘要:redis中双向链表相关的文件为:adlist.h与adlist.c 一、数据结构 redis里定义的双向链表,与普通双向链表大致相同 1.1 单个节点结构 1 /* Node, List, and Iterator are the only data structures used current 阅读全文
posted @ 2021-07-03 21:28 Mr-xxx 阅读(44) 评论(0) 推荐(0)
摘要:redis中动态字符串sds相关的文件为:sds.h与sds.c 一、数据结构 redis中定义了自己的数据类型"sds",用于描述 char*,与一些数据结构 1 typedef char *sds; 2 3 /* Note: sdshdr5 is never used, we just acce 阅读全文
posted @ 2021-07-03 17:43 Mr-xxx 阅读(157) 评论(0) 推荐(0)