自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 容器启动失败,提示no space left on device

在执行mount命令的进程mnt命名空间中的挂载点目录中,查找本次挂载的挂载点目录,如果该挂载点目录已经被挂载过,则设置本次挂载的父挂载点为上一次该挂载点目录的挂载点。如果本次挂载的挂载点在mnt命名空间中的挂载点目录中不存在,则查找本次挂载点目录的父目录,如果父目录在mnt命名空间中存在,则本身挂载的父挂载点就是该挂载点的父目录挂载是的挂载点。2、查找该mnt命名空间,dest_dir挂载点目录是否有/data/,找到了为/data的挂载点,挂载点的组属为shared:30。

2024-11-21 16:49:54 999

原创 异步并发编程

密集任务需要并行运行时,例如并行计算,选多线程模型。后者通过语言特性 + 标准库 + 三方库的方式实现,在你需要高并发、异步。Rust 同时提供多线程编程和 async 编程,前者通过标准库实现,有大量。Async 在 Rust 中使用开销是零。

2024-10-16 00:51:57 190

原创 Macro宏编程

如果我们要使用一个叫HelloMacro的特征,一种方法是首先,创建一个名叫hello_macro的工程,然后在src/lib.rs中定义过程宏所需的HelloMacro特征和其关联函数,接着是定义过程宏,宏所在的包名要求必须以derive为后缀,并且要放在单独的包中,因此再在项目根目录下lib包根。最后是完成主体代码//hello_macro 项目的目录结构├── src├── src└── lib.rs# 也可以使用下面的相对路径。

2024-10-15 01:19:51 1000

原创 rust学习之unsafe语块

unsafe为我们提供了解引用裸指针、调用一个unsafe或外部的函数、访问或修改一个可变的静态变量、实现一个unsafe特征、访问union中的字段这5个方面的能力,此时编译器不会进行内存安全方面的检查,使我们能轻松绕过相关的编译检查。但unsafe并不能绕过 Rust 的借用检查,也不能关闭任何 Rust 的安全检查规则。

2024-10-10 00:32:08 438

原创 rust学习之错误处理

为了更好的定义错误,Rust 在标准库中提供了一些可复用的特征,如特征自定义错误类型只需要实现Debug和Display特征就可以作为Err来使用,source方法是可选的,而Debug特征往往也无需手动实现,可以直接通过derive来派生。然而实现Debug和Display特征并不是作为Err// AppError 是自定义错误类型,它可以是当前包中定义的任何类型,在这里为了简化,我们使用了单元结构体作为例子。// 为 AppError 自动派生 Debug 特征。

2024-09-28 23:36:38 492

原创 rust学习之全局变量

编译期初始化的全局变量,const创建常量,static创建静态变量,Atomic创建原子类型运行期初始化的全局变量,用于懒初始化,Box::leak利用内存泄漏将一个变量的生命周期变为'static。

2024-09-28 14:26:07 609

原创 多线程并发编程

rust使用1:1线程模型:程序内的线程数和该程序占用的操作系统线程数相等golang使用的是M:N线程模型:在内部实现了自己的线程模型(绿色线程、协程),程序内部的 M 个线程最后会以某种映射方式使用 N 个操作系统线程去运行而绿色线程/协程的实现会显著增大运行时的大小,因此 Rust 只在标准库中提供了1:1的线程模型,用户根据需要也可以选择 Rust 中的M:N模型,这些模型由三方库提供了实现,如tokio。

2024-06-12 23:55:48 395 1

原创 rust学习之Weak与循环应用

或者类似的类型嵌套组合(具备内部可变性和引用计数)时,特别注意由于循环引用导致的堆栈溢出(main线程8M),造出内存泄漏。的所有内容,最终main线程操作8M,发生栈溢出。对于这类问题,我们可以使用Weak来解决。指向的内存也不会被释放,最终发生了内存泄漏。····,有上述代码我们可以看出:在创建了。这里我们创建了一个复杂的枚举类型。所指向内存不会被释放,同理可得。的调用,Rust 试图打印出。由此此我们成功创建了循环引用。它的每个值都指向了另一个。,此时引用计数会变为。

2024-05-31 00:27:42 372

原创 Rust学习之智能指针

在 Rust 中,最常见的指针类型是引用,引用本身指向某个值,不会造成性能上的额外损耗。而智能指针比引用有更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。引用和智能指针的另一个不同在于前者仅仅是借用了数据,而后者往往可以拥有它们指向的数据。智能指针往往是基于结构体实现,它与我们自定义的结构体最大的区别在于它实现了Deref和DropDeref*TDrop动态字符串String和动态数组可以将值分配到堆上)、Rc(引用计数类型,允许多所有权存在)、Ref和。

2024-05-28 00:35:13 708

原创 深入rust类型

只能应用在数值类型上 ,在其他类型转换时需要强制转换,在某些情况下,类型是可以进行隐式强制转换的。但在匹配特征时,不会做任何强制转换(除了方法)。Rust 是强类型语言,同时也是强安全语言,它内置了一些基本类型之间的转换,如。把范围较小的类型转换成较大的类型,来避免数据超范围。特征通过​std::prelu模块提前引入到了当前作用域中,,此时就可以对其进行相应的错误处理,例如,如果要处理转换错误,那么可以使用。会尝试进行一次转换,并返回一个。

2024-05-15 00:22:28 231

原创 rust学习之迭代器

等,我们只需关注集合中的元素如何处理,而不关心如何去访问等问题。语法糖,自动把实现了该特征的数组类型转换为迭代器,最终可以直接对一个数组进行迭代。循环颇为相似,都是去遍历一个集合。在rust中,数组不是迭代器,但数组实现了。,每次消耗它一个元素,最终迭代器中将没有任何元素,只能返回。迭代器允许我们迭代一个连续的集合,例如数组、动态数组。方法,该方法控制如何从集合中取值,最终返回值的类型是。转换成迭代器后,通过调用其上的。特征,最主要的就是实现其中的。

2024-05-10 00:29:20 264

原创 rust学习之闭包closure

如果只有一个返回表达式的话,定义可以简化为:|param1| 返回表达式。虽然闭包的类型推导很好用,但是它不是泛型,这个整型去调用闭包,跟编译器之前推导的。闭包与函数最大的不同就是它的参数是通过。的形式进行声明,如果是多个参数就。上面的代码展示了非常简单的闭包。)进行相加,最终返回它们的和为。,同时捕获了作用域中的。

2024-04-26 00:35:46 296 1

转载 containerd运行时与docker、kubelet的关系

为了解耦,containerd 将系统划分成了不同的组件,每个组件都由一个或多个模块协作完成(Core 部分),每一种类型的模块都以插件的形式集成到 Containerd 中,而且插件之间是相互依赖的,例如,上图中的每一个长虚线的方框都表示一种类型的插件,包括 Service Plugin、Metadata Plugin、GC Plugin、Runtime Plugin 等,其中 Service Plugin 又会依赖 Metadata Plugin、GC Plugin 和 Runtime Plugin。

2024-04-23 19:57:31 225

原创 Rust学习杂记

str是一个不可变的固定长度的字符串,如果是从String解引用而来的,则指向堆上,如果是字面值,则指向静态内存。s的类型是&str,而“abcd”是str类型,这里的“abcd”就是字符串字面值,存放在Stack上的。s 是切片,切片是一个结构体,包含两个字段,一个是指向数据的指针,另一个是数据的长度。String 类型的字符串是分配在堆上内存的可变字节缓冲区,由内存地址、容量、当前值的长度,这三部分构成。// s[0..1] 的类型为 str是string 的切片类型,不能直接切片,

2024-03-16 00:55:15 419 1

原创 rust学习之注释及格式化输出

我们还可以为参数指定名称,让对应名称的值填充占位符,但。注释不仅仅是文档,还可以作为单元测试的用例运行,使用。代码注释方式有行注释//,块注释/* */两种。特征的 Rust 类型并没有那么多,往往需要我们自定义想要的格式化方式,对于没有实现。之外(依次填充占位符),还能让指定位置的参数去替换某个占位符,例如。文档行注释:/// ,文档块注释:/** */在 Rust 中,无法直接为外部类型实现外部特征,但可以使用。

2024-01-03 00:55:28 1901 1

原创 rust学习之包和模块

对于 Rust 而言,包是一个独立的可编译单元,它编译后会生成一个可执行文件或者一个库。模块可见性不代表模块内部项的可见性,模块的可见性仅仅是允许其它模块去引用它,但是想要引用它内部的项,还得继续将对应的项标记为。使用模块,我们就能将功能相关的代码组织到一起,然后通过一个模块名称来说明这些代码为何被组织在一起。目录下,每一个文件都是独立的二进制包,同时也会包含一个库包,该包只能存在一个。Rust 出于安全的考虑,默认情况下,所有的类型都是私有化的,文件,包根文件中的三个模块分别形成了模块树的剩余部分。

2023-12-21 00:18:40 2073 1

原创 rust学习之错误处理

panic可分为被动触发和主动调用,被动触发指的时由于代码本身原因发生致命错误,如数组访问越界。时,程序提供了栈展开与直接终止两种方式来处理终止流程,默认的方式就是。序会打印出一个错误信息,展开报错点往前的函数调用堆栈,最后退出程序。Rust 中的错误主要分为可恢复错误与不可恢复错误。, 但是会带上自定义的错误提示信息,相比之下,代表成功时存入的正确值的类型,存放方式是。代表错误时存入的错误值,存放方式是。它们的作用就是,如果返回成功,就将。中的值取出来,如果失败,就直接。,如果失败,且是文件不存在错误。

2023-12-20 00:36:45 486 1

原创 rust学习之生命周期

生命周期的主要作用是避免悬垂引用,它会导致程序引用了本不该引用的数据。当存在多个引用时,编译器有时会无法自动推导生命周期,此时就需要我们手动去标注,通过为参数标注合适的生命周期来帮助编译器进行借用检查的分析。生命周期标注并不会改变任何引用的实际作用域,自身并不具有什么意义,其作用只是告诉编译器多个引用之间的关系。即表示返回值的生命周期与参数生命周期中的较小值一致。开头,名称往往是一个单独的小写字母,大多数人都用。活得一样久,同时函数的返回引用也至少跟。,小于它应该具备的生命周期。的作用域的重合部分。

2023-12-08 00:30:07 1654

原创 rust学习之基本结构

可以通过cargo run命令编译并运行代码,也可以先执行cargo build —>在执行./target/debug/world_hello,编译后的二进制文件存放在项目路径的./target/debug/目录下,由于编译默认是。它存储了项目的所有元配置信息,如果 Rust 开发者希望 Rust 项目能够按照期望的方式进行构建、测试和运行,那么,必须按照合理的方式构建。模式下,Rust 编译器不会做任何的优化,只为了尽快的编译完成,开发流程更加顺畅。,前者是一个可运行的项目,后者是一个依赖库项目。

2023-10-08 00:38:45 41

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除