笔记杂项(note 目录图文存档)

一月 05, 2024 [C/C++] #obsidian #笔记 #编译链接 #并发 #网络 #杂项

笔记杂项(note 目录图文存档)

obsidian 笔记库 note/ 目录遗留的 6 张截图,统一收录在本页并附文字转录。各图在专题文章中另有归属(处理决策见迁移说明),本页保证内容自洽、可独立检索。

gem5 场景下各链接器链接耗时对比

原文结论:在 gem5 场景下推荐使用 mold 链接器;链接器的选择对构建耗时的影响比存储位置(NFS vs 本地 SSD)更显著。

gem5 场景下 ld/bfd/lld/gold/mold 链接耗时对比(NFS 与本地 SSD)

文字转录(时间为 mm:ss 格式):

链接器NFS + all m5NFS + last fewLocal SSD + all m5Local SSD + last fewLocal SSD + -j48 + last few
ld—3:29.19—3:08.313:00.15
bfd4:15.823:32.133:39.703:02.153:02.35
lld2:16.221:54.251:52.941:13.121:13.16
gold2:30.981:43.591:59.411:19.861:19.48
mold1:48.621:07.081:08.180:28.230:27.89

要点:mold 比 ld 快约 6 倍(Local SSD + -j48 场景 3:00 → 0:28);本地 SSD 相比 NFS 带来约 2 倍提升;并行(-j48)对 mold 收益明显。

gcc -Wl,-Bstatic / -Bdynamic 混合链接

gcc 通过 -Wl 向链接器 ld 传参:-Bstatic 强制其后的库按静态链接,-Bdynamic 强制按动态链接。部分静态、部分动态链接的写法:

# 静态链接 libA.a,同时动态链接 libB.so
gcc ... -Wl,-Bstatic -lA -Wl,-Bdynamic -lB ...

规则要点:

截图与英文原文讨论见 Telling gcc directly to link a library statically。

C++ 六种 memory_order 内存序

C++11 <atomic> 中 memory_order 枚举的六个值及定义规则:

枚举值定义规则
memory_order_relaxed不对执行顺序做任何保证
memory_order_consume本线程中,所有后续的有关本原子类型的操作,必须在本条原子操作完成之后执行
memory_order_acquire本线程中,所有后续的读操作必须在本条原子操作完成后执行
memory_order_release本线程中,所有之前的写操作完成后才能执行本条原子操作
memory_order_acq_rel同时包含 memory_order_acquire 和 memory_order_release 标记
memory_order_seq_cst全部存取都按顺序执行

要点:acquire/release 是最常用、最重要的组合,理解它们后其余内存序才好理解;consume 在实践中普遍被实现为 acquire(C++17 起建议暂时弃用);需要全局顺序一致时用 seq_cst。

延伸阅读:线程安全、原子变量、内存顺序、内存顺序 Memory Order。

x86-64 通用寄存器与 Caller/Callee Save

x86-64 共 16 个 64 位通用寄存器,用途与保存责任(System V AMD64 ABI):

寄存器Callee Save用途
%rax返回值寄存器;idiv/imul 也使用
%rbxyes通用寄存器
%rcx第 4 参数寄存器
%rdx第 3 参数寄存器;idiv/imul 也使用
%rspyes栈指针
%rbpyes帧指针
%rsi第 2 参数寄存器
%rdi第 1 参数寄存器
%r8第 5 参数寄存器
%r9第 6 参数寄存器
%r10通用寄存器
%r11通用寄存器
%r12~%r15yes通用寄存器

要点:

截图出处与上下文:实现一个简单的 CRT(issue24 系列合集)。

三种多态与 Ad-hoc 多态

《Rust 编程之道》提到三种多态形式:

"Ad hoc" 是拉丁语常用短语,意为"特设的、特定目的的、即席的、临时的、将就的、专案的",形容为某个特定问题、任务而专门设定的东西。中文直译"特设多态"很少见,书籍多保留原文,因此这个概念初见时容易困惑。

相关讨论见泛型特化 Specialization(特化即 Ad-hoc 多态范畴内的按类型定制)。

Linux 网络监控命令速查(按 OSI 分层)

Linux 网络监控命令速查表(按 OSI 二/三/四层分类)

文字转录:

层命令用途
L4 传输层ss / netstattcp/udp 连接统计
iperf测量瓶颈带宽
netperf测量带宽/延迟
nc读写网络连接
tcptrack排查 TCP 专项问题
lsof查看 tcp/udp 的进程占用
ngrep按四层过滤分析载荷
L3 网络层traceroute发现到目标主机的路由路径
ping测试 IP 层连通性
mtrtraceroute 与 ping 的结合
iftop测量 IP 层吞吐
ip addr查看三层配置
ip -s route查看路由规则与统计
nethogs按进程监控带宽占用
L2 数据链路层ip -s link链路状态与 rx/tx/err 统计
arp查看 arp 表与邻居信息
ethtool链路状态、速率与网卡设置
brctl查看 linux 网桥 fdb/stp 状态
iwconfig / iwlist无线链路状态 / 扫描可用无线网络
抓包与分析tcpdump / tshark抓包并分析二/三/四层头部
Wiresharktcpdump/tshark 的图形界面版
nmap远程主机扫描,发现二/三/四层信息与服务
OpenVAS具备扫描发现能力的漏洞扫描器
EtherApe图形化网络监控(link/IP/TCP 模式)

出处与使用场景见笔记:Linux 性能监视与跑分测试。