自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(302)
  • 资源 (1)
  • 收藏
  • 关注

原创 模板元编程实例---如何设计通用的几何库

模板元编程实例—如何设计通用的几何库设计原理假设你需要使用c++程序来计算两点间的距离.你可能会这样做:先定义一个struct:struct mypoint{ double x, y;};然后定义一个包含计算算法的函数:double distance(mypoint const& a, mypoint const& b){ double dx = a.x - b.x; double dy = a.y - b.y; return sq

2022-02-27 11:57:09 595

原创 BPF性能分析—内存篇page_fault

性能分析—内存篇page_fault分析步骤1.sar -B 1整体分析,重点关注fault/s# sar -B 1Linux 5.4.0-92-generic (zhangxa-Precision-3650-Tower-docker) 01/17/22 _x86_64_ (16 CPU)11:35:37 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff

2022-01-21 21:47:52 713

原创 libco开发教程(一) ---- 第一个测试用例

libco开发教程(一) ---- 第一个例子libco背景关于libco的背景,可以看我之前的文章,在c中实现协程前一段时间一直在忙换工作的事情,因此c语言协程库的开发有一些搁浅.最近换工作的事情告一段落了,代码实现也就提上了日程.感兴趣的小伙伴可以跟着我的教程一步一步实践,最终实现一个功能完善能够在生产中使用的c协程库.TDD项目以TDD测试驱动开发的方式进行编码,我们先来编写一个最简单的测试用例test case#include "gtest/gtest.h"#include "

2021-09-22 15:51:36 199

原创 gRPC详解-----负载均衡策略

1. 背景1.1 基于调用的LB需要注意的是,gRPC的负载均衡是基于每次调用而不是每条连接的.换句话说,即使所有的请求来自同一个客户端,我们也希望这些请求能够在不同的服务上进行LB.1.2 LB的实现方法在介绍任何gRPC的特定实现之前,我们先来浏览一下常见的LB实现方式.balancing.1.2.1 代理模式使用代理能够提供可靠可信任的客户端,还可以向LB系统报告负载情况.代理通常需要更多的资源和操作,因为代理需要拷贝RPC请求和响应的副本.这种模式也会增加RPC的延迟.当请求量很

2021-08-07 20:52:31 941

原创 golang抢占实现(一)----------抢占的时机

golang抢占时机golang 1.14版本以后开始支持抢占协程.这里有个有趣的问题是:用户态调度的goroutine在什么时机触发抢占判断?熟悉linux的朋友可能知道,linux可能的抢占时机有:时钟中断处理里系统调用返回golang目前的实现golang编译器在每个函数调用之前都会插入以下代码: mov %fs:0xfffffffffffffff8,%rcx //获取tls cmp 0x10(%rcx),%rsp // 判断当前协程的stack是否足够

2021-07-14 23:48:34 296

原创 golang程序启动流程详解

golang程序启动流程详解环境go1.16.5 linux/amd64用例package mainimport "fmt"func main() { fmt.Println(42)}编译-gcflags “-N -l”: 关闭优化和内联,方便调试跟踪$ go build -gcflags "-N -l" -o hello hello.go gdb跟踪执行流程$ gdb hello$ source /usr/lib/go/src/runtime/runti

2021-07-10 20:35:22 1156

原创 在C语言中实现协程库(一)----------协程切换原理详解

从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.感兴趣的小伙伴欢迎一起参与代码地址协程切换原理使用glibc中<ucontext.h>提供的相关函数用户态切换简单来说就是保存当前上下文,切换到新的上下文.用户态程序的上下文一般包含如下信息:栈各种寄存器信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息我们来看一下glibc定义的用户态上下文结构ucontext_t:typedef struct

2021-07-04 21:46:17 717 15

原创 自己如何实现自旋锁,互斥锁和读写锁

锁C语言协程库实现锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价.自旋锁自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直到获取到锁而不会让出控制权.自旋锁的特点也使其只能用于保护操作较短的临界区,且不能睡眠.代码实现主要是通过cas等原子操作来模拟.typedef volatile spin_lock_t;spin_lock(spin_lock_t *lock){ do { if (cas(

2021-06-27 19:46:03 282

原创 如何在C语言中实现Golang

如何在C语言中实现GolangGolang介绍Golang语言2007年诞生于Google,Google发明这门语言的目的是什么呢?从语言层面直面问题传统的语言c++, java, python等,都和其使用的计算环境无关.随着多核处理器、网络化系统、大规模计算集群的发展以及Web编程模型的发展,这些传统语言虽然也能应付,但都没有直面面对这些问题.此外,程序规模也发生了变化:今天的服务器程序由数千万行代码组成,由成百上千的程序员编写,每天都在更新.更糟糕的是,构建时间,即使是在大型编译集群上,

2021-06-13 10:07:09 1155 2

原创 C语言中协程(coroutine)实现

无意中发现glibc支持swapcontext, getcontext, makecontext一系列函数,这不正好可以用来实现协程吗?直接撸了一波代码,果然不错。后面逐渐完善相关的io操作库,用它实现一个高性能的服务器.代码地址, 喜欢的记得给个start.后面再写篇文章详细讲述下实现原理。...

2021-06-10 23:35:33 1108

原创 使用antlr4实现简单计算器----python语言

文章在我的主页:http://www.anger6.com/2021/04/24/compile_principles/antlr4/caculator/

2021-04-24 15:22:35 176

原创 开源项目treasure_house

treasure_house介绍treasure_house我开源的一个项目,名字是"宝藏屋"的意思,代表里面是一些有价值的代码。项目语言不限,目的是开发一些业界常用的功能(从基础数据结构到线程池等基础实现)。目的是在造轮子中进一步苦练内功,毕竟很多知识动手实现过和只是用过看过是很不一样的。项目刚刚起步,现在仅实现了链表和内存池。开发人员主要是我和liphx(https://github.com/liphx).欢迎更多代码爱好者参与进来,更多信息可以查看项目地址:https://github.co

2021-03-06 15:15:24 137

原创 BPF学习之性能分析

BPF学习之性能分析1. 概览1.1.目标性能分析前我们需要先明确目标,有的放矢.明确了目标后,进一步的分析工作就有了上下文,不至于跑偏.一般来说,性能分析的目标是改进用户最终体验和降低运行成本.有了目标,最好能将其进行量化:这种量化能够表明是否已经达到优化的目标,还可以定义离目标的差距有多远.可测量的指标:延迟: 多久可以完成一次请求操作,通常以毫秒为单位.速率: 每秒操作或请求的速率.吞吐量: 通常指每秒传输的数据量,以比特(bit)或者字节(byte)为单位.利用率: 以百分比形

2021-01-03 10:57:45 331

原创 docker网络(三) ------------ 端口与DNS

容器网络容器使用的网络类型对于用户而言是透明的,无论底层是网桥,overlay,macvlan或者使用特定的网络插件.从容器的视角看,它有一个自己的IP地址,自己的网络接口,网关,路由表,DNS服务器以及其它与网络相关的细节.发布端口默认情况下,当使用docker create或者docker run创建一个容器时,它不会向外界发布任何端口.要使端口在docker容器之外可以提供服务,你需要使用–publish或者-p选项.这会创建一条防火墙规则将容器内的端口映射到docker所在的宿主机.下面是一些

2020-11-29 11:29:29 202

原创 docker网络(二)-----------iptables

Docker和iptables在linux上,docker通过设置iptables规则来实现网络隔离.这属于内部实现,你也不应该插入iptables规则来修改docker规则.但是,如果你想在docker管理之外添加自己的规则,你可能就需要了解这些细节了.如果你的docker运行在连网的主机上,你可能想通过iptables限制对容器或者其他服务的未受权的访问.本篇文章会介绍如何实现这些功能及需要注意的细节.在Docker规则之前添加iptables策略docker会添加"DOCKER-USER"

2020-11-08 19:33:48 363

原创 docker网络(一)--------------macvlan

docker网络系统文章用于讲解docker几种网络模型和通信方式。实验环境为下面的组网,2台VM连接在一台交换机上,在一个2层网络中。分别在2台VM上启动容器,通过不同网络模型使容器间互通。macvlan是一种网卡虚拟化技术,在现有网卡上虚拟出一块子网卡,子网卡有自己 的MAC地址,共享底层物理网卡更详细的macvlan介绍,可以参考这篇文章:https://www.jianshu.com/p/2b8b6c738bf6分别在VM1,VM2上创建macvlan网络,都属于17..

2020-11-07 20:39:47 376 2

原创 23种设计模式总结

总结记录23种设计模式类图和思想原理。根据GoF的经典著作,将设计模式分为3大类。分别为创建型,结构型,行为型。创建型:与对象的创建有关结构型:处理类或对象的组合行为型:对类和对象怎样交互和怎样分配职责进行描述创建型设计模型单例模式当存在多个实例时可能会相互影响,因此确保只有一个实例需要关注何时生成这个实例(是否需要惰性生成?)原型模式对象种类繁多,无法将它们整合到一个类中时难以根据类生成...

2020-06-26 21:01:37 237

原创 leetcode算法---深度优先遍历系列---------检查平衡性

题目描述实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3/ \4 4返回false 。来源:...

2020-06-25 23:19:40 138

原创 leetcode算法---字符串系列(一)-------比较版本号

题目描述比较两个版本号 version1和 version2。如果version1>version2返回1,如果version1<version2 返回 -1, 除此之外返回 0。你可以假设版本字符串非空,并且只包含数字和. 字符。. 字符不代表小数点,而是用于分隔数字序列。例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版...

2020-06-25 23:12:10 244

原创 leetcode算法---动态规划(DP)系列(一)-------打家劫舍

题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示...

2020-06-25 10:36:33 199

原创 leetcode算法---深度优先遍历系列(一)---------210. 课程表 II

题目描述现在你总共有 n 门课需要选,记为0到n-1。在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例1:输入: 2, [[1,0]]输出: [0,1]解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课...

2020-06-21 23:02:03 126

原创 leetcode算法---深度优先遍历系列(一)---------872.叶子相似的树

题目描述举个例子,如上图所示,给定一颗叶值序列为(6, 7, 4, 9, 8)的树。如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是叶相似的。如果给定的两个头结点分别为root1 和root2的树是叶相似的,则返回true;否则返回 false 。提示:给定的两颗树可能会有1到 200个结点。给定的两颗树上的值介于 0 到 200 之间。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems...

2020-06-21 20:58:03 182

原创 leetcode算法---深度优先遍历系列(一)---------694. 不同岛屿的数量

题目描述给定一个非空01二维数组表示的网格,一个岛屿由四连通(上、下、左、右四个方向)的 1 组成,你可以认为网格的四周被海水包围。请你计算这个网格中共有多少个形状不同的岛屿。两个岛屿被认为是相同的,当且仅当一个岛屿可以通过平移变换(不可以旋转、翻转)和另一个岛屿重合。样例 1:11000110000001100011给定上图,返回结果 1。样例 2:11011100000000111011给定上图,返回结果 <font color="#c7254e..

2020-06-21 18:32:32 255

原创 pytest教程(二)--------使用和调用

上一节我们介绍了pytest的安装和简单使用,这一节我们再加些料pytest不仅容易编写小的测试例,也支持程序和库相关的复杂函数测试通过python -m pytest来调用pytestpython -m pytest [...]这和直接使用pytest命令功能相同,唯一的区别是会将当前目录加入到sys.path中.可能的退出码调用pytest可能产生6种不同的退出码Exit code 0: 所有的测试例都被收集且通过 Exit code 1: 所有..

2020-06-07 19:58:40 326

原创 pytest教程(一)----------简单入门

1.安装pip install pytest查看版本信息pytest --versionThis is pytest version 5.4.3, imported from /usr/local/lib/python3.8/site-packages/pytest/__init__.py2.编写pytest的"hello world"编写test_sample.py,测试func函数# content of test_sample.pydef inc(x): .

2020-06-07 12:52:42 881

原创 zip暴力破解工具Python实现

原理:1.指定密码包括的字符各类:数字,小写字母,大写字母,特殊字符2.指定密码的长度3.遍历所有可能的组合暴力破解在密码比较简单的时候比较有用。使用指导:optional arguments: -h, --help show this help message and exit -a 指定密码中包...

2020-05-04 20:22:06 253

原创 leetcode多线程题(1114)-------------按序打印

我们提供了一个类:public class Foo {public void one() { print("one"); }public void two() { print("two"); }public void three() { print("three"); }}三个不同的线程将会共用一个Foo实例。线程 A 将会调用 one() 方法线程 B 将会调...

2020-04-20 22:57:48 227 2

原创 让你的项目支持autotools

通常我们在linux下用源码安装库或程序,都是使用的autoools工具(虽然可能有些过时,bazel,CMake等等)。但是目前来看,还是一种不错的选择。典型安装过程:./configuremakesudo make install如果你自己创建了一个开源项目,自己手工编写Makefile的痛苦可想而知,因此还是用autools吧,如果正好你不太好用。就用下面的脚本生成...

2020-04-16 21:49:51 156

原创 vim命令大全

熟悉VIM的朋友都知道"."操作符的强大,因此如果能够在进行操作的同时从普通模式进入插入模式将会事半功倍。因此收集了具有此作用的复合命令即其长命令。方便大家更好的进行创作:复合命令 等效长命令 作用 C c$ 从光标所在字符删除到行尾并进入插入模式 s cl 删除光标所在字符并进入插入模式 S ^c 删除光标所在行并进入插入模式...

2020-04-06 11:50:15 123

原创 浅谈overlayfs

overlayfsoverlayfs试图在其它文件系统之上提供一个联合的文件系统视图Upper and Loweroverlayfs组合了2个文件系统---Upper文件系统和Lower文件系统。当同名文件在Upper和Lower中都存在时,Lower中的文件会隐藏,如果是目录,则会合并显示.Lower文件系统更准确的说法应该是目录树,因为这些目录树可以属于不...

2020-03-15 20:16:10 570

原创 leetcode竞赛179场周竞赛(4)------------1377. T 秒后青蛙的位置

给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到n。青蛙从顶点 1开始起跳。规则如下:在一秒内,青蛙从它所在的当前顶点跳到另一个未访问过的顶点(如果它们直接相连)。 青蛙无法跳回已经访问过的顶点。 如果青蛙可以跳到多个不同顶点,那么它跳到其中任意一个顶点上的机率都相同。 如果青蛙不能跳到任何未访问过的顶点上,那么它每次跳跃都会停留在原地。无向树的边用数组edges描...

2020-03-14 22:54:17 158

原创 leetcode竞赛179场周竞赛(3)------------通知所有员工所需的时间

公司里有 n 名员工,每个员工的 ID 都是独一无二的,编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。在 manager 数组中,每个员工都有一个直属负责人,其中 manager[i] 是第 i 名员工的直属负责人。对于总负责人,manager[headID] = -1。题目保证从属关系可以用树结构显示。公司总负责人想要向公司所有员工通告一条紧急消息。他将会首先通...

2020-03-13 22:53:02 211 1

原创 剑指offer(12)------矩阵中的路径

'''0:left1:right2:up3:down'''paths = []def path_in_matrix(matrix, s): row, col = len(matrix), len(matrix[0]) global paths paths = [] if len(s) == 0: return True def...

2020-03-09 21:55:18 98

原创 进阶篇---------设计一个O(1)的资源池

设计一个资源池,以下三个操作满足O(1)复杂度:(1)从未分配的资源中分配一块资源;(2)从已分配的资源中释放指定资源;(3)随机访问一块已分配的资源。大致意思是这样。class ResourcePool: def __init__(self, cap): self.rc = [i+1 for i in range(cap)] self.rc[c...

2020-03-08 22:09:58 343

原创 剑指offer(10)--------斐波那契与蛙跳

def fib(n): if n <= 1: return n return fib(n-1) + fib(n-2)def fib_no_recusive(n): if n <= 1: return n i, j, k, r = 0, 1, 2, 0 while k <= n: r = ...

2020-03-08 21:32:41 127

原创 剑指offer(9)--------用两个栈模拟队列, 用两个队列模拟栈

class TwoStackQueue: def __init__(self): self.head_stack = [] self.tail_stack = [] def appendTail(self, val): self.tail_stack.append(val) def deleteHead(self): ...

2020-03-08 20:46:18 87

原创 如何直观地打印一棵二叉树

按层次结构打印二叉树,如下面这棵class Node: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right def __str__(self): retur...

2020-03-08 19:05:22 343

原创 剑指offer(7)----------重建二叉树

已知二叉树的先序和中序遍历结果,重建这棵二叉树class Node: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right def __str__(self): ret...

2020-03-08 16:21:22 64

原创 剑指offer(8)-------------二叉树中序遍历的下一个节点

使用两种方法实现。方法一:中序遍历二叉树,记录指定节点,当遍历到下一个节点时返回时间复杂度o(n)方法二:1)当指定节点有右子树时,返回其右子树的第一个中序遍历节点2)当指定节点无右子树时,如果其是父节点的左节点,则返回其父节点3)当指定节点无右子树,且是其父节点的右节点,则一直向上找父节点,当找到某个父节点是其父节点的左节点时返回时间复杂度o(logn)...

2020-03-08 15:58:29 90

原创 leetcode竞赛题练习 回溯法(一)------------生成每种字符都是奇数个的字符串

有志同道合的朋友,可以大家一起交流监督学习。哈哈哈 !!!5352.生成每种字符都是奇数个的字符串给你一个整数n,请你返回一个含n个字符的字符串,其中每种字符在该字符串中都恰好出现奇数次。返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。示例 1:输入:n = 4输出:"pppz"解释:"pppz" 是一个...

2020-03-08 12:06:37 168

openstack资料

openstack相关资料

2017-01-18

空空如也

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

TA关注的人

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