自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

MBuger的博客

与其临渊羡鱼,不如退而结网。

  • 博客(87)
  • 收藏
  • 关注

原创 二八法则

说明二八法则:二八定律是19世纪末20世纪初意大利经济学家帕累托发现的。他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,因此又称二八定律。(搬运百度百科词条)但其实二八法则不止适用于经济学,在生活中的很多地方都可以有很好的验证。今天端午假期闲着没事总结了一下在工作中遇到的一些适用于二八法则的场景,明白了这些以后可以在一定程度上提高工作效率,少走弯路。技能学习技术人员需要不断的学习和精进,但是知识是学不完的,在海量的知识面前我们应该如何进行选择?一

2020-06-26 11:21:56 2010

原创 一次代码review引发的思考与总结(好的编码习惯总结)

缘由毕业后工作一年多,一直想总结一下工作中收获到的一些好的经验,但是一直没有找到机会把这些零散的经验好好的总结汇总起来。这一次在公司经历了整个一个功能模块从无到有的过程,包括,需求分析,模块设计,代码编写,前后端联调与自测,以及后期的bug的查找与修改,且整个过程都是由我一人负责,感觉又收获到了很多宝贵的经验。借着这个机会就将收获的经验总结记下。编码在公司完成了一个模块的代码编写后,进行了一...

2020-04-10 00:25:41 555

原创 【Ubuntu中合并cgroup挂载点失败】报错:mount: none is already mounted or /cgroup/cpu busy

问题有时候我们可能会遇到需要修改系统默认cgroup挂载点的情况,例如需要把cpu,cpuacct,cpuset挂载到一起的情况,但是有些操作系统如果直接使用下面方法合并挂载cgroup的时候可能会遇到下面这种报错。具体原因目前无法得知,很可能的原因是不同的操作系统版本限制。但是我们可以换另外一种方式解决这个问题。猜想cgroup默认挂载是由systemd去划分挂载的,那么systemd...

2019-11-25 09:16:20 4286

原创 git rebase的使用(二)修改commit内容

简介有时候想修改某个部分代码,但是不想提交新的commit,需要在某次commit的原基础上进行修改,同样可以使用git rebase。使用示例如图所示,分别提交两次commit,现在想要修改first commit的内容:接着在bash中输入命令git rebase -i HEAD~2弹出编辑窗口修改第一次提交的操作选项pick为edit,保存退出,发现文件内容变为了第一次提...

2019-01-11 15:35:20 3436

原创 git rebase 的使用(一)合并多次提交记录

简介有时候编写一个功能或者需求会提交多次commit,而有些commit只是修改了一些无关紧要的东西。而过多的commit记录是不利于codereview,并且当遇到特殊情况需要做版本回滚的时候,过多的commit记录也会带来问题。这个时候就需要把一些commit记录进行合并。让每个commit都是一个完整的功能,做到每个commit都是有必要的。使用示例现在工作目录中创建一个测试文件git...

2019-01-10 16:54:53 4870

原创 服务器压力测试工具2——压力端控制模块设计

简介压力端控制模块(Robotctr)相对简单,主要负责控制压力端的压力生成以及部分测试数据的上传。设计思路Robotctr读取配置文件,把相应的配置项通过HTTP发送到各个Robotsrv,并使用HTTP请求控制Robotsrv机器的启动和停止测试。请求包括:1.start请求:开始测试请求,会向配置文件压力服务器列表中的所有Robotsrv发送start请求。如果某个Robotsrv启...

2018-11-03 16:50:50 495

原创 服务器压力测试工具1——压力端模块设计

简介压力端主要负责压力的产生,以及压力

2018-10-20 13:22:32 1397

原创 服务器压力测试工具0——需求与设计

简介目前网上有各种服务器的压力测试工具,大多针对于支持http协议的web服务器。现在需要实现一个压力测试工具,能够实现对各种连接协议的服务器进行测试,包括但不限于http,tcp,websocket协议。功能需求1.能够实时获取服务器对客户端请求的最大最小以及平均响应时间,百分之九十响应时间,超时任务数,请求错误数,错误率和实时的QPS,并同步监控服务器的性能信息。2.可以实现对不同类型...

2018-10-18 16:38:39 1019

原创 错误:Only one usage of each socket address (protocol/network address/port) is normally permitted.

说明在windows中使用go实现了一个服务器压力测试工具,使用的TCP协议,在调试期间,出现问题如下Only one usage of each socket address (protocol/network address/port) is normally permitted.从字面上来看是告诉我们是socket被复用了。在网上查了原因之后发现是套接字用完了,也就是同时建立的TC...

2018-10-16 15:09:02 26790 3

原创 如何获取一定范围内不重复的随机数

简介生成一个随机数是很多时候需要实现的,往往会采用时间种子的方式,如下所示。#include <iostream>using namespace std;int main(){ int i = rand(); printf("%d", i); return 0;}这种直接使用rand函数去获取随机数的方式由于使用了默认的随机种子,所以获得的...

2018-08-06 10:54:41 2893

原创 go语言中空结构体的使用

简介 go语言中的struct是一种很重要的语法,里面可以存放各种字段,当然它里面也可以为空。这样可以用来单纯的做控制信息。 示例type Cli struct { Request *http.Request ReqBody []byte N int C int QPS float64 M string Req *http.Req...

2018-03-30 15:49:41 4679

原创 go语言中如何阻塞函数

简介在使用go的时候通常会使用到goroutine,但是往往例如下面的情形就会出现问题。func main(){ go dosomething() go dosomething()}上面这种写法通常会让程序一闪而过。这个时候可能需要阻塞住主函数让他不退出。有人会说能不能像c++里面一样使用一个空的for循环?这里是不行的,go不允许使用出现空的循环语句。使用sel...

2018-03-17 15:34:13 3076

原创 关于STL中string的拷贝问题

简介在不同版本的STL中string类实现拷贝的方式也是不一样的。大致分为三种方式 eager copy(贪婪拷贝):这种情况是最简单粗暴的拷贝方式,也就是每个对象都是相互独立的,每次拷贝都是深拷贝。这种拷贝方式的缺点就是浪费空间,但是保证了每个对象的独立互不干扰。SSO(small string optimization,小字符串直接放在对象的栈空间中):这种拷贝方式对小字符串的处理很高效,一般

2017-09-09 13:46:57 1443

原创 关于服务器的负载均衡问题

简介当前的网络web服务器都面对着访问量大,并发量高的问题,例如百度这种搜索引擎,每天都会收到数百万的访问请求,这就会导致服务器的CPU,I/O处理能力成为瓶颈。 而最开始人们处理这个问题的方法是把服务器的业务进行分割,把不同的请求分离到不同服务器进行处理。比如用一台服务器处理新闻的请求,一台服务器处理图片请求等等。但是这样并不能有效的解觉问题,因为网络访问具有突发性,很难确定哪些请求会造成服务器

2017-07-29 03:11:29 1597

原创 一致性哈希算法的两种优化方案

简介上一篇博客我简单的介绍了一致性哈希算法的基本思想。但是一致性哈希算法的提出当然也同样伴随着新的问题出现,那就是当某一个服务器结点挂掉之后,它的任务就会分配到它的下一个服务器结点,那么这就有悖于分布式系统中需要满足平衡性的要求。问题雪崩效应在服务器上会有一些数据会经常被访问,这些数据的访问次数远远高于其他数据,那么这些数据就被称为热点数据,理所当然在分布式服务器中承载这些热点数据的服务器的负载就要

2017-07-27 16:12:45 4568 1

原创 分布式服务器中一致性哈希算法的简介

简介首先我们需要知道什么是哈希,哈希一般都是将一个大数字取模然后分散到不同的容器里面,在一个分布式的服务器系统之中,通常会使用哈希的算法来处理服务器的负载均衡问题,每一个服务器就是一个容器,我们把数据按照哈希算法分布在不同的服务器,这样就可以减小服务器的负载,增大服务器的处理能力。一致性哈希和普通哈希那么,一致性哈希和普通哈希有什么区别呢?其实一般的哈希都是不一致的。例如这里有6个数字,123456

2017-07-27 01:10:53 895

原创 关于如何理解TCP的三次握手与四次挥手

简介TCP协议中的的三次挥手和四次挥手简单来说就是TCP连接建立的过程和断开的过程,三次握手第一次握手即client端发送一个带有SYN标志位的同步TCP报文段向server端,表示请求连接。同时,该报文段包含一个序号。 第二次握手即server端发送一个TCP报文到client端表示确认连接,这个TCP报文也带有SYN标志位,同时发送自己的序号,并对第一个报文中的序号加一表示确认收到。 第三次

2017-07-02 13:41:49 1400

原创 TCP协议以及其报头结构分析

简介TCP协议是TCP/IP协议族中的一个重要协议,与IP协议相比,TCP协议更靠近应用层,属于传输层协议,因此在应用程序中具有更强的可操作性。一些重要的socket选项都和TCP协议相关。TCP协议的特点传输层的主要协议有两个:TCP和UDP,总的来说TCP协议相对于UDP协议的特点是:面向连接,字节流和可靠性。1.使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。 2.双方都必须

2017-07-01 22:42:09 3351

原创 形象理解计算机网络里的各种抽象概念

简介在计算机网络里有很多抽象的概念难以理解,还有一些相似的概念很容易混淆。比如什么是IP地址,什么又是MAC地址,他们之间又有什么区别和联系;再比如什么是路由器,什么又是路由表,它们又是用来干什么的?诸如此类的问题我相信很多初学者都很难真正的理解清楚。名词解释在形象的解释这些名词之前,我们先来看一看书面上对这些名词的解释。路由器:是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定

2017-07-01 12:02:11 4592 3

原创 抓包分析IP报文结构

IP报头结构IPv4的头部结构如图所示。其长度通常为20字节,除非含有可变长的选项部分 ·4位版本号:指定的IP协议的版本。对IPv4来说,其值是4。·4位头部长度:标识该IP头部有多少个32bit字。因为4位最大能表示15,所以IP头部长度最长是60字节。·8位服务类型:包括一个三位的优先权字段(现在已经被忽略),4位的服务类型(TOS)字段和一个保留字段(必须置0)。4位TOS字段分别表示:最

2017-06-30 15:45:17 13619

原创 理解ARP协议以及IP与MAC地址的关系

简介ARP协议位于TCP协议栈中的数据链路层,称为地址解析协议,ARP协议实现任意网络层地址到任意物理地址的转换,例如IP地址转换为MAC地址。工作原理主机想自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址,此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。ARP报文结构·硬件类型字段定义物理地址的类型,他的值为1表示MAC地址;·

2017-06-29 16:38:29 14157

原创 关于如何理解TCP/IP协议栈的工作模式

简介TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。 更好的理解为了实现跨越互联网的主机A上的进程P1和主机D的进程P2之间的通信,我们逐层把这个任务交给TCP/IP协议栈。 应用层:我需要发送数据到其他的机器的进程之上; 传输层:如果有人能帮我把数据从某个网络中的机器A搬到另一

2017-06-28 14:20:30 2057

原创 关于线程中锁的使用以及死锁情况

简介当多个线程同时访问共享数据时可能会冲突。比如两个线程都要把某个全局变量加一,而这个操作在底层实现的时候是需要三条指令完成,也就是说加一的操作不具有原子性。那么也就会造成不同的线程对其进行了加操作。 对于多线程的程序,这种冲突的问题是很常见的,解决的办法就是引入锁的概念。获得锁的线程可以完成对数据的读->修改->写的操作,而没有获取锁的线程就只能等待且不能访问共享数据。也可以说是锁把原本加一这种

2017-06-14 17:01:04 1094

原创 Linux中的线程与线程的基本操作

简介进程的颗粒度太大,每次都要有调入,保存,调出。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成a,b,c等多个块组合而成,这里的abc就是线程。在Linux系统中其实没有真正意义上的线程,不和windows系统中一样,windows中的进程和线程有着明确的区分,各有各的数据结构,API等等。在linux

2017-06-13 22:00:55 591

原创 Linux进程间通信方式之消息队列

简介消息队列是systemV风格中一种进程间通信的方式,它提供了一种从一个进程向另一个进程发送一个数据块的方法。他在Linux下是以双向链表(list_head)的形式实现,可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。 可以在/include/linux/msg.h路径

2017-06-09 15:55:25 751

原创 使用哈希表解决几个常见算法题

简介哈希表是一种非常常见的KV型的数据结构,他的搜索效率十分高,时间复杂度通常都在O(N)。在C++11之后,引入了容器 unordered_map,它的底层实现就是哈希表,所以我们在需要使用哈希表的时候通常就利用unordered_map。问题1.复杂链表的复制;2.两数和问题;3.计算最多有几个点在同一直线上;一.复杂链表的复制问题分析:复杂链表即链表结点结构中除了数据域data和next指针之

2017-06-04 15:43:40 6661

原创 Linux进程间的通信方式之管道

简介管道是进程间通信(IPC)的一种重要方式,在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的,如图。它由进程之间的关系可以分为匿名管道和命名管道。匿名管道即两进程之间存在血缘关系时使用的管道,命名管道即两进程之间不存在

2017-05-29 13:35:55 643

原创 文件描述符和文件描述符表

文件描述符与文件描述符表前面我们介绍过Linux中有一个结构体task_sturct专门用来控制进程叫做进程描述符,在它的里面存放了各种关于进程的信息,其中有一个指针,源码中给出的定义为:struct file_struct *file ,它指向一个file_struct结构体,即文件描述符表,每个进程都有一个自己的文件描述符表。我们所说的文件描述符(fd)就被写在这个file_struct之中,

2017-05-16 21:26:52 4078

原创 实现带最小值操作的栈

简介栈的结构特性是后入先出,一般栈给出了基本操作接口有: empty:栈空返回真; pop:移除栈顶元素; push:在栈顶增加元素; size:返回栈中元素数目; top:返回栈顶元素。 今天我们要实现一个新的栈,在这些普通栈的操作上增加一个新的操作min,那就是返回栈中的最小元素。设计思路在新设计的栈中使用两个库中给出的栈,一个按照正常的压栈顺序向栈中存入数据,另一个栈只在存入的数据

2017-05-14 15:52:56 703

原创 虚函数与纯虚函数

简介虚函数在C++中虚函数是实现多态的一种机制,核心理念就是通过基类访问派生类定义的函数。 最常见的例子就是如下class A{public: virtual void foo() { cout << "A::foo() is called" << endl; }};class B :public A{public: virtual vo

2017-05-09 20:14:22 356

原创 僵尸进程与孤儿进程

上篇博客我们讲到进程在系统中的状态,在Linux系统编程中,进程经常会出现僵死状态(僵尸进程)和孤儿进程的情况。这篇博客就将详细的介绍这两种进程。孤儿进程孤儿进程是指在进程还未退出之前它的父进程就已经先退出了,简单来说就是一个没有父进程的子进程就是孤儿进程。既然所有的进程都必须在退出之后被父进程的wait()或waitpid()以释放其遗留在系统中的一些资源,那么孤儿进程的这些东西又谁来处理呢?这个

2017-05-04 18:00:13 697

原创 C++11特性:智能指针介绍

简介在C++98标准里面就已经有了智能指针的概念,它是把指针封装成为了一个类。这层封装让指针像是一个对象,这个对象的行为像一个指针。它的作用就是为了实现对指针的生命周期的管理。例如下面代码DataType *T_ptr = new DataType();......delete T_ptr;T_ptr = NULL;这段代码的后两句是用来结束掉指针T_ptr的声明周期,但是如果代码量大了之后

2017-05-02 22:34:13 559

原创 C++11特性:auto关键字与基于范围的for循环

autoauto关键词在c++98中就有过,用来定义变量为自动生命周期,完全是鸡肋,因为不用auto变量本来就是自动生命周期啊,所以c++11中,auto的用法改变了,简单来说它的作用就是声明变量时可以根据变量类型自动推断类型。类似于java中的var。 例如int a = 0;//auto只能识别初始化的变量。auto b = a;//b被推断为int。但是auto的出现是为了解决一些变量定义

2017-04-27 18:52:54 1160

原创 C++11特性:右值引用与move语义

右值引用右值引用是C++11中的一个重要特性,它的出现解决了很多C++历史遗留问题。其总结来说可以说是解决了栈中对象的所有权的转移问题。首先右值是从C语言设计时就有的概念。不严格的来说,左值对应变量的存储位置,而右值对应变量的值本身。C++中右值可以被赋值给左值或者绑定到引用。类的右值是一个临时对象,如果没有被绑定到引用,在表达式结束时就会被废弃。于是我们可以在右值被废弃之前,移走它的资源进行废物利

2017-04-26 22:42:15 1067

原创 详细说明优先级队列的使用方法

简介优先级队列是一种常见的数据结构,在《STL源码剖析》中给出的定义是:priorty_queue是以个带权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素。 但是优先级队列中的元素并非依照被推入队列的顺序排列。而是自动依照元素的权值排列。权值最高者排在最前面。 缺省的情况下维护的是一个大堆,即权值以从高到低排

2017-04-24 23:00:11 4329

原创 实现时间复杂度为O(nlogn)的链表排序算法

简介链表排序是一道常见的关于链表的算法题,往往我们会使用冒泡排序或者选择排序这两种算法来解决这个问题。但是它们的时间复杂度是O(n²),效率不高。所以今天我们要实现时间复杂度O(nlogn)的算法就不能再选择这两种排序算法。而满足这个时间复杂度的排序算法只有快速排序,堆排序和归并排序。但是因为快排和堆排是不稳定的,所以我选择了归并排序算法来实现链表排序问题。关于归并排序我以前写过一篇博客,里面介绍了

2017-04-20 15:15:30 4299

原创 解决ssh: connect to host github.com port 22: Connection refused

问题引入当你在Linux环境下配置好git并链接到后,你想要把本地的代码上传到github中。但是当你push的时候,会出现失败的情况。ssh git@github.com使用上面的命令查看详细错误信息,得到以下结果 解决方法然后我们进入.ssh的配置目录查看,发现ssh目录里少了配置文件config。 找到原因后我们进入.ssh的目录,往里面添加config文件,并写入你github的配置

2017-04-18 12:17:17 46206 19

原创 通过指令“ps -l”查看进程信息

简介在Linux环境下使用ps -l指令即可以查看当前环境下与bash相关的的进程信息。 如图所示 下面我们来依次解释下这些内容F:代表这个进程的旗标,说明进程的权限常见的有4和1,4表示该进程是使用的root权限,1表示此进程是fork之后未执行的。现在的0则表示两者都不是。S:代表这个进程的状态(STAT)具体分为以下几个状态 R(running)可执行状态,只有在该状态下的进程才可能

2017-04-17 22:47:57 2676

原创 C++实现二叉树的非递归遍历(层,前,中,后序)

简介二叉树是一种非常重要的数据结构,二叉搜索树,AVL树,红黑树等都是以二叉树为基础实现的搜索结构,作为一种搜索结构,遍历算法是非常重要的。下面我们就来讲解一下二叉树的各种遍历算法。层序遍历层序遍历即从根结点开始一层一层的访问二叉树的结点,直到所有结点被访问。在代码实现中我们利用队列先进先出的性质,把结点从根结点开始一一的按照先存根再存左右孩子的原则存入队列。vector<int> LevelOr

2017-04-15 21:51:09 3416 2

原创 Linux中的进程控制模块task_struct

简介计算机体系中控制进程的模块我们把它叫做进程控制模块,即PCB。它是对进程控制的唯一手段也是最有效的手段。 在Linux 中PCB是由task_struct 数据结构来定义的,当我们调用fork() 时, 系统会为我们产生一个task_struct结构。然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理。因此了解task_struct的结构对于我们理解进程调度的关键

2017-04-14 11:56:11 1657

空空如也

空空如也

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

TA关注的人

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