- 博客(153)
- 收藏
- 关注

原创 Golang协程调度模型MPG
MPG模型通过三级抽象实现了"1:1"和"M:N"模型的优势融合。在实践中,开发者需要理解其"弹性调度"的本质特征:当遇到局部调度瓶颈时,不要试图完全控制调度器,而是通过调整任务分解粒度、控制并发规模等高层策略来获得最佳性能。未来随着Wasm等新运行时的支持,MPG模型可能展现出更强大的跨平台能力。
2025-02-14 00:37:42
413

原创 快速对二叉树和前中后序遍历的相互转化
首先回忆一下前中后序遍历的概念前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。已知二叉树的结构,快速推算前中后序遍历二叉树如图中序遍历根据中序遍历定义第一步:2(左)4(根)6(右)第二步:遍历第一步中的非根节点,还是按照中序遍历
2021-07-25 20:13:11
8763
11
原创 回顾Golang的Channel与Select第二篇
通道所有权原则创建者负责关闭明确区分生产者和消费者角色不要在多处共享写通道性能黄金法则无缓冲通道用于强同步场景缓冲通道大小根据处理时延设置批量处理提升吞吐量错误处理三要素使用专用错误通道实现超时机制支持取消传播生产环境要点// 安全关闭模式= nil {}()close(ch) // 如果ch已关闭会panic// 安全发送模式= nil {}()通过本文的完整示例和模式,开发者可以构建出健壮的并发系统。
2025-02-14 00:54:43
679
原创 回顾Golang的Channel与Select第一篇
Channel和Select的组合构成了Go并发编程的神经系统。深入理解其底层机制需要结合编译器知识、运行时实现和计算机体系结构等多维度视角。在实践中,开发者应当遵循"通道即合约"的原则,明确通道的所有权和使用范围,同时善用select实现优雅的状态管理。随着Go语言的演进,通道这一并发原语将继续在云原生、边缘计算等新兴领域发挥重要作用。
2025-02-14 00:51:38
411
原创 网络性能及IO性能测试工具
网络性能和IO性能测试工具在现代计算环境中至关重要。无论是评估网络带宽、优化数据传输速度,还是检测磁盘读写性能,选择适合的工具至关重要。本文将介绍各种网络性能和IO性能测试工具,帮助您深入了解其功能、用途和如何选择最佳工具。
2024-11-24 23:31:51
611
原创 ecmp观察
在动态路由环境下,切换需要时间。相比之下,等价多路径路由协议可以同时利用多条链路,提高传输带宽,且能够无延迟、无丢包地备份失效链路的数据传输。from=15425),使用内核的ecmp进行路由的hash选路,在该情况下,ECMP会使用哈希算法进行选路:根据数据包的源IP、目的IP、源端口、目的端口计算出一个哈希值,然后再使用这个哈希值取余进行路由选路。veth5的抓包结果如下,可以看到,发往192.168.2.0/24网段的报文,被veth1和veth3均等的进行了路由,根据目的IP的不同进行了哈希选路。
2024-10-23 22:48:58
1082
原创 arp代答观察
* 可以看到proxy用来让vtep代答。代答的主要目的是减少泛洪流量,将泛洪范围控制在本地vtep口,如果不用proxy,则需要将流量泛洪到所有相关的vtep口。但是要提前把将对应的arp配置到vtep上,这个动作可以用我们其它的辅助程序完成**
2024-10-23 22:47:13
1349
原创 gcc配合cython编译python源代码
这三行命令的整体作用是将一个 Python 脚本编译为一个 C 程序,并生成可执行文件main。首先,使用 Cython 将 Python 代码转换为 C 代码,然后编译该 C 代码为目标文件,最后链接目标文件生成可执行程序。这样可以提高执行效率,并允许在 C 程序中嵌入 Python 解释器。这两句命令的整体作用是将一个 Python 脚本编译为一个共享库 (model.so),以便可以在其他 C/C++ 程序中调用其中的 Python 函数和对象。
2024-09-21 03:45:47
1237
原创 二层、三层网络基本原理
从上面可以看到,初始情况,ns1要通过arp广播(地址是ff:ff:ff:ff:ff:ff)解析192.168.1.3对应的mac地址,相当于到一个微信群里面@所有人 谁的ip是192.168.1.3。所以ns2和ns3都收到了同样的广播报文,但是只有ns3通过单播(相当于微信的私聊)做了回复,目标mac是ns1的mac地址。但是每个ns并不知道其他ns的mac地址,应用程序还是用的ip进行通信。这个时候vm1和vm2各自的ns1和ns2是通的,同时,ns各自到主机的网络也是通的。
2024-09-17 16:18:55
1303
原创 如何加入PTP硬件时钟的组播组
首先要先判断当前机器是否能收到PTP时钟源发出的组播包timeout 100 tcpdump -nni bond0 port 319 or port 320 -el -c 100抓包能抓到以下包信息,即能正常收到PTP时钟源发出的组播信息。其中的224.0.1.129即为组播地址第一步正常了后,开始加入组播源ip add add 224.0.1.129/32 dev eno1 autojoin 加入ptp组播源tcpdump -i eno1 igmp -w /tmp/grp.cap抓igmp
2024-09-11 22:14:29
445
原创 DNAT和SNAT实践
NAT分SNAT和DNAT两种。从名字上区分:SNAT将源IP地址替换为出口网络的IP地址,以便内网地址可以访问外网服务。一般受限于公网IP有限,一个内网集合想访问外网服务,则用统一的出口做代理。出口配置公网IP,帮助从此发出的包找到回来的路。DNAT将目的IP地址替换为真实服务的IP地址,以便外网地址可以访问内网服务。一般情况用于内网服务要暴露到公网,提供统一的入口地址。我们用PC1、和EXT模拟两个不同的子网环境(也可以看作内网和外网)。PXY作为网关先创建实验需要的namespace。
2024-09-11 22:01:30
1067
原创 window中相关的日志
蓝屏详细文件:C:\Windows\MEMORY.DMP 此文件信息更丰富,深入分析时需要提供此文件(若文件非常大,可先不提供),操作系统每次蓝屏会用新的文件覆盖此文件,如果蓝屏次数频繁,建议重命名备份一次此文件,便于对比蓝屏原因。蓝屏信息简略文件:C:\Windows\Minidump\ 根据文件生成日期排序,准备最近生成的1-2个文件(此文件很小,提供越多越好)。C:\Windows\System32\winevt\Logs路径下的这四种日志取出。安全日志:Security.evtx。
2024-05-02 17:41:00
216
原创 调试厉器addr2line
Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这在应用程序和内核程序执行过程中出现崩溃时,可用于快速定位出出错的位置,进而找出代码的bug。一般适用于 debug 版本或带有 symbol 信息的库。参考。
2023-06-17 20:01:36
3411
原创 透明、匿名、高匿代理学习记录
透明代理(Transparent Proxy)、匿名代理(Anonymous Proxy)和高匿名代理(High Anonymity Proxy)是网络代理服务器的三种类型,它们主要用于隐藏客户端的真实IP地址,从而提高上网隐私和安全性。透明代理是最简单的代理类型,它会将客户端的请求转发给目标服务器,同时在HTTP头部揭示客户端的真实IP地址。匿名代理在客户端和目标服务器之间起到了中介的作用,它会将客户端的请求转发给目标服务器,但不会透露客户端的真实IP地址。实现高匿名代理的关键是删除HTTP请求头中的。
2023-06-11 22:31:58
1323
原创 cgroup配合tc工具对进程的上下行(出口入口)速度进行限制,附测试脚本
tc配合cgroup可以做很多事,既可以对单个进程、某个IP、某个端口还可以直接限制整个网卡的流量。值得我们研究学习
2023-04-21 22:44:48
1202
原创 golang 死锁就一定会触发all goroutines are asleep - deadlock!吗?
一般其它高级语言,死锁的表现都为程序卡死,但是go则不然,它有可能不卡死有可能卡死,则分情况看
2022-08-14 00:05:01
317
原创 Golang死锁场景总结
都知道golang的读写锁中,只要读锁和读锁之间是不互斥的,写和读、写和写锁之间是互斥的,由于golang中是不支持锁的重入的(有的地方也叫做递归锁)写锁重入导致死锁读写锁冲入导致死锁b.需要注意的点,虽然读与读锁之间是不需要互斥的,但是,当两个读锁重入的时候,需要考虑对应锁对象的写锁是否会影响读锁的重入从而导致死锁例如单独的两个读锁,他们这样是不会死锁的但是需要注意写锁对重入的读锁的影响,可能会出现死锁,当有写锁申请时会阻塞掉新的读锁申请,也就是说当同时有读锁和写锁同时申请获得同一个锁对象时,优先
2022-06-29 23:29:11
1288
翻译 CPython如何实现超大整数
整数是“数字方式”持久化的,这意味着加法就像我们在小学学到的一样简单,python 的源代码向我们展示了这也是它的实现方式。文件longobject.c中名为x_add的函数执行两个数字的相加。上面的代码片段取自x_add函数,您可以看到它遍历数字并执行数字加法并计算和传播进位。当加法的结果是负数时,事情就变得有趣了。的符号ob_size是整数的符号,这意味着,如果你有一个负数,那么它就是ob_size负数。的绝对值ob_size将决定 中的位数ob_digit。与加法的实现方式类似,减法也以数字方式进行
2022-06-26 22:35:58
963
原创 Golang自动强制检查interface中的所有方法是否都实现了,如果没有都实现则编译报错
1.说明nil的类型是nil地址值为0,利用强制类型转换成了ContextBase,返回的变量就是类型为ContextBase地址值为0,然后Context=xx赋值如果xx实现了Context接口就没事,如果没有实现在编译时期就会报错,实现编译期间检测接口是否实现。(一个变量是具有类型和地址两个属性,强制类型转换只修改了类型,但是地址是原来那个(例如是nil),这样的转换的变量不用分配地址)2. 举例子...
2022-06-18 15:07:53
726
原创 Cpython源码分析03(*)_简要总结下Cpython是如何执行python test.py
当我们通过命令行传入参数的方式调用 python 解释器去运行一个模块的时候,比如: $ python test.py 图2.1中所示的过程将开始进行。(当然这只是其中一种运行 Python 程序的方式比如也可以在交互模式下单行运行,对于交互模式,这里暂时不做讨论。) 基于Python3.7Python 可执行程序是一个用 C 语言编写的程序。当它被执行的时候,所发生的事情其实就和其他 C 语言程序(比如 Linux 内核或是一个简单的 hello world 程序)差不多。请花一点时间来理解一下,Pyt
2022-06-04 20:25:10
641
转载 MySQL到底支不支持哈希索引?
经常有朋友问,MySQL的InnoDB到底支不支持哈希索引?对于InnoDB的哈希索引,确切的应该这么说:(1)InnoDB用户无法手动创建哈希索引,这一层上说,InnoDB确实不支持哈希索引;(2)InnoDB会自调优(self-tuning),如果判定建立自适应哈希索引(Adaptive Hash Index, AHI),能够提升查询效率,InnoDB自己会建立相关哈希索引,这一层上说,InnoDB又是支持哈希索引的;那什么是自适应哈希索引(Adaptive Hash Index, AHI)呢?
2022-04-30 14:47:04
338
原创 TCP的blacklog之全连接队列与半连接队列的深入研究
文章目录Linux内核探测工具systemtap的安装与使用backlog、半连接队列、全连接队列是什么半连接队列、全连接队列基本概念linux 内核是如何计算半连接队列、全连接队列的半连接队列的大小的计算模拟半连接队列占满全连接队列(Accept Queue)iprouter 库中的 ss 工具的原理是什么如何快速模拟半连接队列溢出,全连接队列溢出说明:以下所有实验均在Centos7上操作,内核版本为Linux version 3.10.0-957.el7.x86_64你需要对三次握手过程要很熟悉
2022-01-02 20:35:35
8107
转载 Golang多版本管理机制
一门充满生机的编程语言,一定是不断进化向前的。随着 Go 项目的持续发展,它目前已经发布到了 1.17 大版本,而且每个大版本内还会有不少小版本的迭代。对于 Go 的版本更新,我们该如何做好多版本管理。多版本管理的重要性这里简单列举几个我们需要 Go 多版本管理的理由。稳定性考量:虽然 Go1 一直在良好地遵守向后兼容准则,但通常基于稳定性考虑,我们并不会直接升级到最新版本。多项目开发:各项目依赖的 Go 版本不一致。版本兼容:测试代码前后兼容性,或者确保 bug 修复在不同 Go 版本的正确性
2021-12-20 17:01:50
7777
原创 Consul实现http或者grpc服务的注册与发现,Golang、Python的使用记录
consul官网Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:服务发现 Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.健康检查 Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信
2021-12-09 13:37:10
8158
原创 Nuitka将Python源代码编译成可执行文件,注意的地方
Nuitka的GitHub地址在Nuitka之前我们最常用的打包工具就是Pyinstaller了,但是经过反复考虑,我觉得Nuitka也还是很有必要了解记录一下,它可以直接将Python源码打包成dll库或者pyd文件,增加了反编译难度,不会暴露源码,遗憾的是Nuitka和Pyinstaller一样不支持交叉编译Window下第一步安装mingw64,在window上做过c语言开发的应该都知道这个东西这里就不做过多阐述了,记得将其安装的bin目录的路径加到环境变量啊安装nuitka模块 pip i
2021-11-19 12:24:33
9148
转载 深度解密Go语言之unsafe
文章目录指针类型什么是unsafe为什么有unsafeunsafe实现原理unsafe如何使用总结参考资料指针类型在正式介绍 unsafe 包之前,需要着重介绍 Go 语言中的指针类型。我本科开始学编程的时候,第一门语言就是 C。之后又陆续学过 C++,Java,Python,这些语言都挺强大的,但是没了 C 语言那么“单纯”。直到我开始接触 Go 语言,又找到了那种感觉。Go 语言的作者之一 Ken Thompson 也是 C 语言的作者。所以,Go 可以看作 C 系语言,它的很多特性都和 C 类似
2021-10-15 19:25:54
8901
2
原创 如何高效的研究Django框架,少走弯路
毫无疑问,官方文档是最好的资料,但是资料仅仅局限于资料,我们如何快速的对官方文档中提到的知识点进行实验呢,那就是研究django源码的单元测试部分首先我们django源项目clone到本地进入到django项目中的tests目录cd D:\my_project\django-master\tests安装我们的django项目,并下载好对应的依赖注意-e 的方式安装后的django的对应路径也就是我们的D:\my_project\django-master路径python -m pi
2021-10-12 22:00:29
8028
转载 Percona XtraBackup 8.0.26实战大全
目录Percona XtraBackup特性说明Percona Xtrabackup 备份恢复权限限制创建备份用户、配置参数及数据准备Sysbench造数据全量备份与恢复全量备份全量恢复增量备份增量恢复压缩备份解压备份及恢复流备份Percona XtraBackup特性说明Percona Xtrabackup 8.0.26新增支持MyRocks存储引擎,不支持TokuDB引擎Percona Xtrabackup 8.0.26 不支持低于MySQL 8.0的备份(因为MySQL 8.0在数据字典、re
2021-10-01 00:57:59
7940
转载 MySQL,在线热备的内核原理(适用存储引擎为InnoDB的情况)
研发的童鞋每次对MySQL库表做重大操作之前,例如:(1)修改表结构;(2)批量修改或者删除数据;都会向DBA申请进行数据库的备份。画外音:又或者说,不备份直接操作啦?那DBA童鞋是怎么进行MySQL备份的呢?调研了几十个RD和QA,基本是3种答案:(1)不太清楚;(2)在线逻辑备份,mysqldump;(3)离线物理备份(冷备),拷贝从库库文件;那实际上,DBA是如何对MySQL进行库备份的呢?现在基本上使用的是PXB方案。今天,和大家说说MySQL备份的来龙去脉,以及内核原理。
2021-10-01 00:01:24
8114
原创 Python3中impolib模块的reload使用时需要注意的地方
与 Python 2 不同,reload 在最新的 Python 中不再作为内建函数存在了,而被移入标准库 importlib 模块中。实验1,reload基本使用假设我们有个模块叫做config.py导入一下config模块(如果导入报错找不到config模块,请配置模块的搜索路径先再来测试如下的步骤),如下我们在右边终端修改b变量的值为20保存退出,再次导入(这个时候我们退出左边的交互式环境),可以看到b的值并没有发生变化,那有没有不退出左边的交互式环境,热加载呢有的,这
2021-09-25 18:21:37
9464
原创 Golang和C指针异同点的对比
目录指针相同点指针异同点指针相同点1.定义通常我们把指针变量简称指针,简单直白点,指针变量就是用来存储内存地址的变量即为指针变量。2. 用法栈变量赋给指针变量例子,都是通过取地址赋给对应指针变量的,且指针取对应内存地址存的值也是一样的都是用*号。//C版本#include<stdio.h>int main(int argc, char *argv[]){ int * p1; int a = 5; p1 =&a; printf("p1 v
2021-08-29 01:22:09
7815
原创 Cpython源码分析02_Python代码是怎么运行起来的
目录1.python代码运行时的入口2.window与Linux入口出的区别3.继续前进,生成_Py_Main对象,并做简单初始化4.继续前进,我们来到了pymain_mian5.pymain_init都干了些什么事情呢6.继续前进,进入4步骤中的pymain_run_python看看7.重点分析一下pymain_run_filename,既通过交互式环境或者文件执行代码的过程说明:如果没有特殊说明,均基于window平台讨论1.python代码运行时的入口入口文件为python.c,当宏MS_WI
2021-08-20 00:39:39
8559
原创 性能提升优化之_C和Python混合编程之Cython
目录安装与简介Cython定义函数类型建立一个Cython模块测试复杂模型的处理官方例子调用c函数限制条件生成器表达式对比char*常量元组作为函数参数栈帧安装与简介Cython它可以让我们直接将Python代码编译成C语言.Cython可以看成是一个转换器, 可以简单看成一个软件, 它可以把源代码从一种语言翻译成另一种语言。 类似的软件还有CoffeeScript和Dart。 这两个是不同的软件, 使用不同的语言, 但是都翻译成JavaScript。Cython把Python的超集(扩展
2021-08-10 00:45:10
8287
原创 用fastapi快速构建后端服务接口
项目目录结构如下,下载链接如下,提取码c72h fastapi官方文档1.所需模块fastapi==0.66.0requests==2.25.1uvicorn==0.14.0gunicorn==20.1.0protobuf3-to-dict==0.1.5grpcio==1.38.12.config.ini内容如下其中GetIdentityList、GetMetaDataDetailListByOwner 、PublishTaskDeclare为提供给前端调用的接口的URL[Enab
2021-08-05 16:41:26
8847
原创 Cpython源码分析01_使用Visual Studio2017来研究Cpython,debug和release两种模式下编译的Python中__sizeof__()不一样的地方
阅读本文章最好有一些C语言和python语言的基础的读者1.为什么要研究Cpython目前python主流的解释器CPython、JPython、IPython、PyPy、IronPython,但是用到最多的、生态最好的还是Cpython。了解python底存的构造,比如List、Dict、Set、Tuple等他们到底是怎么实现的,而不是用它的时候两眼一抹黑,了解Cpython有助于让我们编写出更加高质量的python代码。由于Cpython中绝大部分都是用C语言编写的,研究它有助于不会忘记C语言
2021-08-04 01:58:02
8596
转载 Python和Golang协程的区别
背景最近在做后端服务python到go的迁移和重构,这两种语言里,最大的特色和优势就是都支持协程。之前主要做python的性能优化和架构优化,一开始觉得两个协程原理和应用应该差不多,后来发现还是有很大的区别,今天就在这里总结一下。什么是协程在说它们两者区别前,我们首先聊一下什么是协程,好像它没有一个官方的定义,那就结合平时的应用经验和学习内容来谈谈自己的理解。协程其实可以理解为一种特殊的程序调用。特殊的是在执行过程中,在子程序(或者说函数)内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着
2021-07-25 18:25:05
8224
转载 python中容易被忽视的三个点
异常处理中的returndef some_func(): try: return 'from_try' finally: return 'from_finally'>>> some_func()'from_finally'当在 “try…finally” 语句的 try 中执行 return, break 或 continue 后, finally 子句依然会执行.函数的返回值由最后执行的 return 语句决定. 由于 .
2021-07-24 23:09:38
7973
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人