Linux的层级架构
每个操作系统都有一个内核,内核封装了底层硬件设备管理、内存管理、网络数据协议转化和收发传输、文件系统读写等。从这个图可以看到,内核将系统硬件与应用程序进程连接起来,隐藏了上层下层交互的一些细节,各司其职。
这些分层包括:
- 用户空间程序
- 编译器
- 终端
- 防火墙
- 系统调用的跨平台API(特定于平台的系统调用包装API)
- Rust标准库
- libc(或等效的API)
- kernel,操作系统的核心模块
- 系统资源
- 内存
- 文件系统
- 网络
- 硬件和其他设备(包括键盘、鼠标、监视器、磁盘驱动器)
Rust的标准库的功能划分
而Rust标准库,很好的利用了操作系统内核提供的API。
Rust标准库是Rust程序进入Linux操作系统内核函数的主要接口,它在内部使用libc(在Windows系统使用其他等效的库)来调用内核提供的系统调用。
从Rust程序中发起系统调用,以实现管理和操作各种系统资源(如图)。
libc(或其变体)为类UNIX操作系统上的系统调用提供了一个包装器,如Linux内核实现了POSIX标准指定的数百个POSIX API(对于Windows,系统调用有等效的API,也实现了POSIX标准[1])。
作为标准库,Rust标准库是跨平台的,Rust标准库的系统调用的细节是从Rust开发人员那里抽象出来的。Rust也支持不依赖于标准库的运行方式(no_std 方式),Rust直接操控底层硬件(如应用在嵌入式系统开发场景),此时Rust就做了操作系统本身的工作。
对于大部分软件开发工程师而言,他们用Rust主要开发应用层软件,也就是运行在用户空间的程序。它们基于标准库编写,实现各种业务功能。应用层的软件并非所有模块和函数都涉及到系统调用(例如一些用于操作字符串和处理错误的函数,就无需调用系统调用)。
Rust标准库包括几大领域的模块,包括四大类:
第一类,Rust语言原语
即Rust Language Primitives:Rust 语言的基本元素或基本类型(如下图)。
如有符号整数、布尔值、浮点数、字符、字符串、数组、元组、切片。这些由Rust编译器负责实现。
Rust标准包括原语,并在它们之上构建。
第二类,alloc crate
与堆分配值的内存分配相关的类型、函数和特征。
包括集合(Vec、String等集合)、智能指针类型(Box)、引用计数指针(Rc)和原子引用计数指针(Arc))。
第三类,core crate
作为Rust标准库的基础。充当Rust语言与标准库之间的链接,提供在Rust原语之上实现的类型、特征、常量和函数,并为所有Rust代码提供基础构建块,它是跨平台的,没有任何指向操作系统或其他外部依赖的链接。由于较少直接用到core crate,所以本文不做过多介绍。
第四类,模块(标准库的其他crate)
是标准库的一部分,模块crate包括针对并发、I/O,文件系统、网络、异步I/O、错误处理等功能,以及与特定操作系统相关的函数,Rust的官网对std有专门的文档[2]。例如
- 为用户程序在多个线程上并发运行的功能在std::thread模块中;
- 用于处理同步I/O的功能在std::io模块中提供;
- 针对特定os的模块,主要在std::os模块中实现。
下图展示了Rust标准库各个领域功能涉及到的具体std模块(如std::io、std::os等)
以下着重对第四类的主要 crate 做一介绍,并附上文档地址。
Rust的并发控制相关模块 conurrency:
模块名 |
说明 |
std::env 模块[3] |
包含与环境变量交互的功能,包括读取、设置和删除环境变量。 |
std::sync 模块[4] |
提供了用于实现线程安全共享状态的同步原语,如互斥锁(Mutex)、原子操作(Atomic)和条件变量(Condvar)。 |
std::thread 模块[5] |
提供了创建和管理线程的功能,包括线程的创建、 join、spawn 和同步。 |
std::process 模块[6] |
提供了与操作系统进程交互的功能,包括运行外部命令、启动新进程以及与进程进行通信。 |
Rust的内存管理相关模块 memory management:
模块名 |
说明 |
std::alloc 模块[7] |
提供了内存分配器的功能,包括分配和释放动态内存。 |
std::convert 模块[8] |
提供了用于不同类型之间转换的工具函数。 |
std::ptr 模块[9] |
提供了对指针的操作和转换功能,包括对裸指针的操作。 |
std::borrow 模块[10] |
提供了用于管理借用的功能,包括 |
std::default 模块[11] |
提供了默认 trait 实现的功能,用于为不提供具体实现的类型提供默认行为。 |
std::rc 模块[12] |
提供了引用计数(Reference Counting)的功能,用于实现线程安全的共享内存。 |
std::cell 模块[13] |
提供了可变性的 Cell 和 RefCell 类型,用于在多线程环境下安全地共享可变状态。 |
std::mem 模块[14] |
提供了与内存相关的功能,包括内存布局、内存对齐和内存操作。 |
std::clone 模块[15] |
提供了用于实现克隆(Clone) trait 的功能,用于复制和克隆复杂的数据结构。 |
std::pin 模块[16] |
提供了 Pin 类型,用于固定借用的生命周期,以避免悬垂指针和数据竞争问题。 |
Rust的文件系统操作相关模块 File system:
模块名 |
说明 |
std::fs 模块[17] |
提供了与文件系统操作相关的功能,包括文件和目录的创建、读取、写入和删除等操作。 |
std::path 模块[18] |
提供了与文件路径相关的功能,包括路径的解析、构造和操作。 |
Rust的数据处理相关模块 data processing:
模块名 |
说明 |
std::ascii 模块[19] |
提供了与 ASCII 码相关的功能,包括对 ASCII 字符的操作和转换。 |
std::fmt 模块[20] |
提供了格式化输出的功能,包括对各种数据类型的格式化和打印。 |
std::num 模块[21] |
提供了对数字类型的抽象和操作,包括整数、浮点数和复数等。 |
std::cmp 模块[22] |
提供了用于比较和排序值的工具,包括比较运算符的实现和排序函数。 |
std::hash 模块[23] |
提供了用于计算哈希值的功能,包括对各种数据类型的哈希函数实现。 |
std::ops 模块[24] |
提供了一些基本的运算符和操作符的实现,包括数学运算符、比较运算符和逻辑运算符等。 |
std::iter 模块[25] |
提供了迭代器(Iterator)的功能,包括创建和操作迭代器的方法,以及一些常见的迭代器类型。 |
Rust的错误处理相关模块 Error handling:
模块名 |
说明 |
std::error 模块[26] |
提供了错误处理的功能,包括定义错误类型和处理错误的方法。 |
std::panic 模块[27] |
提供了恐慌(Panic)机制,用于处理不可恢复的错误情况。 |
std::option 模块[28] |
提供了 Option 类型,用于表示可能存在或不存在的值,用于处理可能出现空值的情况。 |
std::result 模块[29] |
提供了 Result 类型,用于表示成功或失败的情况,通常用于处理可能出现错误的函数返回值。 |
Rust的编译处理相关模块 compiler:
模块名 |
说明 |
std::hint 模块[30] |
提供了一些用于编译器提示的宏,用于影响编译器的优化行为。 |
std::primitive 模块[31] |
提供了一些基本的类型和函数,用于处理数字、字符和布尔值等基本数据类型。 |
std::prelude 模块[32] |
包含了一些基本的函数和宏,这些函数和宏在 Rust 标准库中被广泛使用,并且在每个 Rust 程序中自动导入。 |
Rust的跨语言调用相关模块:FFI
模块名 |
说明 |
std::ffi 模块[33] |
提供了与外部函数接口(Foreign Function Interface,FFI)相关的功能,用于与其他语言或库进行交互。 |
Rust的网络处理功能模块 Networking:
模块名 |
说明 |
std::net 模块[34] |
提供了与网络编程相关的功能,包括网络协议、套接字(Socket)和网络地址等。 |
Rust的IO处理模块:
模块名 |
说明 |
std::io 模块[35] |
提供了与输入输出相关的功能,包括文件操作、缓冲、读写数据等。 |
Rust的OS特定的功能模块:
模块名 |
说明 |
std::os 模块[36] |
提供了与操作系统相关的功能,包括文件系统操作、进程管理和系统信息等。 |
Rust的时间处理模块:
模块名 |
说明 |
std::time 模块[37] |
提供了与时间和日期相关的功能,包括时间的表示、解析、转换和计算等。 |
参考资料:
- [1]POSIX标准: https://www.baike.com/wiki/%E5%8F%AF%E7%A7%BB%E6%A4%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%8E%A5%E5%8F%A3/1647475
- [2]std有专门的文档: https://doc.rust-lang.org/std/index.html
- [3]std::env 模块: https://doc.rust-lang.org/std/env/index.html
- [4]std::sync 模块: https://doc.rust-lang.org/std/sync/index.html
- [5]std::thread 模块: https://doc.rust-lang.org/std/thread/index.html
- [6]std::process 模块: https://doc.rust-lang.org/std/process/index.html
- [7]std::alloc 模块: https://doc.rust-lang.org/std/alloc/index.html
- [8]std::convert 模块: https://doc.rust-lang.org/std/convert/index.html
- [9]std::ptr 模块: https://doc.rust-lang.org/std/ptr/index.html
- [10]std::borrow 模块: https://doc.rust-lang.org/std/borrow/index.html
- [11]std::default 模块: https://doc.rust-lang.org/std/default/index.html
- [12]std::rc 模块: https://doc.rust-lang.org/std/rc/index.html
- [13]std::cell 模块: https://doc.rust-lang.org/std/cell/index.html
- [14]std::mem 模块: https://doc.rust-lang.org/std/mem/index.html
- [15]std::clone 模块: https://doc.rust-lang.org/std/clone/index.html
- [16]std::pin 模块: https://doc.rust-lang.org/std/pin/index.html
- [17]std::fs 模块: https://doc.rust-lang.org/std/fs/index.html
- [18]std::path 模块: https://doc.rust-lang.org/std/path/index.html
- [19]std::ascii 模块: https://doc.rust-lang.org/std/ascii/index.html
- [20]std::fmt 模块: https://doc.rust-lang.org/std/fmt/index.html
- [21]std::num 模块: https://doc.rust-lang.org/std/num/index.html
- [22]std::cmp 模块: https://doc.rust-lang.org/std/cmp/index.html
- [23]std::hash 模块: https://doc.rust-lang.org/std/hash/index.html
- [24]std::ops 模块: https://doc.rust-lang.org/std/ops/index.html
- [25]std::iter 模块: https://doc.rust-lang.org/std/iter/index.html
- [26]std::error 模块: https://doc.rust-lang.org/std/error/index.html
- [27]std::panic 模块: https://doc.rust-lang.org/std/panic/index.html
- [28]std::option 模块: https://doc.rust-lang.org/std/option/index.html
- [29]std::result 模块: https://doc.rust-lang.org/std/result/index.html
- [30]std::hint 模块: https://doc.rust-lang.org/std/hint/index.html
- [31]std::primitive 模块: https://doc.rust-lang.org/std/primitive/index.html
- [32]std::prelude 模块: https://doc.rust-lang.org/std/prelude/index.html
- [33]std::ffi 模块: https://doc.rust-lang.org/std/ffi/index.html
- [34]std::net 模块: https://doc.rust-lang.org/std/net/index.html
- [35]std::io 模块: https://doc.rust-lang.org/std/io/index.html
- [36]std::os 模块: https://doc.rust-lang.org/std/os/index.html
- [37]std::time 模块: https://doc.rust-lang.org/std/time/index.html