Go Goroutine 与 GMP 调度器 Goroutine 是由 Go runtime 管理的轻量级并发执行单元。它和操作系统线程不是一一对应关系:runtime 会把大量 goroutine 复用到少量线程上执行。goroutine 初始栈很小且可按需增长,因此单进程可以承载大量并发任务。 我在前面的文章MIT 6.S081: xv6 实验参考书解析中讲过进程/线程的切换方式,当切换的时候要从用户态->内核态->另一个进程 2021-12-17 Go语言 #Go runtime #Goroutine
Go 内存管理与 GC:从逃逸分析到三色标记 Go 的自动内存管理并不是“程序员完全不用关心内存”。更准确地说,Go runtime 接管了对象生命周期判断和堆内存回收,程序员仍然需要理解对象何时逃逸、哪些分配会给 GC 制造压力,以及写屏障为什么会影响吞吐。 手动内存管理的问题C/C++ 这类语言把内存释放责任交给程序员,灵活性很高,但错误也很隐蔽。最典型的问题有两个: 悬空指针:内存已经释放,但还有指针指向原来的地址。 内存泄漏:对象已 2021-12-16 Go语言 #内存管理 #Go runtime
浮点数精度丢失:IEEE 754、舍入误差与工程实践 问题现象先看一个很常见的例子: float f = 0; for(int i=0;i<100;i++){ f+=0.1f; } printf("%f\n",f); 数学上 $0.1 \times 100 = 10$,但这段代码可能输出 10.000002。这不是 C 语言算错了,而是 0.1f 本身无法被二进制浮点数精确表示,循环累加又把每一步 2021-12-13 杂文 #浮点数
Stanford CS144 Lab 1: Stream reassembler 该lab要求我们实现一个流重组类,可以将Sender发来的带索引号的字节碎片重组成有序的字节写入到byte_stream。接收端从发送端读取数据,调用流重组器,流重组器对数据进行排序,排序好后写入byte_stream。 值得注意的是,无论是 lab0 中的 byte_stream,还是 lab1 中的重组器,都有 capacity 的概念。capacity 对应可用缓冲上限,它由“重组器中尚未拼 2021-11-27 计算机网络 #Stanford CS144 Lab
Stanford CS144 Lab 3: TCP sender 在这个实验中我们要完成tcp_sender的部分。由于我们实现的是简易的TCP,因此在测试集对于拥塞控制并没有太多要求,且计时器我们也只用实现重传计时器。 我们先来理解bytes_in_flight,bytes_in_flight是发送但还未确认的数据长度。根据概念,这段长度等于_next_seqno减去base。因此我们定义一个base用来维护基序号,同时也可以完成bytes_in_flight 2021-11-23 计算机网络 #Stanford CS144 Lab
Stanford CS144 Lab 2: TCP receiver CS144 这个实验并不是“在 UDP 之上封装 TCP”,而是让我们在用户态按 TCP 语义实现发送端与接收端组件(例如 sequence number、ACK、reassembly、window 等),以理解 TCP 协议机制本身。 Translating between 64-bit indexes and 32-bit seqnos《自顶向下》中,在讲到GBN协议时有这样一段话可能大家都忽 2021-11-20 计算机网络 #Stanford CS144 Lab
Stanford CS144 Lab 0: Networking warmup Stanford大学的CS144 lab要求我们实现一个TCP。CS144的课程我觉得可以配合《自顶向下》来学习,它是目前最好的中文的计算机网络书籍了。《自顶向下》中采用的是五层模型,当然在CS144中介绍了四层模型和七层模型。华科的计算机网络课程是根据《自顶向下》来备课的,如果有空的话,还可以听一听华科的计网mooc。既然都写到这里了,我们在前言来聊聊计算机网络模型: 四层网络模型链路层:定义 2021-11-20 计算机网络 #Stanford CS144 Lab