自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 redis源码阅读之面向哈希表优化

写在前面2020年了,给自己加个任务,把redis代码完整读一遍。我新建了一个github项目(地址在文章末尾),会在redis源码之上增加注释,后续也会为其中一些值得拎出来说的点单独写文章。本文内容:常规哈希表科普 redis rehash面临的问题 redis的渐进式hash 什么时候会启动rehash 如何渐进式rehash 什么时候执行一步rehash reh...

2020-01-11 13:07:19 43

原创 [译] Go语言使用TCP_NODELAY控制发包流量

编写健壮且高性能的网络服务需要付出大量的努力。提高服务性能的方式有很多种,比如优化应用层的代码,更进一步,还可以看看垃圾回收器,操作系统,网络传输,以及部署我们服务的硬件是否有优化空间。TCP/IP协议栈中的一些算法会影响到服务性能。本文将简单介绍其中的Nagle算法,与Nagle算法相关的socket选项TCP_NODELAY,以及在Go语言中如何使用它。理论大部分平台上的TCP实现...

2020-01-01 09:36:03 35

原创 利用CPU cache特性优化Go程序

demo如下Go语言伪代码,开启两个协程,分别对一个结构体变量中的两个相邻的数据成员进行n次原子自增操作,当打开_ [56]byte这个看似多余的代码后,程序运行速度加快了一倍!你知道是为什么吗?...type Foo struct { a uint64 // _ [56]byte b uint64 // _ [56]byte}...go fu...

2019-12-29 19:05:35 40

原创 Go语言channel备忘录

目录无缓冲channel等价于缓冲大小为0的channel,而不是1 发送者和接收者哪些情况会阻塞 close哪些情况会导致panic 如何优雅的关闭channel 当一个select中有多个channel满足可读时,谁被激活 select with default 读取时获取第二个返回值,以此判断该channel是否被关闭 close前写入的数据,接收者依然可以按顺序读取到 ...

2019-12-22 09:39:30 27

原创 [译] Go语言的有缓冲channel和无缓冲channel

Go中的channel十分强大,理解channel的内部机制后再去使用它可以发挥出更大威力。另外,选择使用有缓冲channel还是无缓冲channel会影响到我们程序的行为表现,以及性能。无缓冲channel无缓冲channel在消息发送时需要接收者就绪。声明无缓冲channel的方式是不指定缓冲大小。以下是一个列子:package mainimport ( "sync" "...

2019-12-21 08:46:11 67

原创 Go语言使用cgo时的内存管理笔记

先放结论使用cgo时:和日常Go对象被gc管理释放的表现略有不同的是,Go和c代码的类型相互转化传递时,有时需要在调用结束后手动释放内存。 有时类型转换伴随着内存拷贝的开销。 如果想消除拷贝开销,可以通过unsafe.Pointer获取原始指针进行传递。 c代码中的内存泄漏,依然可以使用valgrind检查。但是需要注意,像C.CString这种泄漏,valgrind无法给出泄漏的准...

2019-12-21 08:41:27 73

原创 CentOS7升级内核以开启TCP BBR拥塞控制算法

通过ELRepo RPM repo升级内核查看当前内核版本$uname -r输出如下:3.10.0-514.26.2.el7.x86_64说明当前的内核为 3.10.0安装ELRepo repo$sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org$sudo rpm -Uvh http...

2019-12-14 11:55:31 97

原创 [译] 写一个简单的内存分配器(替换glibc中的malloc函数)

本文介绍如何用c语言实现一个简单的内存分配器,可替换glibc中的 malloc(), calloc(), realloc(), free().这是一篇入门级别的文章,所以不会介绍所有的细节。 代码实现主要为了演示内存分配器的基本工作原理,所以和工业级内存分配器相比,缺少非常多的性能优化,分配内存时也不会按页对齐,但是至少,我们构建的内存分配器是可以工作的。在构建内存分配器之前,需要先介绍...

2019-12-13 22:04:28 48

原创 使用supervisor工具对服务进程做保活管理

使用supervisor工具对我们的非daemon程序做保活,当我们的进程崩溃了或被误杀了后能再次被自动拉起。CentOS 安装 supervisor$yum install supervisor -y安装完成后,使用如下命令生成默认配置文件/etc/supervisord.conf:$echo_supervisord_conf > /etc/supervisord.c...

2019-12-07 13:23:14 38

原创 [译] 理解存储性能的两个指标每秒读写次数与时延

大部分人在考虑存储性能时,他们首先想到的是最大吞吐量。但是最大吞吐量就像汽车厂商给汽车标的最高速度。实际上,你几乎永远不会达到那个速度。考虑存储性能时也不应该只考虑最大吞吐量。还拿汽车来举例,大部分时候,加速度和过弯的处理能力可能会比最大吞吐量更重要。这和存储性能是类似的。大部分人都知道SSD固态硬盘一般比普通的机械硬盘快。但这不仅仅是因为固态硬盘的最大吞吐量更大。还和它们的IOPS(In...

2019-12-01 10:49:37 303

原创 [译] linux内存管理之RSS和VSZ的区别

RSS是Resident Set Size(常驻内存大小)的缩写,用于表示进程使用了多少内存(RAM中的物理内存),RSS不包含已经被换出的内存。RSS包含了它所链接的动态库并且被加载到物理内存中的内存。RSS还包含栈内存和堆内存。VSZ是Virtual Memory Size(虚拟内存大小)的缩写。它包含了进程所能访问的所有内存,包含了被换出的内存,被分配但是还没有被使用的内存,以及动态库中...

2019-11-30 10:51:00 262

原创 Go语言源码阅读之bytes.Buffer

Go标准库中的bytes.Buffer(下文用Buffer表示)类似于一个FIFO的队列,它是一个流式字节缓冲区。我们可以持续向Buffer尾部写入数据,从Buffer头部读取数据。当Buffer内部空间不足以满足写入数据的大小时,会自动扩容。伸缩策略....................................... ^ ^...

2019-11-28 13:30:58 32

原创 Go创建对象时,如何优雅的传递初始化参数

Go创建对象时,如何优雅的传递初始化参数?这里所说的优雅,指的是:支持传递多个参数 参数个数、类型发生变化时,尽量保持接口的兼容性 参数支持默认值 具体的参数可根据调用方需关心的程度,决定是否提供默认值Go并不像c++和python那样,支持函数默认参数。所以使用Go时,我们需要一种方便、通用的手法来完成这件事。Go的很多开源项目都使用Option模式,但各自的实现可能有些许细微差...

2019-11-27 13:23:09 75

原创 [译] TCP的SYN队列和Accept队列

关于两个队列首先我们必须明白,处于“LISTENING”状态的TCP socket,有两个独立的队列:SYN队列(SYN Queue) Accept队列(Accept Queue)这两个术语有时也被称为“reqsk_queue”,“ACK backlog”,“listen backlog”,甚至“TCP backlog”,但是这篇文章中我们使用上面两个术语以免造成混淆。SYN队...

2019-11-23 22:35:49 67

原创 [译] Go开源项目BigCache如何加速并发访问以及避免高额的GC开销

几天前,我读了一篇关于BigCache的文章,我对它是如何做到以下两点十分感兴趣:加速并发访问 避免高额的GC开销于是我去阅读了它的代码。我觉得它的做法很赞,所以我写了这篇文章来与你分享。BigCache 是一个快速,支持并发访问,自淘汰的内存型缓存,可以在存储大量元素时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。 —— 摘自《BigCache README ...

2019-11-21 18:52:17 286

原创 给Go程序加入编译版本时间等信息

先看效果$./myapp -vGitCommitLog=d97d098e5bb4ad38a2a7968f273a256e10a0108f mod bininfo commentGitStatus=cleanlyBuildTime=2019.10.26.194341GoVersion=go version go1.13 darwin/amd64runtime=darwin/amd64...

2019-10-27 10:26:39 104

翻译 [译] Go语言测试进阶版建议与技巧

阅读本篇文章前,你最好已经知道如何写基本的单元测试。本篇文章共包含3个小建议,以及7个小技巧。建议一,不要使用框架Go语言自身已经有一个非常棒的测试框架,它允许你使用Go编写测试代码,不需要再额外学习其它的库或测试引擎。关于断言方面的帮助函数,你可以看看这个 testing,或者这个 assert.go ????建议二,使用"_test"包名相较于直接使用被测试代码的包名,使用 *_test包...

2019-09-15 17:19:23 26

原创 stress - 系统压力模拟工具

欢迎访问我的个人网站获取更佳排版体验: https://pengrl.com/p/42434/ (stress - 系统压力模拟工具 | yoko blog)前言stress是一个故意制造系统压力的工具。它提供了一系列的参数用于配置如何制造CPU,内存,IO操作,磁盘压力。安装# centos平台$yum install epel-release$yum install stress...

2019-07-06 09:08:14 285 1

翻译 [译] QUIC Wire Layout Specification - Packet Types and Formats | QUIC协议标准中文翻译(2) 包类型和格式

欢迎访问我的个人网站获取更佳阅读排版体验: [译] QUIC Wire Layout Specification - Packet Types and Formats | QUIC协议标准中文翻译(2) 包类型和格式 | yoko blog (https://pengrl.com/p/48146/)目录QUIC Public Packet Header | QUIC公共包头Public...

2019-06-08 08:48:45 140 1

原创 [译] Go References - The Go Memory Model | golang官方文档中文翻译之内存模型

本文同步发布于: [译] Go References - The Go Memory Model | golang官方文档中文翻译之内存模型 | yoko blog前言本篇译文对应的原文标题:The Go Memory Model - Go References作者:Go官方文档地址:https://golang.org/ref/mem本文标明yoko备注的内容是我自己写的备注,其...

2019-04-23 14:47:12 184 1

原创 golang的channel和条件变量在单生产单消费场景下的性能对比测试

本篇文章同步发布于:golang的channel和条件变量在单生产单消费场景下的性能对比测试 | yoko blog本文相应的代码附在文章末尾处。场景描述1个生产者只与1个消费者相互绑定。生产者按固定生产频率,每间隔<PRODUCE_INTERVAL_MS>毫秒生产一个任务。生产者每次生产时都检查当前任务队列大小,如果已经超过<QUEUE_NUM_CANCEL_PRO...

2019-04-18 10:38:20 314

原创 #ifndef#define#endif防止头文件重复包含, 你不是真的懂

注:以下所用环境皆为VS2005, 由于本人表达能力有限, 大家有看不懂的地方可以多看几遍  这里首先说明下几点基础知识, 相信大部分人对于以下几点大部分都已经知道了, 你也可以直接跳到最后部分看#ifndef#define#endif的真正作用  1.预编译阶段把所有#include ”***.h“ (“”与的区别这里就不说了)用***.h的内容来替换了, 所以之后就没有.h了所有.h的内容都已经包含进了需要它们的.cpp中(注:该步个人认为是发生在预编译阶段)   2.生成最后的exe文件是由编译、链接

2011-05-06 14:35:00 33974 30

原创 鸡尾酒排序

<br />void sort(int arr[], int len){ bool flag = true; int temp; while(flag) { flag = false; int bottom = 0; int top = len - 1; int i; for(i=bottom; i < top; ++i) { if (arr[i] > arr[i+1]) { temp = arr[i]; a

2011-04-19 11:40:00 996 1

原创 Windows下调试信息 TRACE OutputDebugString

  有的时候程序并没有控制台, 这时打印肯定是不行了, 写文件是个通用的方法, 但比较适合系统上线或者只能使用该方法调试时, windows下有两个打印调试信息的函数, TRACE OutputDebugString  TRACE貌似只能在MFC中使用, 但是可以像printf那样构造字符串  OutputDebugString需要先构造好字符串再把字符串传入打印出来, 但是只要包含了windows.h 就能使用了, 两个函数都是在调试状态下把信息打在output中, 即我们在使用VC时编译时显示编译信息进

2011-04-19 11:06:00 3488 1

原创 AutoLock 解决加锁后忘记解锁问题

class AutoLock{public: AutoLock(CRITICAL_SECTION& cs) : cs_(cs) { EnterCriticalSection(&cs_); } ~AutoLock() { LeaveCriticalSection(&cs_); }private: CRITICAL_SECTION& cs_;};class Test{public: Test() { InitializeCriti

2011-04-19 10:52:00 2116 1

原创 宏编译 预处理头 WIN32_LEAN_AND_MEAN

<br />  在许多windows下的项目中, 我们经常可以看到在stdafx.h中有这么个宏定义#define WIN32_LEAN_AND_MEAN, 它的作用实际上是当我们项目中包含了<windows.h>时去除一些头文件的包含, 加快编译速度, 大家可以跳进<windows.h>中搜索一下WIN32_LEAN_AND_MEAN就能看到去除了哪些头文件的包含了, 据网上说是不使用MFC时可以包含该预处理头, 我也用个小项目测试了一下, 基本上对于编译速度以及生成文件没有多大影响, 所以个人认为大家只

2011-04-19 10:23:00 7417

原创 ACE配置IPv6, VS静态编译ACE库

  使用自己下载的6.0.1版本只需在ACE_wrappers/ace/config.h(没有请自行创建)中添加#define ACE_HAS_IPV6再编译ACE_wrappers_vc8.sln即可, 下面贴出的是我自己的config.h, 具体config有哪些配置及其含义请参照ace目录下的readme文件#define ACE_HAS_STANDARD_CPP_LIBRARY 1 #define ACE_HAS_IPV6#include "ace/config-win32.h"    

2011-03-24 20:58:00 2959 1

原创 获取本机所有ipv4, ipv6地址

<br />    从在线版msdn搜getaddrinfo扒下来改了一下, witch says, function gethostbyname() doesn't work well with ipv6.<br />#include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <iostream>#pragma comment (lib, "Ws2_32.lib")int __cdecl main(int a

2011-03-22 12:25:00 3894

原创 win7注册进程外组件, 服务, 以及COM组件调试

<br />  折腾了一天, 原来又是系统搞的鬼, 在win7下使用/regserver, /service, regsvr32.exe时, 会失败, 尤其使用regsvr32.exe时, 会弹出对话框模块"***"已加载, 但找不到入口点DllRegisterServer, 这都是win7权限惹的祸, 解决方法 开始->所有程序->附件->找到命令提示符右键选择管理员权限打开, 这样就可以注册组件了, 另外不知道可不可以把当前用户的权限设置成最高权限, 虽然我使用的用户是管理员用户, 但是还是得通过右键那

2011-03-16 19:56:00 5600 1

原创 windows工具mstsc远程桌面连接, 方便的在两台电脑间互相拷贝文件

<br />  使用这个windows小工具就可以连接另一台windows电脑并且远程桌面控制它了, 前提是被连接的电脑需要开启远程桌面功能, 以我自己的win7系统为例(xp应该也在差不多的位置), 右键计算机 -> 属性 -> 远程设置 -> 远程桌面里选定允许<br /> <br />  然后再在连接方 运行 里输入mstsc打开mstsc工具, 输入被连接方的IP, 被连接方允许用来连接的账号, 密码, 这里有一个非常值得一提的地方, 当我们想自由方便的在连接方与被连接方传输文件时, 可以在打开ms

2011-03-13 09:35:00 15275 2

原创 屏蔽不显示VS警告warning

<br />用VS编译项目时如果感觉有些警告太多或太烦人, 可以屏蔽该警告<br />注:假设需要屏蔽的warning号为8888<br />第一种方法, 在代码中加入#prama warning(disable:8888)<br />第二种方法, VS编译器中设置, 以VS2005为例, 打开项目属性-> c/c++ -> Advanced -> Disable Specific Warnings 输入8888

2011-03-12 17:30:00 20844 4

原创 windows API 返回错误值的查看及打印

<br />第一种, 相信大家都和熟悉了, 打开VS的Tools菜单下的Error LookUp工具, 将GetLastError()返回的错误值输入就能获取错误信息了<br />第二种, 进入调试模式, 在Watch窗口中选择一行, 输入$err,hr 这样windows API出现错误时就会现在错误值以及对应的错误信息了, 这样就省去了GetLastError(), 在写一些小demo测试的时候比较管用<br />第三种, 我们要结合windows的另一个函数FormatMessage, 下面我贴出一段

2011-03-08 19:35:00 1508 1

原创 创建自定义自启动LINUX服务service

  1.将init_daemon放入程序开始处void init_daemon(){ int pid; int i; if(pid=fork()) exit(0);//是父进程,结束父进程 else if(pid  2.将chefd文件(如下)放进etc/init.d

2011-01-13 13:25:00 5520 2

转载 [转]placement new

<br />  转自csdn bbs的一个提问《new的奇怪用法》的15楼回答, 尽管我知道很大可能他也是不知从哪复制过来的, 网上的东西就这样, 转来转去就无法考究最初出处在哪, 好在我们的重点是多学习有用知识, 弄明白这个问题也就好了 :)<br />  placement new其实它也只是operator new的一个重载的版本,只是我们很少用到它。如果你想在已经分配的内存中创建一个对象,使用new时行不通的。也就是说placement new允许你在一个已经分配好的内存中(栈或者堆中)构造一个新的

2011-01-07 09:53:00 704

原创 用vector保存对象时保存指针的优点, 以及reserve的使用

<br />  代码1<br />#include <vector>#include <stdio.h>class A{public: A() { printf("A()/n"); } ~A() { printf("~A()/n"); } A(const A& other) { printf("other/n"); }};int main(){ A a; A b(a); A c = a;

2011-01-06 14:51:00 14998 3

原创 回溯法, 八皇后

//打开label1处的打印可以看到八皇后的所有解//阅读程序可通过关闭label1打开label2单步调试查看arr的值来理解回溯法#include #include int arr[9] = {0}; //例如arr[1] = 4, arr[2] = 1;表示棋盘第一行第4列以及 //第2行第1列放上棋子 //arr[0]不使用bool Check(int m){ for (int i=1; i 8) { for (int i

2011-01-05 15:21:00 764

原创 大数相加, 大数相乘

#include #include #include //len1 > len2char* Add(const char *param1, const char *param2, int len1, int len2){ int i = 0; int j = 0; char *res = (char*)malloc((len1+2)*sizeof(char)); memset(res, 0, len1+2); for (i=len1-1; i>=0; --

2011-01-04 18:36:00 923

原创 二进制读写文件, 实现任意格式文件的复制以及网络传送

  代码贴在下面, 通过从源文件的开头到结尾二进制形式把文件进行了复制, 我已经测试了一个jpg图片以及一个mp3音频文件, 理论上是所有文件都能进行复制的, 要想实现网络传送只需把从源文件读出的那个src_buf通过socket发送出去就行了  另外大致聊一下文件后缀名, 有说错的地方欢迎大家纠正, 本来后缀名是没有用的, 它并不影响文件内 存储的内容以及结构, 但是因为我们很多程序在打开文件时, 做了通过后缀名来判断应该对该文件名做何种操作, 所以后缀名就变得有用起来, 这里举个简单的例子, 假设你电脑

2010-12-29 18:55:00 5998 5

转载 [转]encoding and decoding base64 with c++

/* base64.cpp and base64.h Copyright (C) 2004-2008 René Nyffenegger This source code is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages arising from the use of t

2010-12-28 18:40:00 1726

原创 VS2005, MFC, 无法打开.rc文件, rc:opened in another editor

<br />  将VS2005中文件编辑窗口中所有关于该项目的文件全部关闭, .rc文件立马就能打开了

2010-12-28 18:35:00 4476 5

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