在本篇中比较了各种并发、并行技术。
并发(concurrency) 强调的是逻辑上的同时发生,是语义上的模型(semantic model)。如果只有一个处理器,那么并发程序是 interleave 执行的。并发通常可划分为多个级别:Blocking、Obstruction-Free、Lock-Free、Wait-Free,其中后三种统称为 Non-blocking 的。
并行(parallelism) 属于并发,是运行期的行为(runtime behavior),并行强调这两个并发事件实际上也是同时发生的,例如在多个处理器上运行的多个任务。但我们不能讲这两个概念绝对化,例如在处理器层面,流水线绝对是并发的,但在操作系统之上提供的机制来说,却体现出顺序的特性。
libutp源码简析
libutp是uTorrent使用的类似TCP的传输层实现。它基于UDP提供可信的、有序的点对点的传输,并具有最少的时延。需要注意的是utp和另一个基于UDP的传输协议QUIC的实现思路和优势并不一样,例如QUIC更强调连接建立的快速性,建立连接时只需要1至2次握手,又如QUIC将TLS整合到协议中,实现了0RTT,而基于HTTP2的协议需要2/3RTT。QUIC还允许在用户层面配置各种拥塞控制算法。
网上有关libutp实现的介绍几乎没有,因此我打算就其源码做一个简单的分析。这里要注意UTP是基于包的而不像TCP是基于流的,虽然它提供的API还是基于流的。这样有一些影响,例如黏包问题的处理、缓冲区的管理(例如可以去掉PUSH标记)、窗口管理、重新分组等方面。
uTP源码简介
utp.h以 C89 的形式提供接口。例如 utp_write 是以 proactive 的方式实现的。
utp 相关的实现大多在 utp_internal.cpp 文件中。
utp_packedsockaddr.cpp 中封装了 sockaddr_in 结构。
ucat.c 基于 uTP 框架构建了一个基础的应用。
uTP 的设计主要是异步的,应用代码不会阻塞在异步 IO 操作上,而是指定回调函数并立即返回。utp_callbacks.cpp中注册了各种回调函数,utp 向外界传输消息都是以这里回调的形式开展的。例如当收到数据包时,ctx->callbacks[UTP_ON_READ] 这个回调函数就会被调用。
TCP的可靠传输
本文作为一个专题来讨论TCP可靠传输的实现,其中部分论述迁移自TCP的流量控制和拥塞控制。
TCP的流量控制和拥塞控制
本文作为一个专题来讨论TCP的流量控制和拥塞控制,其中部分论述迁移自libutp源码简析。有关可靠传输的实现,详见TCP的可靠传输。
流量控制着眼于接收端,保证发送端的发送速率能够匹配接收端的接受速率和缓存大小。流量控制包含滑动窗口 rwnd 、Nagle算法等。拥塞控制着眼于整个网络的性能,是当前发送端的速率匹配当前链路能承载的的限额。拥塞控制包含拥塞窗口 rwnd 、慢启动、拥塞避免、Fast retransmit 和 Fast recovery 等。
TCP套接字编程
介绍 TCP 套接口编程。
UDP套接字编程
UDP协议是相对于TCP协议不是面向连接的,也是不可靠的,因此UDP套接字编程在思路上和TCP套接字编程很不一样。
数据挖掘简易复习
《数据挖掘》课程简易复习提纲,主要根据 PPT 整理。时间仓促,不排除存在部分内容爆炸。
C++ functor 和 lambda
介绍 C++ lambda、仿函数、std::function 等。
Google Kickstart 2017 Round C题解
C轮感觉比校招笔试轮次的DE要简单点了,这次有四道题都很有意思。
C++内存对齐与多态
最近在看Inside the C++ Object Model,一种日经面试题,求sizeof(A)
1 | struct A{ |
这种题目其实考的知识点很多,包含了虚函数虚继承、内存对齐等一系列C++的语言特性。