20240814阅读代码

1. 绑核操作

链接: link

什么是绑核

所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity)。设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行。但并不是说该进程/线程就独占这个CPU的核,其他的进程/线程还是可以在这个核上面运行的。如果想要实现某个进程/线程独占某个核,就要使用cpuset命令去实现。

其实,很多情况下,为了提高性能,Linux调度器会自动实现尽量让某个进程/线程在同样的CPU上去运行。所以,除非必须,我们没有必要显式的去进行进程绑核操作。

dpdk 程序绑不同的核性能有明显差异问题分析

link
dpdk 程序会将收发包线程绑定到指定的 cpu 核上,在多核环境中执行就要配置需要使用的核。在性能测试的时候,发现当收发包线程绑定到 0 核、1 核对应的 cpu 上后,性能会有明显的下降,而绑定到 0 核、1 核之后的核上却没有这个问题。

在排查这个问题的时候发现,系统中的一些中断只在 0 核上有统计计数,表明其中断处理程序只在 0 核上执行,当 dpdk 程序也使用 0 核进行收发包的时候,这些中断处理程序就会与 dpdk 程序共享 cpu 核,从而导致 dpdk 程序性能下降。

2. ifndef用法

找遍各大平台都找不到我想要的答案,关键时刻还是得靠gpt

#ifndef 是 C 和 C++ 编程语言中用于条件编译的预处理指令之一。它的全称是 “if not defined”。#ifndef 指令通常与 #define 指令一起使用,主要用于防止多次包含同一头文件(也称为“include guard”)。以下是 #ifndef 的一些常见用途及其好处:

1. 防止重复包含头文件(Include Guard):

在大型项目中,头文件可能会被多个源文件包含,如果没有适当的防护措施,可能会导致重复定义错误。使用 #ifndef 可以有效防止这种情况。

// example.h
#ifndef EXAMPLE_H  // 如果未定义 EXAMPLE_H
#define EXAMPLE_H  // 定义 EXAMPLE_H

// 头文件内容
int someFunction();

#endif  // EXAMPLE_H

这样,EXAMPLE_H 这个宏在第一次包含 example.h 时会被定义。如果后续再尝试包含 example.h,由于 EXAMPLE_H 已经定义,整个头文件内容将被跳过,防止重复包含。

2. 控制代码的编译:

可以根据宏是否已定义来有选择地编译代码。这对于构建不同配置(例如调试版和发布版)或平台(例如 Windows 和 Linux)非常有用。

#ifndef DEBUG_MODE
void runInProduction() {
    // 生产环境的代码
}
#else
void runInDebug() {
    // 调试环境的代码
}
#endif

通过 #ifndef DEBUG_MODE,可以确保只有在未定义 DEBUG_MODE 宏时才编译 runInProduction,而在定义了 DEBUG_MODE 时编译 runInDebug

3. 处理跨平台兼容性:

对于跨平台代码,可能需要根据目标平台选择性地编译某些代码片段。例如:

#ifndef _WIN32
void unixSpecificFunction() {
    // 针对Unix系统的代码
}
#endif

这段代码仅在非 Windows 系统(_WIN32 未定义)上编译,避免了与平台相关的不兼容性。

4. 模块化和条件编译:

当模块化地开发软件时,可以使用 #ifndef 控制某些模块的编译。例如,你可以在编译过程中选择性地包含或排除某些功能模块。

#ifndef MODULE_X_DISABLED
void moduleXFunction() {
    // Module X's functionality
}
#endif

如果 MODULE_X_DISABLED 宏被定义,moduleXFunction 将不会被编译。

总结:

#ifndef 是 C 和 C++ 语言中非常有用的预处理指令,通过它可以有效地管理头文件的重复包含、实现条件编译和控制代码模块的可选性。这样可以提高代码的可维护性和跨平台兼容性。后面的两个功能就是我在这一part需要学习的点。

3. Cygwin是什么有什么用

Cygwin 是一个可原生运行于 Windows 系统上的 POSXI 兼容环境。

Cygwin 是一个开源软件包,它在 Microsoft Windows 上提供了一个类 Unix 的环境。通过使用 Cygwin,用户可以在 Windows 上运行和使用许多类似于 Linux 的工具和程序,而不必实际安装 Linux 操作系统。

1. 核心功能 :

  • POSIX 兼容性 :Cygwin 提供了一个兼容 POSIX(Portable Operating System Interface,便携式操作系统接口)的库(cygwin1.dll),使得许多 Unix/Linux 应用程序可以在 Windows 上编译和运行,而无需对其进行大量修改。
  • Bash Shell :Cygwin 包括了一个 Bash Shell,用户可以在 Windows 环境中使用熟悉的 Unix 命令行工具,如 lsgrepawk 等。
  • Linux 工具和软件包 :Cygwin 提供了一个软件包管理系统,用户可以安装和使用许多在 Linux 上常见的软件包,如 gcc(GNU 编译器),makevim 等。

2. 使用场景 :

  • 跨平台开发 :对于需要在 Windows 上开发跨平台应用程序的开发者,Cygwin 是一个非常有用的工具,因为它提供了类似于 Unix/Linux 环境的开发工具链。
  • Windows 和 Linux 的桥梁 :如果用户主要在 Windows 上工作,但需要经常使用 Linux 工具,Cygwin 提供了一个无需安装虚拟机或双系统的便捷方式。
  • 脚本编写和自动化 :用户可以在 Windows 环境中编写和执行 Bash 脚本,这对于那些熟悉 Unix Shell 编程的人非常方便。

3. 局限性 :

  • 性能 :由于 Cygwin 并不是原生的 Unix/Linux 内核,某些性能密集型应用在 Cygwin 上运行时可能会比在原生 Linux 环境下表现较差。
  • 不完全兼容 :尽管 Cygwin 提供了广泛的兼容性,但并非所有的 Unix/Linux 应用都能在 Cygwin 上无缝运行。
  • Windows 依赖性 :Cygwin 仍然运行在 Windows 操作系统之上,因此受限于 Windows 的文件系统、权限管理等特性。

4. 安装和使用 :

  • 安装 :Cygwin 可以从其官方网站下载,安装过程中用户可以选择需要的工具和库。
  • 使用 :安装完成后,用户可以启动 Cygwin 提供的 Bash Shell,并像在 Linux 终端中一样输入命令、编写脚本或执行程序。

总结:

Cygwin 是一个非常有用的工具,特别是对于那些希望在 Windows 上使用 Unix/Linux 工具的开发者和用户。它为 Windows 环境带来了广泛的 Unix/Linux 兼容性和工具支持,但也存在一定的性能和兼容性限制。简言之,cygwin就是api,把windows系统当linux/unix系统来用,但因为封装太多层了导致在性能密集型应用中表现较差。

4. 唤醒Cu、Du、NGU

在5G网络的架构中,CU(中央单元,Central Unit)、DU(分布单元,Distributed Unit)和NGU(下一代基站单元,Next Generation gNB Unit)是一些关键的网络组件。为了确保这些网络组件之间的连接稳定且正常工作,通常会使用“心跳”机制。

1. CU、DU 和 NGU 的角色 :

  • CU(Central Unit) :负责较高级别的控制功能,如RRC(无线资源控制)信令的处理、PDCP(分组数据汇聚协议)的管理等。通常它位于网络的核心部分。
  • DU(Distributed Unit) :处理较低层的功能,如RLC(无线链路控制)、MAC(介质访问控制)层以及部分物理层功能。DU一般部署在靠近基站的位置,以减少延迟。
  • NGU(Next Generation gNB Unit) :可以理解为新一代基站单元,实际上是一个泛指,通常包含CU和DU组合在一起的功能,负责处理终端(UE)与核心网之间的数据和信令交换。

2. 心跳机制的作用 :

“心跳”是指定期发送的信号,用于确认两个或多个网络设备之间的连接是否正常。例如,在CU与DU之间、CU与NGU之间,心跳信号可以帮助监测连接的健康状态。如果设备在一定时间内未收到心跳信号,可以认为连接存在问题,从而触发相应的故障恢复机制。

  • 恢复通信 :当CU、DU或NGU因为某种原因进入休眠或低功耗模式,或者因为网络管理策略暂时停止了心跳信号,此时可能需要通过某种机制或事件来“唤醒”这些设备,使它们重新开始发送心跳信号。
  • 启动心跳检测 :在某些情况下,心跳信号并非一直都在发送,而是需要在某种情况下(如系统启动、恢复连接等)启动心跳检测机制。因此,唤醒可能指的是触发这些设备开始定期发送心跳信号。

5. 看代码之折叠函数/折叠注释

折叠所有函数

ctrl+k + ctrl+0 或者 ctrl+k + ctrl+1

折叠所有函数至第n层级

ctrl+k + ctrl+n

eg:如果要折叠至第二层级,n就换成2

展开所有函数以及注释

ctrl+k + ctrl+j

折叠展开选中函数或注释

手动选择注释的块然后按下 Ctrl + Shift + [ (Windows/Linux) 或 Cmd + Option + [ (macOS) 来折叠选中的注释块。

Ctrl + Shift + ] (Windows/Linux)用来展开。

更新:浅浅用了一下,感觉这个功能有点鸡肋,还不如直接鼠标一个一个点击。

6. 将**统一替换成space

chatgpt生成的内容复制到markdown的平台下自带**加粗,并且这段文字还自带层级,csdn自动目录显示的时候就会将星号给暴露出来,显得很丑,所以需要将它删除掉。

如果复制的chatgpt的内容多了,那自然就需要自动化操作了。

F12开启开发者工具台,然后进入console,输入如下指令,就会将两个星号替换成空格。

document.body.innerHTML = document.body.innerHTML.replace(/\*\*/g, ' ');

然后复制你的编辑内容,刷新,粘贴,完成!

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值