自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 bpf_xdp_attach源码分析

函数, 这个函数是通过netlink这个套接字来完成对应的功能的, 那么什么东西是net link呢, net link是一个提供用户空间进程与内核之间的通信方法, 这种方式是比ioctl要好很多的,这个函数是内核编程和网络编程的一部分,通常用于处理来自内核的异步事件或响应。然后是下面这个函数,我们也来分析一下,函数参数我们在之前已经说的的比较清晰了, 下面这个函数最终会调用一个。我们看一下如何使用上面这个函数, 这个函数的第一个参数是ifindex, -1表示对应的。这段代码是一个C语言函数,

2024-08-24 14:04:09 715

原创 probe的处理

在一些程序中存在两种比较特殊的探针, 分别是begin探针和end探针, 那这两种探针是如何实现的呢。然后是对应的封装函数:, 首先是。

2024-08-18 13:43:19 191

原创 获取寄存器的参数

获取完成对应的索引之后,然后使用。

2024-08-15 21:54:36 309

原创 为什么需要直方图这样分析格式

例如,当你想要了解系统调用 `read()` 返回的字节数分布时,可以使用 `bpftrace` 的 `hist()` 函数来生成直方图。这条命令会统计特定进程的 `read()` 调用返回的字节数,并以直方图的形式展示出来,其中 `@bytes` 是存储数据的变量,`hist` 函数用于生成直方图,`args->ret` 是 `sys_read()` 调用的返回值。总的来说,直方图在 `bpftrace` 中是一个强大的工具,它提供了一种直观的方式来分析和理解数据的分布情况,帮助诊断和优化系统性能。

2024-08-14 23:14:52 223

原创 如何遍历map

我们都知道ebpf为什么提供了一个内核态到用户态的一个数据交互中心, 这个数据交互中心就是bpf map, 在之前的一篇文章中我向你介绍了如何使用bpf map中的 array 改进 debug fs带来的一些问题。观察上面的输出结果, 我们通用可以发现一个问题, 那就是, 这是结果是实时的, 也就是说执行一次就输出一次当前线程对应的map值, 也就是当前线程执行的次数。然后就是遍历的函数了, 循环的开始位置就是我们的第一个键, 然后我们不断的根据这个键去找到它对应的值, 计算对应的偏移量。

2024-08-14 15:14:16 449

原创 linux调度器分析

Linux 调度器通常被称为“完全公平调度器”(CFS,Completely Fair Scheduler),它与传统的时间片调度方式有所不同。CFS 旨在为每个进程提供公平的 CPU 时间分配,而不是通过固定大小的时间片来强制中断进程的执行。既然是一个调度器,核心的问题就是合理的将CPU的时间分配给对应的进程, 另外一点就是调度的对象, 调度的对象是一个进程,进程分成两个部分,第一种进程是实时进程,这种进程存在明显的截止时间,第二种就是普通的进程。schedule是整个调度器的核心, 这个函数可以。

2024-07-16 21:18:12 255

原创 evpipe性能事件循环

这行代码的意图是设置当进程接收到 SIGINT 信号时调用 term 函数。term 应该是一个用户定义的函数,用来处理 SIGINT 信号,例如清理资源或优雅地退出程序。上面一篇文章我们主要介绍了性能事件管道的初始化函数,这一篇文章我们主要介绍如何将性能事件给拉取出来。

2024-07-12 00:28:04 199

原创 eventpipe源码分析

下一个函数是性能事件队列初始化函数,这个函数对应的接口是性能管道, cpu和对应的长度。然后我们看一下关于事件处理对应的逻辑, 函数的参数是事件。首先我们看eventhandler的注册函数。

2024-07-12 00:09:03 241

原创 perf_event一些数据结构

它包含了一个用于链表的 node(使用 sys/queue.h 中的 TAILQ_ENTRY 宏),一个 type 字段用于标识事件类型,一个 priv 字段用于存储私有数据,以及一个 handle 函数指针,该函数用于处理事件。evpipe_t 结构体定义了整个事件管道的状态,包括一个 BPF 映射文件描述符 mapfd,CPU 数量 ncpus,一个指向 pollfd 数组的指针用于 poll 调用,以及一个指向 evqueue 数组的指针 q。: 表示 perf 事件记录的总大小(以字节为单位)。

2024-07-11 21:22:20 417

原创 网络框架的发送数据的处理

写出的字节数在0与消息体大小之间,代表消息发送了一部分,在这种状态下我们应该不断进行重试,直到检测到消息发送完全,或是TCP连接不可写为止。写出的字节数为0,代表TCP连接处于不可写状态,此时我们应该从Writer线程注册一个多路复用的可写事件,写出的字节数量与实际字节数量相同,那么就直接调用对应的回调函数。,在发送消息时候参数有object代表的消息体以及。在读取数据的时候,我们使用是。类中添加的两个核心方法。代表的消息回调函数,使用。

2024-06-30 22:57:32 338

原创 linux的平均负载

uptime命令会输出三个平均负载,分别是1分钟,5分钟,15分钟的的三个值,注意这个1分钟是过去一分钟的情况。当系统出现一些瓶颈的时候我们往往会使用uptime或者top命令来看看系统的使用情况。平均负载是指系统处于可运行状态和不可中断状态的平均进程数量,也就是平均活跃进程数量。uptime命令关键的地方告诉我们系统的平均负载,那么什么是平均负载呢?但是我们还需要搞清楚一点是CPU的负载有时候并不完全等于平均负载。

2024-06-30 11:54:00 371

原创 TDD的测试文档化

测试应该是文档, 而文档不是我们实现的过程。所以我们需要对我们的测试用例进行一些文档改造,以确保文档和代码之间的匹配,才能更好地理解和维护我们的软件系统。所以我们需要对此进行一些修正, 所以将上面的测试描述改成。改完这些不一致的行为, 从文档角度上来看, 我们可以继续对这些测试进行进一步的分组。首先第一个就是关于命名不一致的情况,这也是由于之前重构测试用例代码导致的。然后我们继续看下面这个测试描述, 同样也是从config的角度来看的。经过这些步骤我们让我们的测试用例描述的更加一致``

2024-01-12 13:23:35 469 1

原创 为什么说JavaScript的模块是静态的?

不同于Nodejs的动态加载, ES6的模块技术确是静态的, 那么究竟是怎么一回事?

2024-01-08 22:32:07 409

原创 为什么测试也需要重构?

我们在使用TDD的时候, 会不断添加测试, 这是因为我们需要通过这些测试去驱动完成我们的功能。,我们也需要对这些测试用例进行进一步的重构, 比如我们观察下面的测试代码。无论你是间接传递的, 还是直接传递, 这两个测试代码都是一样的,也就说这个是一个设计重复, 这两个东西就是我们在设计决策中产生的遗留。因此需要重构来消除我们的测试构造中的留下来的不一样印记, 比如。

2024-01-07 22:35:12 899 1

原创 技术人漫步在写作的路上

把每一个可以做好的事情都做到最好,而那些无法掌控的因素交给命运和时间。经过我这五天的写作, 我发现写作不是什么简单的事情, 写作的时候你要考虑很多问题, 比如文章主题的选择, 文章内容如何叙述, 那种表达才能让别人更加容易的理解, 而且这些事情没有一件是简单的, 需要不断的调整, 更要想方设法的去复盘,同时了解为什么会产生这样的阅读量, 只有这样才能真正成长。继续保持良好的阅读与思考的能力, 这两年的坚持的技术阅读与思考, 让我有了很好的技术视野和技术基础, 而我对编程语言的理解是非常深入的。

2024-01-06 20:14:55 386 1

原创 揭秘一种微妙的代码坏味道,以及重构之道

当你使用某些数据来构建 providers 时,实际上也在同时构建了相应的 dependencies。这意味着我们可以在构建 providers 的时候顺带构造出 dependencies就行了,无需额外引入一个独立的 dependencies,这样使得代码更加简洁和紧凑。因此,原本构建 providers 的操作也需要进行相应调整。在构建 providers 的同时,我们也会顺带着构建相应的 dependencies。在实现IOC容器时候, 我们碰到这样的一个场景, 具体的代码如下。

2024-01-05 15:20:10 425 1

原创 优雅应对代码上下文不同,功能相同的情况

在我们写代码中经常碰到这样一种情况,那就是 在不同的上下文中,去处理同一个功能。比如现在一个项目中, 如果要去解决这样两个 path。

2024-01-04 13:08:57 753 1

原创 Java框架中循环依赖的解决方案

微信公众号: 线程在一些Java容器技术中,比如IOC容器和DI容器,通常需要处理一种叫作循环依赖的情况。

2024-01-03 14:18:24 801 1

原创 Java重构方式之提炼方法

这个时候就会发现getConext和get方法是完全一致的, 然后在get中调用getConext().get()。当面临一个类中包含许多方法的情况时,我们希望将其中一个方法提取出来,形成一个独立的类或接口。首先定义一个新的接口Context,其中包含与 ContextConfig 类中的 get 方法一致的签名。跑一下测试, 然后将接口上拿掉, 然后将get给inline, 于是get就被从当前类中给提取出去了。第二步,创建一个新的方法,叫做getConext, 返回一个Conext接口的实例。

2024-01-02 23:00:34 543

空空如也

空空如也

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

TA关注的人

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