<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[kwanson的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/kwanson</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; kwanson]]></copyright><item><title><![CDATA[2019腾讯后台开发详细面试流程]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/88766448</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/88766448</guid><author>kwanson</author><pubDate>Mon, 25 Mar 2019 14:06:05 +0800</pubDate><description><![CDATA[背景

  2017年我毕业于某不知名二本院校，校招进入一安防企业; 从事于后台服务接入工作。期间一直不断的提高自己，终于在今年如愿以偿，获得腾讯后台开发岗位offer。因此想借此分享成长路上的思考与困难，以及腾讯面试的整个流程。同时在这里声明学历及出身并非有意突出自己。相反，我希望任何拥有机会，并且热爱学习的人都尽量进入高等学府。如果你的出身既定，不要气馁，去努力改变你的命运。任何付出努力的...]]></description><category></category></item><item><title><![CDATA[redis ADDSLOTS支持区间输入实现]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/86670326</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/86670326</guid><author>kwanson</author><pubDate>Sun, 27 Jan 2019 23:37:39 +0800</pubDate><description><![CDATA[背景

        最近在阅读redis源码，发现redis集群应用情景时，添加slot命令ADDSLOTS只接受slot按个输入, 没有办法直接按区间分配。这样就存在一个不是很友好的问题，redis定义共有16384个slot，只有所有slot都分配有节点处理时，集群进入上线状态。相反，如果redis中存在一个slot没有分配到节点处理，集群则处于下线状态。这样要分配16384个slot确实...]]></description><category></category></item><item><title><![CDATA[C++11 STL之vector实现深入剖析（下）]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/85643609</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/85643609</guid><author>kwanson</author><pubDate>Sat, 05 Jan 2019 00:27:46 +0800</pubDate><description><![CDATA[       上回我们分析了push_back函数。接下来我们来看下pop_back函数。递减_M_finish指针，然后析构最后一个对象，但是内存不会进行释放，即capacity接口返回值不变。这也说明了为何没有pop_front接口；倘若有，那么每一次调用都得将所有对象向前移动，vector不擅长此类操作。




void pop_back()
{
	/*
	* 递减_M_finish指针,...]]></description><category></category></item><item><title><![CDATA[C++11 STL之vector实现深入剖析（上）]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/85489752</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/85489752</guid><author>kwanson</author><pubDate>Tue, 01 Jan 2019 23:37:58 +0800</pubDate><description><![CDATA[概述

        vector是一种线性容器，因此它的所有成员都是按照严格的线性排序。Vector是通过动态数组来实现的，因此它的成员都是存放在连续的内存中。所以我们不仅可以通过迭代器去遍历成员，还可以通过成员的指针加偏移来访问。因此vector擅长

通过下标来索引单个成员
	任意顺序迭代访问所有成员
	从尾部追加或删除成员
类图

        首先我们来看下vector的类图，为了便...]]></description><category></category></item><item><title><![CDATA[coredump生成名与可执行文件名不一致原因分析]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/84332646</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/84332646</guid><author>kwanson</author><pubDate>Thu, 22 Nov 2018 01:12:30 +0800</pubDate><description><![CDATA[        众所周知,linux下进程当收到某些信号而终止时，会保存进程上下文信息进入coredump文件中；以帮助程序员们分析调试。它可以通过执行如下命令使能coredump生成。其生成路径定义在/proc/sys/kernel/core_pattern文件中，生成文件名格式定义在内核源码的Documentation/sysctl/kernel.txt。如下我定义生成文件名规则是%e_%P_...]]></description><category></category></item><item><title><![CDATA[redis源码剖析[1]-异步事件驱动框架(下)]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/83154973</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/83154973</guid><author>kwanson</author><pubDate>Mon, 29 Oct 2018 01:19:06 +0800</pubDate><description><![CDATA[        上篇文章&amp;lt;redis源码剖析[1]-异步事件驱动框架(上) &amp;gt;。我们分析了redis的事件驱动模块对于事件检测的实现。现在我们看看redis如何应用这些事件检测。

        我们先来看创建事件驱动模块的接口aeCreateEventLoop。它有一个参数setsize，用于指示事件注册记录与存放已触发事件的缓冲区大小，也就是可以注册多少个描述符。其主要调用底层a...]]></description><category></category></item><item><title><![CDATA[深入理解c++之struct构造函数]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/82320728</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/82320728</guid><author>kwanson</author><pubDate>Mon, 03 Sep 2018 00:33:14 +0800</pubDate><description><![CDATA[        是否曾好奇struct定义的数据结构类型，当我拷贝构造时，或者赋值操作时会发生什么？倘若我结构中存在指针引用对象时，又能否正确处理？带着这些疑问，我们来对struct的构造函数进行研究，以解答以下几个疑问：

        1) 何时编译器会自动为struct合成构造函数

        2) 如何能保证携带指针引用对象的struct正确拷贝或拷贝构造

        让我们...]]></description><category></category></item><item><title><![CDATA[redis源码剖析[1]-异步事件驱动框架(上)]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/81839805</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/81839805</guid><author>kwanson</author><pubDate>Sun, 19 Aug 2018 21:56:50 +0800</pubDate><description><![CDATA[       想要分析源码，我觉得可以把它当成一个整体，或者一个函数，有输入和对应的输出。我们从输入开始分析流程。先撇开main函数，在gdb上打印下线程的堆栈是个好想法，让我们看看它都在做什么。

       可以看得到它其中一条线程阻塞在epoll_wait(我的系统是ubuntu，因此选择了epoll)。在这里检测套接字事件，等待client请求。可以看到还有3条后台io服务线程，它们分别...]]></description><category></category></item><item><title><![CDATA[设计模式-Iterator迭代器模式]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/81490871</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/81490871</guid><author>kwanson</author><pubDate>Wed, 08 Aug 2018 23:43:45 +0800</pubDate><description><![CDATA[       迭代器模式，即提供一种方法顺序的访问一个集合对象中的各个元素。而又不暴露其内部的表示。那么为什么需要这样设计呢？让我们考虑如下情况。

       我们CString有两个不同版本的实现，然后当我们需要访问其各个元素时，却不得依据其集合的表达方式写出对应的访问。也就是说我们其实是在依赖于实现编程了。当有其他的实现版本的时候，我们访问各个元素的方式还得改变。因此迭代器应运而生，提供一...]]></description><category></category></item><item><title><![CDATA[c++之默认参数的可继承性及其原理]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/81349707</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/81349707</guid><author>kwanson</author><pubDate>Thu, 02 Aug 2018 00:02:40 +0800</pubDate><description><![CDATA[        关于c++默认参数是否可以继承这个问题。我们先给出答案是，不可继承并且静态绑定为当前类接口的默认参数(如果有声明的话)上。当然，我们不单只需要知道结果，还应该探索一下原因。

        考虑以下代码。非常简单的一段测试代码。有个IServer基类，其listen接口有个默认参数。IServer派生出两个子类CRPCServer与CHTTPServer，两个子类在其listen...]]></description><category></category></item><item><title><![CDATA[从零编写c++之http服务器(3)-http服务]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/81194214</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/81194214</guid><author>kwanson</author><pubDate>Fri, 27 Jul 2018 22:32:42 +0800</pubDate><description><![CDATA[        http全称超文本传输协议，可调试性高，扩展性也强。上两个篇章我们已经拥有了epoll事件驱动框架和线程池处理网络事件，接下来我们要先写一个基础网络套接字，然后在此基础上扩展出http的套接字。献上类图如下

完整源码见&amp;lt;https://github.com/kwansoner/panda.git&amp;gt;

                                  ...]]></description><category></category></item><item><title><![CDATA[从零编写c++之http服务器(2)-epoll异步事件驱动框架]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/81175382</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/81175382</guid><author>kwanson</author><pubDate>Fri, 27 Jul 2018 22:26:28 +0800</pubDate><description><![CDATA[       epoll是select/poll基础上改进的为大规模描述符事件监测的机制，常出现在高性能，高并发的服务器设计中。在这里我们需要设计一个框架，实现套接字对象将自身注册到框架中，框架即可利用epoll对其套接字进行事件监测；当事件产生时通知相应的套接字对象。从而实现事件的监测与处理解耦。惯例还是献上类图。

完整源码见&amp;lt;https://github.com/kwansoner/p...]]></description><category></category></item><item><title><![CDATA[从零编写c++之http服务器(1)-线程池]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/81160437</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/81160437</guid><author>kwanson</author><pubDate>Fri, 27 Jul 2018 22:25:12 +0800</pubDate><description><![CDATA[引言

        编写这么一个c++的http服务器，纯粹是满足多年前一个好奇心。为什么我输入链接可以打开一个网页？这背后究竟发生了什么？所以本着好事多磨的心理一点点从零写了这个http服务器。他有着以下几个特点。

1) 基于epoll的异步事件驱动框架

2) L/F线程池处理网络事件

3) 完全从零编写http服务模块

        当然实现中为了研究原理，仅做了关键功能的开发，...]]></description><category></category></item><item><title><![CDATA[消除 pointer of type ‘void *’ used in arithmetic告警]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/80962370</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/80962370</guid><author>kwanson</author><pubDate>Sun, 08 Jul 2018 21:23:24 +0800</pubDate><description><![CDATA[        考虑这么一段代码，编译时会产生警告void *指针用于算术运算，那么如果消除这个告警？ssize_t Send(int sockfd, const void *buf, size_t len, int flags)
{
	size_t sendcount = 0x00;
	ssize_t nsend = 0x00;
	do{
		nsend = send(sockfd, buf +...]]></description><category></category></item><item><title><![CDATA[c++函数返回值的初始化]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/80753016</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/80753016</guid><author>kwanson</author><pubDate>Wed, 20 Jun 2018 23:45:10 +0800</pubDate><description><![CDATA[引言      c++函数返回值，如int, char, float等内建类型可以使用寄存器返回。但是如果我返回了自定义的一个类呢？那么函数返回时当前栈帧释放了，如果保存返回对象的值。它又在什么时候初始化? 让我们从汇编层次来看问题。代码    编写测试代码如下，非常简单的一个例子。测试平台为i386。#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdint.h&amp;g...]]></description><category></category></item><item><title><![CDATA[深入理解c++多态实现原理]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/80379360</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/80379360</guid><author>kwanson</author><pubDate>Sun, 20 May 2018 01:54:00 +0800</pubDate><description><![CDATA[引言       多态是指通过基类的指针或者引用，在运行时动态调用实际绑定对象函数的行为。与之相对应的编译时绑定函数称为静态绑定。多态是面向对象编程的核心思想之一，因此我们有必要深入探索一下它的实现原理。理解了原理才能更好的使用。前置条件        现有代码如下所示，非常简单的例子。通过基类的引用调用recv函数来触发多态。接下来的分析涉及汇编知识，如果还没熟悉汇编，可以看另外一篇文章&amp;lt;...]]></description><category></category></item><item><title><![CDATA[深入理解c++函数调用的参数传递与局部变量申请]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/80298182</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/80298182</guid><author>kwanson</author><pubDate>Sun, 13 May 2018 21:58:30 +0800</pubDate><description><![CDATA[引言       工作中最难以解决的BUG莫过于偶现，复现周期长，难以定位的，而有时core也是缺少调试信息的。这种情况下就需要通过堆栈还原工作现场来分析问题。尽管现在诸多解释性语言蓬勃发展，但语言的根本汇编我们还是需要掌握，无论对于解bug还是分析语言本质都有着奇效。掌握事物的本质才是真正的理解。测试代码            测试代码如下所示，很简单的例子。我们编译后使用gdb来分析函数调用前...]]></description><category></category></item><item><title><![CDATA[设计模式-observer观察者模式]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/80146270</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/80146270</guid><author>kwanson</author><pubDate>Sun, 29 Apr 2018 23:26:48 +0800</pubDate><description><![CDATA[    定义              观察者模式-在对象间定义一对多的依赖关系，这样一来当一个对象的状态更新时，其它对象都能得到通知更新。主题并不需要了解观察者具体实现细节，只需要保证观察者实现了观察者接口即可。观察者模式定义了对象间一对多的关系。即一个主题，多个观察者观察主题的状态变化。主题通过某个公共的接口来通知观察者。不要依赖于特定的通知顺序。除非设计一个能明确通知顺序的主题。一般来说主题...]]></description><category></category></item><item><title><![CDATA[设计模式-strategy策略模式]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/80113323</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/80113323</guid><author>kwanson</author><pubDate>Fri, 27 Apr 2018 22:24:49 +0800</pubDate><description><![CDATA[       引言        关于设计模式有这么几本书可以推荐。&amp;lt;设计模式&amp;gt;这本当然是经典了，但是比较专业深晦，需要有一定的基础再反复琢磨；绝非看过一遍即可束之高阁。&amp;lt;Head First设计模式&amp;gt;即&amp;lt;设计模式&amp;gt;的白话版，文章清晰简介，重点明确；非常适合入门新人。但是&amp;lt;Head First设计模式&amp;gt;例子以java编写，在此给出c++例子，以供c+...]]></description><category></category></item><item><title><![CDATA[内存泄漏检测原理]]></title><link>https://blog.youkuaiyun.com/kwanson/article/details/79954530</link><guid>https://blog.youkuaiyun.com/kwanson/article/details/79954530</guid><author>kwanson</author><pubDate>Mon, 16 Apr 2018 00:05:18 +0800</pubDate><description><![CDATA[        众所周知，c/c++语言的内存回收依赖于程序员，并没有python，java之类的自动回收。那么内存是申请释放就是个需要认真对待的问题。因为往往诸如服务器是需要长期运行的，即便轻微的内存泄漏也将可能带来严重问题。而且这种bug还存在着复现周期长，难以定位的问题。        链接器有个选项–wrap，当查找某个符号时，它优先先解析__wrap_symbol,　解析不到才会去解析s...]]></description><category></category></item></channel></rss>