自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(107)
  • 资源 (2)
  • 收藏
  • 关注

原创 PhxRPC源码分析(一)BlockTcpStream

phxrpc简介phxrpc是微信开源的轻量级rpc框架,支持协程模式,代码量不大,很适合拿来学习一个。定制输入输出流phxrpc使用标准输入输出的方式封装了socket,使用<<和>>来实现读写。 实现类图如下: streambufstreambuf是一个流缓冲区,包含输入和输出缓冲区。向ostream写入时,数据会放到输出缓冲区中,从istr...

2019-11-13 20:58:09 1260

原创 PhxRPC源码分析(三) RPC

RPC整个RPC的定义基本都在hsha_server这个文件。主要有一下几个类:DataFlow :数据流,所有请求和应答分别保存在两个线程安全的队列中。HshaServerStat HshaServerQos: 统计运行状态,独立线程。Worker :独立的工作线程,如果是协程模式,每个worker会有多个协程。WorkerPool:工作池,管理Worker。HshaServe...

2019-11-13 20:57:48 983

原创 STL源码剖析—Iterator与Traits

获取迭代器的类型如果函数中想要获取迭代器的类型该怎么做呢?下面提供一种方法:template <class I, class T>void func_impl(I iter, T t) { T tmp; // ...}template <class I&amp

2018-10-10 20:28:09 330

原创 STL源码剖析—空间配置器

allocator由于对象的创建分为分配内存和调用构造函数两部分,STL allocator使用 alloc::allocate()来分配内存,::construct()构造对象。constructconstruct()函数只有一个泛化的版本,destroy()函数有一个泛化的针对迭代器的版本,__destroy_aux()根据是否需要调用析构函数进行了特化。//构造对象template...

2018-10-09 23:34:39 188

原创 C++11多线程

创建线程std::thread thObj(<CALLBACK>);其中的函数可以是函数指针,函数对象,lambda函数。线程创建完成即开始运行。#include <thread>void thread_function(){ std::cout<<"thread function Executing"&am

2018-08-20 22:40:17 488

原创 PhxRPC源码分析(二)uthread_context

uthread协程的概念在coroutine源码分析中有介绍。phxrpc默认使用ucontext作实现,同时还有boost优化版本。UThreadContextUThreadContext是定义了协程接口的基类,并且有一个静态函数对象,用来创建协程上下文,其应该是子类的DoCreate函数,UThreaStackMemoryUThreaStackMemory是每个协程...

2018-03-03 19:14:34 1187

原创 云风coroutine源码分析

前言现在C++的开发开始流行使用coroutine,也就是协程。我看腾讯的几个开源项目里面都有协程的实现。使用协程可以用同步的写法,达到异步的性能。它的基本原理其实就是在IO等待的时候切换出去,在适当的时刻再切换回来。云风用200行代码实现了一个最简单的协程,我们先看这个代码了解一下协程的原理,然后再看微信的libco实现。协程简单介绍协程可以理解为一个用户级的线程,一个线程里跑多

2018-01-31 17:54:22 1290 1

原创 Google Protocol Buffer

Protocol Buffer是谷歌的一种序列化格式使用首先定义.proto文件syntax ="proto2";package tutorial;message Person{ required string name = 1; required int32 id = 2; optional string email = 3; enum P

2017-12-31 23:52:49 459

原创 C++智能指针

std::shared_ptr初始化构造函数初始化:std::shared_ptr<int> p(new int(1));std::make_shared< T >初始化std::shared_ptr<int> p = std::make_shared<int>(1);注意:不能将一个原始指针直接复制给一个智能指针。std::shared_ptr<int> p = new int(1);//编译报错

2017-11-22 00:22:12 360

原创 Docker入门

一直对docker很感兴趣,今天按照官网的Guides学习一个。安装我的机器是腾讯云1元学生主机,centos,香港节点,还能当梯子,美滋滋。安装就不多说了,按官网来就行了,直接Get Started。Get Startedpart 1这一节讲起源,主要是docker和传统虚拟机的区别,我的理解是传统虚拟机完整的模拟出一个操作系统,每个虚拟机都有一个系统,通过一个hypervisor来管理。

2017-11-15 14:43:22 370

原创 Redis设计与实现——数据结构(五)

对象Redis 并没有直接使用之前的数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构。除此之外, Redis 的对象系统还实现了基于引用计数技术的内存回收机制: 当程序不再使用某个对象的时候, 这个对象所占用的内存就会被自动释放;

2017-11-09 17:13:12 785

原创 Redis设计与实现——数据结构(四)

整数集合简介整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。实现每个 intset.h/intset 结构表示一个整数集合

2017-11-03 18:41:48 326

原创 Redis设计与实现——数据结构(三)

跳跃表跳跃表简介跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。

2017-11-01 15:24:37 336

原创 Redis设计与实现——数据结构(二)

字典Redis 的数据库使用字典来作为底层实现,字典还是哈希键的底层实现之一: 当一个哈希键包含的键值对比较多, 又或者键值对中的元素都是比较长的字符串时, Redis 就会使用字典作为哈希键的底层实现。

2017-10-31 21:37:44 508

原创 Redis设计与实现——数据结构(一)

Redis一共有六种数据结构,分别是简单动态字符串,链表,字典,跳跃表,整数集合,压缩列表。简单动态字符串(SDS)当Redis需要的不仅仅是一个字面量,而是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串。包含字符串值的键值对在底层都是SDS实现的。sdshdr结构表示一个SDS值struct sdshdr { // 记录 buf 数组中已使用字节的数量 // 等于

2017-10-31 20:09:50 505

原创 Golang实现正方教务系统爬虫(二)

上次我们已经登录进了首页,明白了爬虫的原理,这次我们看一下web界面是如何实现的.项目地址 https://github.com/Nickqiaoo/go-webcrawler程序目前的功能很简单一共四个函数.Welcone处理登录请求,Querycredit处理学分查询,Querygrade处理成绩查询

2017-10-28 18:47:19 618

原创 Golang实现正方教务系统爬虫(一)

大二上学期的时候用python实现过一个简单的爬虫,学了go以后发现go的标准库十分强大,于是想实现一个教务系统的爬虫,爬取学分和成绩页面,再搞一个web界面出来. 项目github地址:https://github.com/Nickqiaoo/go-webcrawler爬取分析爬虫无非就是模拟浏览器的HTTP请求,我们首先来看一下浏览器是怎么发请求的.这是教务系统的主页,要想登录首先要获取验证码.验证

2017-09-17 13:49:58 1298

原创 HihoCoder第十二周——树上DP

刷油漆题目给定一棵树,每个节点有一个权值,将包含1号结点的一部分连通的结点进行涂漆(这里的连通指的是这一些涂漆的结点可以互相到达并且不会经过没有涂漆的结点),使权值和最大。分析f(t, m)表示,在以t为根的一棵树中,选出包含根节点t的m个连通的结点,能够获得的最高的评分,然后我们的答案就是f(1, M)。 针对于每一个t,同时求解它的f(t, 0..M),这样的话,我就

2017-08-18 22:39:03 395

原创 HihoCoder第十周——已知前序中序求后序

思路我们定义post_order(str1, str2)为一棵前序遍历的结果为str1,中序遍历的结果为str2的二叉树的后序遍历的结果。 如果要求解post-order(str1, str2)的话,首先不难发现,根据‘前序遍历’str1=‘根节点’+‘左子树的前序遍历’+‘右子树的前序遍历’,我可以知道这棵二叉树的根节点root便是str1的第一个字符。 在知道了‘根节点’root之后,便可以

2017-07-17 21:48:55 310

原创 IO复用函数select poll epoll

select#include <sys/select.h>#include <sys/time.h>int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)返回值:就绪描述符的数目,超时返回0,出错返回-1第一个参数maxfdp1指定待测试的描

2017-07-11 21:52:21 483

原创 c++编译与链接

c++编译与链接编译与链接编译与链接的过程可以分解为4个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。 1. 预处理 首先是源代码文件helloworld.cpp和相关的头文件,如iostream等被预处理器cpp预处理成一个.i文件。第一步预处理的过程相当于如下命令(-E表示只进行预处理):g++ -E he

2017-06-03 20:35:46 363

原创 HihoCoder第四周(Trie图)

问题河蟹先生将要给与他们一篇从互联网上收集来的文章,和一本厚厚的河蟹词典,而他们要做的是判断这篇文章中是否存在那些属于河蟹词典中的词语朴素方法:枚举每一个单词,然后枚举文章中可能的起始位置,然后进行匹配,看能否成功。如果说词典的词语数量为N,每个词语长度为L,文章的长度为M,时间复杂度O(M*N*L) 利用trie树的优化方法:对字典建立trie树,判断是否从某个起始位置开始的一段字符(也就是从这

2017-05-11 23:42:16 378

原创 HihoCoder第二周(字典树)

题目输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词,单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示一个询问。对于每一个询问,输出一个整数Ans,表示词典中以给出的字符串为前缀的单词的个数。样例输入 5 babaab b

2017-05-09 23:45:44 344

原创 hihoCoder第一周(最长回文子串)

求一个字符串的最长回文子串最容易想到的第一个方法就是枚举每个子串,然后判断它是不是回文串,枚举子串时我们不需要创建新串,只需要比较字符串的第一个字符和最后一个字符是否相同,第二个字符和倒数第二个字符是否相同,以此类推。如果一个字符串的[3, 7]这一段已经不是回文子串了,[2, 8]这一段也不可能是回文子串,这时第一种方法很多计算就白费了。我们在枚举子串的时候换一种方式来进行枚举,不是枚举它的起止

2017-04-16 17:27:52 268

原创 socket相关函数

socket相关函数socket函数socket函数返回套接字描述符int socket(int socket,int type,int protocol)若成功返回非负描述符,失败返回-1. family 说明 AF_INET IPv4协议 AF_INET6 IPv6协议 AF_LOCAL Unix域协议 AF_ROUTE 路由套接字 AF_KEY 密

2017-03-30 23:16:49 3079

原创 KMP算法详解

一直以来对KMP算法理解的不是很透彻。看了左神的程序员代码面试指南后感觉基本明白了。我们都知道KMP算法最重要的是next数组,next[i]的含义是在match[i]之前的字符串match[0..i-1]中,必须以match[i-1]结尾的后缀子串(不能包含match[0])与必须以match[0]开头的前缀子串(不能包含match[i-1])最大匹配长度是多少。比如match="aaaab

2017-03-04 18:00:34 575

原创 逆波兰表达式

逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。a+b ---> a,b,+a+(b-c) ---> a,b,c,-,+a+(b-c)*d ---> a,b,c,

2017-01-24 13:11:14 1055

原创 Linux下配置汇编编译器NASM和bochs模拟器

NASM下载:http://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D解压:tar zxvf nasm-2.12.02.tar.gz进入刚解压的目录然后执行命令:./configure                        make                        sudo make installboc

2017-01-17 12:14:05 1975

原创 汇编语言(二)

指令的寻址方式汇编指令由操作码字段和操作数字段构成。对于双操作指令,第一个操作数称为目的操作数,表示操作后的结果;第二个操作数称为源操作数,表示来源操作数。两者以逗号分隔。如:所谓寻址方式,即指令中提供操作数或操作数地址的方式。通俗地说就是寻找操作数地址的方法。寻址方式的数量代表了微机系统对存储器管理能力的强弱,合理地使用寻址方式可以扩大访存空间,缩短指令长度,满足

2016-11-29 10:53:02 443

原创 VIM使用大全(总结自实验楼)

1.游标移动按键说明h左l右(小写L)j下k上w移动到下一个单词b移动到上一个单词2.插入模式命令说明i在当前光标处进行编辑I在行首插入A在行末插入a

2016-11-19 11:01:41 1062

原创 不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析:肯定用位运算,模拟加法时首先将各位相加不进位,然后再算进位,最后相加。例如5+17=22,首先各位相加得到12,然后算进位得到10,再相加得到22.各位相加不进位用异或计算,算进位先用与运算,再左移一位,然后重复直到没有进位。int Add(int num1,int num2){ int sum

2016-11-15 21:39:04 357

原创 汇编语言(一)

1 8086寄存器组8086寄存器都是16位的寄存器,根据用途可分为4种类型。分别是数据寄存器、地址寄存器、段寄存器和控制寄存器。如图所示数据寄存器中每个寄存器又可以分为2个8位的寄存器。分别为AH、AL,BH、BL,CH、CL,DH、DL。H表示高字节(高8位)寄存器、L表示低字节(低8位)寄存器。例如 用AX寄存器存放一个字1234H,表示为(AX)=1234H,即高字

2016-11-08 18:35:10 683

原创 二叉搜索树转化双向链表

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表要求排序可以想到中序遍历,把根节点的左右子树都转换成排序好的双向链表,再将根节点左子树的最大值,右子树的最小值与根节点相连。class Solution {public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode *last

2016-10-30 13:21:01 280

原创 二叉树的深度

最大深度class Solution {public: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int l=TreeDepth(pRoot->left)+1; int r=TreeDepth(pRoot->right)+1;

2016-10-27 11:27:17 343

原创 整数中1出现的次数(从1到n整数中1出现的次数)

class Solution {public: int NumberOf1Between1AndN_Solution(int n) { int ones = 0; for (long long i = 1; i <= n; i *= 10) ones += (n/i + 8) / 10 * i + (n/i % 10 == 1)

2016-10-20 12:22:31 344

原创 网络中的连接设备

转发器(集线器):转发器是一种仅工作在物理层的设备,转发器在信号衰减前接收信号并再生发送出去。它所连接的是同样局域网的两个网段,并且没有过滤功能。网桥:网桥工作在物理层和数据链路层。作为物理层的设备,它具有转发器的功能。作为数据链路层的设备,它可以检查MAC地址。网桥不改变帧中的MAC地址。路由器:路由器工作在物理层,数据链路层,网络层。作为网络层的设备,路由器可以检查IP地址

2016-10-16 11:51:24 600

原创 找出数组中出现次数超过一半的数

如果有一个数出现的次数超过一半,那他出现的次数肯定比其他数字出现次数的和还要多,这时可以遍历数组并保存两个值,一个是出现的数字,一个是次数,当下一个数字和保存的数字相同时,次数加1,如果不同,次数减1,如果次数为0,我们需要保存下一个数字,并将次数设为1。最后保存的数字即为所求。同时考虑空数组和没有出现次数超过一半的情况。class Solution {public: int Mor

2016-10-14 19:43:45 738

原创 剑指offer-复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。方法1:先按next建立好初始链表,然后从头结点开始遍历原链表每个节点的random指针需要走几步,在新建立的链表中走同样的步数建立random指针。/*struct RandomListNode { int label; stru

2016-10-06 23:14:57 240

原创 已知二叉树前序中序遍历重建二叉树

中序遍历中根节点前的节点为左子树,根节点后的节点为右子树。class Soultion{public: struct TreeNode* reConstructBinaryTree(vector pre,vector in) { int inlen=in.size(); if(inlen==0) return NULL; vectorl

2016-09-30 22:48:54 472

原创 Linux常用命令

查询目录中的内容ls-a 显示所有文件,包括隐藏文件-l 显示详细信息  可写为ll-rw-r--r--- 文件类型(-文件 d 目录 i软链接文件)rw-           r--           r--u所有者  g所属组   o其他人r读w写x执行drwxr-xr-x     2        root

2016-09-25 18:58:01 242

C++开源协程库libco-原理与应用

使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情。在没有 应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此。即便使用 libevent, libev 这样事件驱动的网络框架去构建你的服务,程序结构依然不会很简单。为何会这样?因 为这类框架提供的都是非阻塞式的、异步的编程接口,异步的编程方式,这需要思维方 式的转变。为什么 golang 近几年能够大规模流行起来呢?因为简单。这方面最突出的 一点便是它的网络编程 API,完全同步阻塞式的接口。要并发?go 出一个协程就好了。 相信对于很多人来说,最开始接触这种编程方式,是有点困惑的。程序中到处都是同步 阻塞式的调用,这程序性能能好吗?答案是,好,而且非常好。那么 golang 是如何做 到的呢?秘诀就在它这个协程机制里

2018-01-28

docker 从入门到实战

docker从入门到实战 Kubernetes Mesos pdf 高清版

2017-12-30

空空如也

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

TA关注的人

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