我的学习笔记

土猛的员外

Rust原子性和锁(前言)

本文为《Rust Atomics and Locks》翻译文章,原文为:https://marabos.nl/atomics/preface.html
仅供学习使用

前言

Rust在让系统编程更加可用的方面发挥了重要作用,然而,诸如原子性和内存排序之类的底层并发专题仍然经常被认为是一些神秘的内容,最好留给一小群专家来研究。

在过去几年研究Rust的实时控制系统和Rust标准库的过程中,我发现网上关于原子性(Atomics)和相关主题的可用信息只覆盖了我们真正想了解的内容的很小部分。许多资源完全集中在C和C++上,这使得它很难与Rust的(内存和线程)安全和类型系统的概念形成联系。涵盖了抽象理论细节的资源,如C++的内存模型,通常只是模糊地解释了它与实际硬件的关系。有许多资源涵盖了实际硬件的每个细节,例如处理器指令和缓存一致性,但是形成一个整体的理解通常需要从许多不同的地方收集零碎的信息来了解。

本书试图将相关信息放在一个地方,并将它们串联起来,为您提供构建正确的、安全的且符合我们使用习惯的并发原语所需的一切,同时充分了解底层硬件和操作系统的角色,以便能够做出设计决策和基本的优化权衡。

谁适合这本书

这本书的主要读者是Rust开发人员,他们希望了解更多关于低级并发性的知识。此外,这本书也适合那些还不太熟悉Rust,但想从Rust的角度了解底层并发的人。

假设你了解Rust的基础知识,最近安装了Rust编译器,并且知道如何使用“cargo”编译和运行Rust代码。Rust中对并发性很重要的概念在相关的时候会被简要地解释,所以不需要事先了解Rust并发性。

章节预览

这本书由十章组成。以下是每一章的内容,以及值得期待的内容:

第一章——Rust并发的基础知识

本章介绍了Rust中实现基础并发所需要的所有工具和概念,比如线程、互斥、线程安全、共享和独占引用、内部可变性等等,这些都是本书其余部分的基础。对于熟悉这些概念的有经验的Rust程序员,本章可以作为快速复习。对于那些从其他语言中了解这些概念但对Rust还不是很熟悉的人来说,本章将迅速为您补充书中其他部分可能需要的Rust特定知识。

第二章——原子性(Atomics)

在第二章中,我们将学习Rust的原子类型及其所有操作。我们从简单的加载和存储操作开始,逐步构建到更高级的“比较和交换循环”,通过几个真实的用例作为可用的示例来探索每个新概念。虽然内存排序与每个原子操作相关,但这个主题将留待下一章讨论。本章只介绍了“轻松的”内存排序就足够了的情况,这种情况比人们想象的要多。

第三章——内存排序(Memory Ordering)

在学习了各种原子操作和如何使用它们之后,第三章介绍了本书最复杂的主题:内存排序。我们将探索内存模型是如何工作的,什么是先于发生的关系以及如何创建它们,所有不同的内存顺序意味着什么,以及为什么顺序一致可能不是所有问题的答案。

第四章——创建自旋锁

在学习了理论之后,我们将在接下来的三章中通过构建几个常见并发原语的我们自己的版本将其付诸实践。第一章很短,我们实现了一个自旋锁。我们将从一个非常小的版本开始,将释放和获取内存排序付诸实践,然后我们将探索Rust的安全概念,将其转变为符合人体工程学和难以滥用的Rust数据类型。

第五章——创建线程间的通信渠道

在第5章中,我们将从头开始实现one-shot channel的一些变体,这是一个可用于将数据从一个线程发送到另一个线程的原语。从一个非常简单但完全“不安全”的版本开始,我们将通过几种方法来设计一个安全的界面,同时考虑设计决策及其后果。

第六章——手动创建Arc

在第六章中,我们将进行一个更具挑战性的内存排序难题。我们将从头开始实现我们自己版本的原子引用计数。在添加了对弱指针的支持并对其性能进行优化之后,我们的最终版本将与Rust的标准“std::sync::Arc”类型几乎相同。

第七章——深入处理器

第七章是对所有底层细节的深入探讨。我们将探索处理器层面发生了什么,原子操作背后的“汇编指令”在两种最流行的处理器架构上是什么样子,缓存是什么以及它如何影响代码的性能,我们还将讲解硬件级内存模型的剩余部分。

第八章——操作系统原语

在第8章中,我们承认有些事情没有操作系统内核的帮助是做不到的,并了解Linux、macOS和Windows上都有哪些可用的功能。我们将讨论POSIX系统上通过pthreads可用的并发原语,了解我们可以用Windows API做什么,并了解Linux 的futex syscall做什么。

第九章——手动打造锁

利用我们在前几章学到的知识,在第9章中,我们将从头开始构建互斥锁条件变量读写锁的几个实现。对于这些问题,我们将从一个最小但完整的版本开始,然后我们将尝试以各种方式优化它。使用一些简单的基准测试,我们将发现在讨论各种设计权衡时,我们在优化方面的尝试并不总是能够提高性能。

第十章——创意与灵感

最后一章确保你在读完这本书后不会陷入空虚,而是留下一些想法和灵感,用你的新知识和技能来构建和探索事物,也许会开启一段深入底层并发性的令人兴奋的旅程。

代码示例

本书中的所有代码都是针对Rust 1.66.0编写的,并使用Rust 1.66.0进行测试,Rust 1.66.0于2022年12月15日发布。早期版本不包括本书中使用的所有功能。不过,以后的版本应该可以正常工作。

为简洁起见,代码示例不包括’ use ‘语句,除非第一次引入标准库中的新项。为了方便起见,下面的前奏可以用来导入编译本书中任何代码示例所需的所有内容:

1
2
3
4
5
6
7
8
9
10
11
12
#[allow(unused)]
use std::{
cell::{Cell, RefCell, UnsafeCell},
collections::VecDeque,
marker::PhantomData,
mem::{ManuallyDrop, MaybeUninit},
ops::{Deref, DerefMut},
ptr::NonNull,
rc::Rc,
sync::{*, atomic::{*, Ordering::*}},
thread::{self, Thread},
};

补充材料,包括所有代码示例的完整版本,可在 https://marabos.nl/atomics/ 获得

你可以出于任何目的使用本书提供的所有示例代码。

下一章:Rust并发基础



关注我的微信公众号,可收到实时更新通知

公众号:土猛的员外


我们的创业项目已经上线!!!

TorchV AI,帮助企业快速进入AI时代!

具体详情,请点击官网咨询


最新内容,关注“土猛的员外”公众号