![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
rust语言学习
文章平均质量分 88
总结rus学习的基本重点
explore翔
安徽某985小硕,记录日常学习生活,欢迎大家交流指教。
展开
-
rust异步编程以及kv server的异步处理和重构
最开始,执行器会先 poll 一次 Future ,后面就不会主动去 poll 了,如果 poll 方法返回 Poll::Pending,就挂起 Future,直到收到某个事件后,通过 wake()函数去唤醒被挂起 Future,Future 就可以去主动通知执行器,它才会继续去 poll,执行器就可以执行该 Future。对于我们的网络层来说,可以先不关心背压,依靠操作系统的 TCP 协议栈提供背压处理即可,所以这里直接返回 Poll::Ready(Ok(())),也就是说,上层想写数据,可以随时写。原创 2023-04-18 09:44:15 · 558 阅读 · 0 评论 -
rust的并发以及kv server网络处理和网络安全部分
Atomic 虽然可以处理自由竞争模式下加锁的需求**,但毕竟用起来不那么方便,我们需要更高层的并发原语**,来保证软件系统控制多个线程对同一个共享资源的访问,使得每个线程在访问共享资源的时候,可以独占或者说互斥访问(mutual exclusive access)。主要的思路就是在序列化数据的时候,添加一个头部来提供 frame 的长度,反序列化的时候,先读出头部,获得长度,再读取相应的数据。使用 Mutex 时,你需要很小心地避免死锁,控制临界区的大小,防止一切可能发生的意外。原创 2023-04-15 14:49:08 · 1204 阅读 · 0 评论 -
rust网络编程以及unsafe模块
此外,因为线程的调度是操作系统完成的,每次调度都要经历一个复杂的、不那么高效的 save and load 的上下文切换过程,所以如果使用线程,那么,在遭遇到 C10K 的瓶颈,也就是连接数到万这个级别,系统就会遭遇到资源和算力的双重瓶颈**。因为 Send / Sync 是 auto trait,所以大部分情况下,你自己的数据结构不需要实现 Send / Sync,然而,当你在数据结构里使用裸指针时,因为裸指针是没有实现 Send/Sync 的,连带着你的数据结构也就没有实现 Send/Sync。原创 2023-04-13 15:45:02 · 1528 阅读 · 0 评论 -
如何在rust中使用泛型,trait对象的总结以及kv sever(3)
可以说在 Rust 开发中,泛型编程是我们必须掌握的一项技能。在你构建每一个数据结构或者函数时,最好都问问自己:**我是否有必要在此刻就把类型定死?**是不是可以把这个决策延迟到尽可能靠后的时刻,这样可以为未来留有余地?如果我们能通过泛型来推迟决策,系统的架构就可以足够灵活,可以更好地面对未来的变更。前面学习到trait可以实现参数多态,就是函数或者数据结构用T表示,不是具体类型;还可以实现特设多态,也就是函数重载,一个函数接口不同的参数有不同的实现;更牛逼的就是trait做参数的时候,可以实现特征约束原创 2023-04-13 10:00:38 · 684 阅读 · 0 评论 -
rust中的集合容器(切片和哈希)与错误处理
例如考虑一个场景,有一张表格中记录了足球联赛中各队伍名称和积分的信息,这张表如果被导入到 Rust 项目中,一个合理的数据结构是 Vec 类型,该数组中的元素是一个个元组,该数据结构跟表格数据非常契合:表格中的数据都是逐行存储,每一个行都存有一个 (队伍名称, 积分) 的信息。,不想当时处理,就用?在实际使用中,不是所有的场景都能 new 一个哈希表后,然后悠哉悠哉的依次插入对应的键值对,而是可能会从另外一个数据结构中,获取到对应的数据,最终生成 HashMap。原创 2023-04-10 15:55:59 · 672 阅读 · 0 评论 -
rust中的智能指针
不同的是cell是通过get获取到的是原有对象的拷贝,适合实现了Copy的类型,或者体积小的struct,因为get方法是直接按位复制的。堆上分配内存的 Box其实有一个缺省的泛型参数 A,就需要满足 Allocator trait,这其实是指定一种内存分配器,并且默认是 Global,当然也可以替换成自己的内存分配器。我们先来复习一下C是怎么分配堆内存的。String(智能指针) 对堆上的值有所有权,而 &str(胖指针) 是没有所有权的,这是 Rust 中智能指针和普通胖指针的区别。原创 2023-04-10 10:40:01 · 546 阅读 · 0 评论 -
类型系统和trait相关
特征就是定义一个共同的行为集合,做接口类,不同的类型可以具体实现这些行为,这就实现了ad-hoc,同一个函数签名,不同类型的参数使用,具体实现不一样。还有一些表达式,有时有返回值,有时没有返回值(也就是只返回单元值),或者有时返回正确的值,有时返回错误的值,Rust 将这类情况也纳入了类型系统,也就是。几乎总是使用特征对象的引用方式,如 &dyn Draw、Box(虽然特征对象没有固定大小,但它的引用类型的大小是固定的,它由两个指针组成(ptr 和 vptr),因此占用两个指针大小)原创 2023-04-09 21:48:10 · 491 阅读 · 4 评论 -
rust构建一个简单的KV server-基本流程(1,2)
为什么选 KV server 来实操呢?因为它是一个足够简单又足够复杂的服务。参考工作中用到的 Redis / Memcached 等服务,来梳理它的需求。最核心的功能是根据不同的命令进行诸如数据存贮、读取、监听等操作;而客户端要能通过网络访问 KV server,发送包含命令的请求,得到结果;数据要能根据需要,存储在内存中或者持久化到磁盘上。先来一个短平糙的实现如果是为了完成任务构建 KV server,其实最初的版本两三百行代码就可以搞定,但是这样的代码以后维护起来就是灾难。我们看一个省却了不少细节原创 2023-04-08 20:20:37 · 713 阅读 · 0 评论 -
rust值的创建使用销毁过程
所有权机制规定了,一个值只能有一个所有者,所以在释放堆内存的时候,整个过程简单清晰,就是单纯调用 Drop trait,不需要有其他顾虑。比如我们创建一个文件 file,往里面写入 “hello world”,当 file 离开作用域时,不但它的内存会被释放,它占用的资源、操作系统打开的文件描述符,也会被释放,也就是文件会自动被关闭。所以都是比较高效的。它默认将堆内存的生命周期和使用它的栈内存的生命周期绑定在一起,并留了Box::leak机制,让堆内存在必要的时候,可以有能力超出帧存活期的生命周期。原创 2023-04-07 10:34:21 · 348 阅读 · 0 评论 -
rust的所有权和生命周期问题,借用问题
但是,这也会让代码变复杂,尤其是一些只存储在栈上的简单数据,如果要避免所有权转移之后不能访问的情况,我们就需要手动复制,会非常麻烦,效率也不高。所有权还是原来的人的,你知识借用一下。比如传参的时候,用&arr,就是借用了,只读借用实现了copy语义,也就是堆上数据的指针会复制一份给函数,但是函数并不拥有数据本身,数据只是临时借给它使用,所有权还在原来的拥有者那里。那么,一些原生类型比如整数,浮点数等简单类型,组合类型,以及函数,裸指针都是copy语义,这些都比较小,浅拷贝栈上可以放的下去,不会转移所有权。原创 2023-04-06 21:26:57 · 507 阅读 · 1 评论 -
认识rust的项目管理工具--cargo
/target/debug/world_hello(debug 模式,在这种模式下,代码的编译速度会非常快,可是福兮祸所伏,运行速度就慢了. 原因是,在 debug 模式下,Rust 编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。cargo 提供了一系列的工具,从项目的建立、构建到测试、运行直至部署,为 Rust 项目的管理提供尽可能完整的手段。,如果 Rust 开发者希望 Rust 项目能够按照期望的方式进行构建、测试和运行,那么,必须按照合理的方式构建 Cargo.toml。原创 2023-04-04 17:43:47 · 833 阅读 · 1 评论 -
rust语言精要
在语义上,每个变量绑定实际上都拥有该存储单元的所有权,这种转移内存地址的行为就是所有权(OwnerShip)的转移,在 Rust 中称为移(Move)语义,那种不转移的情况实际上是一种复制(Copy)语义。当Box<T>超出作用域范围时,将调用其析构函数,销毁内部对象,并自动释放堆中的内存。当位置表达式出现在值上下文中时,该位置表达式将会把内存地址转移给另外一个位置表达式,这其实是所有权的转移。也就是说,左边是代表内存位置的,是变量,右边是要么是字面量,要么是表达式求值过程中创建的临时值。原创 2023-03-30 15:39:40 · 568 阅读 · 0 评论 -
Rust语言的基本介绍
还包括了从现代C++那里借鉴的RAII机制,这是Rust无GC但是可以安全管理内存的基石。内存安全的Bug和并发安全的Bug产生的内在原因是相同的,都是因为内存的不正当访问而造成的。同样,利用装载了所有权的强大类型系统,Rust还解决了并发安全的问题。比如Ada语言(军方会用)的动态内存管理虽然是高规格的安全设计,但还是引起了非常重大的安全事故。“Rust”也有“铁锈”的意思,暗合“裸金属”之意,代表了Rust的系。此外,“Rust”在字形。rust的英文是锈菌,是一种真菌,这种真菌的生命力非常顽强,其。原创 2023-02-27 20:16:54 · 1721 阅读 · 0 评论