CPU 架构详解:从指令集到芯片制造的完整解析
芯片是物理形态,指那块带引脚的黑色半导体封装体。CPU(Central Processing Unit)是功能定义,指计算机中负责解释指令和处理数据的核心逻辑单元。
二者的关系:芯片是 CPU 的物理载体,但芯片不等于 CPU。
- 早期:CPU 就是一块独立的芯片,芯片内只包含 CPU 本身。那时称芯片为 CPU 是准确的。
- 现代:为追求便携和高性能,工程师将 CPU、GPU、NPU、内存控制器等全部集成到同一块芯片。
- 当前的芯片(SoC)= CPU + GPU + 内存控制器 + 其他功能单元。
transmission编译安装和golang_rpc的调用
golang_runtime函数调用信息
函数的调用信息是程序中比较重要运行期信息, 在很多场合都会用到(比如调试或日志)。
Go 语言 runtime 包的 runtime.Caller / runtime.Callers / runtime.FuncForPC 等几个函数提供了获取函数调用者信息的方法.
这几个函数的文档链接:
runtime.Caller的用法(常用)
函数的签名如下:
1 | func runtime.Caller(skip int) (pc uintptr, file string, line int, ok bool) |
runtime.Caller 返回当前 goroutine 的栈上的函数调用信息. 主要有当前的pc 值和调用的文件和行号等信息. 若无法获得信息, 返回的 ok 值为 false.
golang闭包的坑
1. 循环内goroutine使用闭包
1 | func main() { |
改进:
1 | func main() { |
使用esayrsa生成ssl证书
下载release版本
https://github.com/OpenVPN/easy-rsa/releases
配置公钥基础设施变量
1 | cp vars.example vars |
修改内容示例
1 | set_var EASYRSA_REQ_COUNTRY "CN" |
不会rebase就等于没学过Git
linux开启ftp服务和golang实现ftp_server_client
linux 安装 ftp 服务
1 . 安装ftp
1 | sudo apt-get install vsftpd |
- 修改配置 sudo vi /etc/vsftpd.con
1 | local_root=/home/ftpuser |
- 添加ftp用户
1 | mkdir /home/ftpuser |
- 调整文件夹权限
1 | chown ftpuser:ftpuser /home/ftpuser/ |
- 修改pam.d/vsftpd
1 | sudo vi /etc/pam.d/vsftpd |
- 连接
1 | ftp://207.246.80.69 //通过浏览器访问 |
golang优雅的关闭channel
- golang 没有简单普遍的方式来检查channel是否已经关闭了
- 关闭已经关闭的channel会导致panic
- 发送值到已经关闭的channel会导致panic
一个channel 关闭的原则是不要从接收端关闭channel,也不要关闭有多个并发发送者的channel。【别人可能还写呢】
换句话说,如果sender(发送者)只是唯一的sender或者是channel最后一个活跃的sender,那么你应该在sender的goroutine关闭channel,从而通知receivers(接收者们)已经没有值可以读了。
happens_before以及golang的运用
Happens-before 是一个内存模型中的核心概念,它定义了在并发程序中,一个操作(如写入变量)的结果保证对另一个操作(如读取该变量)可见的规则。
它不是关于“真实物理时间”的先后,而是一种关于内存操作顺序和可见性的逻辑承诺。如果事件 A happens-before 事件 B,那么 A 操作对内存产生的所有影响,都必须在 B 操作开始之前,对 B 完全可见。
它解决了并发编程中最棘手的两个问题:指令重排和内存可见性。
- 对抗混乱的“幕后优化”:为了追求极致性能,编译器和 CPU 会对你的代码进行“优化”,比如打乱指令的执行顺序 (Instruction Reordering)。在单线程中这通常没问题,但在并发环境下,这种重排可能导致灾难性的后果。
- 确保数据同步:在现代多核 CPU 架构中,每个核心都有自己的高速缓存 (Cache)。一个核心对数据的修改不会立即同步到主内存或其他核心的缓存中。这就导致一个 goroutine 修改了数据,另一个 goroutine 可能根本“看不见”这个修改。
