目录
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 命令行工具,如
ls
、grep
、awk
等。 - Linux 工具和软件包 :Cygwin 提供了一个软件包管理系统,用户可以安装和使用许多在 Linux 上常见的软件包,如
gcc
(GNU 编译器),make
,vim
等。
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, ' ');
然后复制你的编辑内容,刷新,粘贴,完成!