自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 多线程并发和多任务并行的小结

协程由用户空间的调度器进行调度,调度器根据协程的调度策略进行切换,切换开销较小,协程在单个线程中执行,通过调度器的切换来实现多个协程之间的并发执行,协程之间共享线程的调用栈和上下文,可见异步编程就是协程的操作。创建的新线程将在后台运行,并执行闭包中的代码。7.Pin 包裹一个指针(一个可以解引用成 T 的指针类型 P,而不是直接拿原本的类型 T),并且能确保该指针指向的数据不会被移动,所以,对于 Pin 而言,你看到的都是 Pin、Pin,但不会是 Pin。

2023-06-21 11:27:53 1247 1

原创 一文解决Rust字符串:String,str,&String,&str,CString,CStr

而str是一个不可变的固定长度的字符串,如果是从String解引用而来的,则指向堆上,如果是字面值,则指向静态内存。在Rust中,s的类型是&str,而“abcd”是str类型,这里的“abcd”就是字符串字面值,存放在Stack上的。s 是切片,切片是一个结构体,包含两个字段,一个是指向数据的指针,另一个是数据的长度。和CStr表示从C中来,rust不拥有归属权的字符串相反,CString表示由rust分配,Rust拥有所有权,可以进行修改,用以传给C程序的字符串。表示的类型有很多种。

2023-02-21 15:36:36 2626 1

原创 Rust编程细节知识点拾遗

通过mpsc::channel创建通道,是多个生产者,单个消费者。通过spmc::channel创建通道spmc是一个生产者,多个消费者。

2023-02-21 11:15:04 722

原创 用Rust写一个链表,非常详细,一遍看懂

在Rust里写一个链表可不是一件容易的事,涉及到很多的知识点,需要熟练掌握之后才能写出一个不错的链表。这篇文章主要介绍了如何写一个Rust链表,并且补充了涉及到的很多的额外知识点,尤其是所有权问题。首先,你需要明白,为什么Rust链表难写,同样的为什么C实现简单一点呢?只能有一个引用!!!这是最关键的,然后就是Rust中是没有NULL指针的,这就需要用到Option枚举,在编译阶段必须知道类型的大小,这就需要使用Box智能指针。在C语言实现一个简单的链表,可以这样写:这段代码里面,head和new

2022-12-03 18:38:32 3004 1

原创 Rust(trait、Box指针、自动化测试、迭代器)

当把某类型的引用传递给函数或方法时,但它的类型与定义的参数类型不匹配,Deref Coercion就会自动发生,编译器会对deref进行一系列调用,转化为合适的类型,在编译时完成,没有额外的性能开销。()宏,进行格式化,format和println有区别,一个是格式化,一个是打印。

2022-11-17 09:46:28 1062

原创 Rust中级教程:指针生态(引用、原始指针、智能指针)and内存操作(Stack、Heap)

变量的高级模型:当变量被访问的时候,可以从变量的上次访问到这次访问画一条线,从而在两次访问之间建立了依赖关系。如果变量没有被初始化,或者变量被移动了,就不能从它那画线了。使用这种模型,程序会出现很多的依赖关系,依赖线,叫做flow。每个flow都在追踪一个值的特定实例的生命周期,当有分支存在的时候,flow可能分叉或合并,每个分成都在追逐该值的不同生命周期。在程序中的任何给定点,编译器可以检查所有的flow是否相互兼容、并行存在。例如:一个值不可能有两个具体可变访问的并行flow;

2022-11-16 16:16:27 1664 1

原创 用Rust实现grep操作

这次的Rust练习是写一个linux命令的grep的操作,代码中有详细的注释。

2022-11-01 15:41:11 371 1

原创 Rust嵌入式开发开源环境概览(零散的一些知识点)

往上是PAC(外围设备通道库)和Cortex内核相关的库,这两个是同时存在的, PAC库操作的是关于外设的寄存器,微处理架构库操作的是关于架构的寄存器。嵌入式开发的最基本最底层的工作,就是读写寄存器,因此,PAC是整个开发中最基础的组件,PAC代码重复度很高,且有非常规范的格式,人工编写麻烦,所以PAC代码往往由工具自动生成,svd2rust就是这样一个工具。连接器:使用LLVM的lld工具,在嵌入式开发中,需要提供自己的链接脚本,通常以.x为后缀的文件。左边是代码的依赖关系,右边是开发的环境。

2022-10-14 16:03:44 2159 2

原创 Rust嵌入式编程---#![no_std]和中断处理

上一节讲了一下异常处理和panic处理,中断在各种方面与异常不同,但它们的操作和使用在很大程度上是相似的,并且它们也由相同的中断控制器处理。虽然异常是由Cortex-M架构定义的,但中断在命名和功能上始终是供应商(甚至通常是芯片)特定的实现。以下是详细的中断处理代码,其实和异常处理差别不大,但是后面后期的改进空间比较大,功能会更多一些。2.中断可以嵌套和抢占,即中断处理程序的执行可能会被另一个优先级较高的中断中断。3.通常,需要清除导致中断触发的原因,以防止无休止地重新进入中断处理程序。

2022-09-29 14:36:45 727

原创 Rust嵌入式编程---panic处理和异常处理

异常意味着抢占,并涉及异常处理程序,即响应触发事件的信号而执行的子例程,这就是和。是硬件上的,而panic理解成软件上的,比如访问文件不存在啊、访问越界啊、除0操作等等,而且panic一般没有那么多处理方式,没有抢占和触发panic处理程序等等。在标准库(Std)中,panic有一个定义的行为:它展开 panic 线程的堆栈,除非用户选择在 panic 时中止程序,否则会进行错误位置的一个堆栈定位。该值是发生异常时程序计数器的值,它指向触发异常的指令,所以可以看一下pc的值指向的指令就是错误的地方。

2022-09-29 11:31:11 1408

原创 Rust嵌入式编程---动态内存分配器(Vec,String等)

本教程不是0基础的Rust嵌入式编程,需要有一定的Rust裸机编程的基础知识。作为一个比较接近C的例子,适合入门,代码比较容易理解。本次例子使用的是target = “thumbv8m.main-none-eabihf” # Cortex-M33 (with FPU)平台进行编译,生成的二进制文件在Qemu模拟器中运行。嵌入式系统编程是不能使用Rust的Std库的,只能使用它的子库:core。以及一些cortex库还有导入的一些外部库,看代码例子即可。

2022-09-28 17:50:47 1251

原创 Rust中的输入输出格式变化(非常详细)

使用 trim() 去除多余的符号,例如回车号,然后使用 parse() 来做数据转换。

2022-09-14 16:52:28 728

原创 Rust中FFI编程知识点整理总结

这个工具就是将写好的Rust代码配置一下,然后会自动生成接口代码头文件等等。其实,FFI封装、转换,熟悉了之后,知识点就那些,模式也比较固定,如果接口量很大,那就需要大量重复的 coding。量一大,人手动绑定出错的机率也大。所以这种辅助工具的意义就显露出来了。基于辅助工具生成的代码,如不完美,再适当手动修一修,几下就能搞定,大大提高生产效率。

2022-09-11 16:37:12 1497

原创 C中分配堆栈,Rust中填充使用

也就是说,Rust 这边,它就认 C 的指针,而不管这个指针是从哪里来,栈也好,堆也好,甚至其它地址的指针也好,对 Rust 来说,其实都一样(本质上都是内存指针)。2.C代码中是一个生成一个结构体数组,传入数组名,这边用结构体指针进行接收,传数组之前说过需要告知长度,s就是可变切片类型,另一个打印不需要可变类型,这里注意Rust对于可变不可变做了很不同的使用方式。1.这里的传递方式和上面还是一样的,只是这里的C语言部分,自己做了个申请,,定义了一个返回结构体指针的函数,这边的堆释放需要手动完成。

2022-09-07 15:46:23 279

原创 Rust-FFI复杂参数传递处理方式2--字符和字符串类型

使用std::ffi::CStr提供的from_ptr方法包装 C 的字符串指针,它基于空字符’\0’来计算字符串的长度,并可以通过它将外部 C 字符串转换为 Rust 的 &str和String。和CStr表示从C中来,rust不拥有归属权的字符串相反,CString表示由rust分配,Rust拥有所有权,可以进行修改,用以传给C程序的字符串。我们必须确保 C 中的字符串是有效的UTF-8编码,且引用字符串的指针不能为 NULL,因为 Rust 的引用不允许为 NULL。...

2022-09-01 11:40:16 982

原创 Rust-FFI复杂参数传递处理方式1--数组类型

2.C语言和Rust的相互调用,最核心的就是指针的操作,两边的代码使用的是同一个程序栈,栈上的指针能放心地传递,而不用担心被错误释放的问题(栈上内存被调用规则自动管理,C和Rust中都是如此)。两边的代码可能使用不同的堆分配器,因此,堆上的指针的传递需要严格注意,需要各自管理各自的资源,谁创建谁释放,指针传递过程中,需要分析所有权问题。栈和堆的操作是不同的,这里一定要注意。1.对于数组的传递,分成了两个部分,一个是数组地址指针的传递(首元素指针),另一个是数组的长度(即元素的个数,非字节数)。...

2022-09-01 11:39:20 1203

原创 C语言和Rust语言的互相调用(2)(Rust调用C)

rust语言调用c语言,写的比较详细。

2022-08-26 14:38:57 3315

原创 C语言和Rust语言的互相调用(1)(C调用Rust)

C语言和rust的相互调用,非常清晰。

2022-08-22 16:42:08 3693 1

原创 Rust:多线程并发编程

C/C++语言在操作系统的最底层也支持多线程,且语言本身以及其编译器不具备侦察和避免并行错误的能力,这对于开发者来说压力很大,开发者需要花费大量的精力避免发生错误。move闭包通常和threadspawn函数一起使用,它允许你使用其它线程的数据,创建线程时,把值的所有权从一个线程转移到另一个线程。可以使用join()方法来等待线程的完成,会阻止当前线程的运行,知道handle所表示的线程的终结。线程不同于进程(process)的地方是线程是程序以内的概念,程序往往是在一个进程中执行的。...

2022-08-01 11:42:10 1266

原创 Rust泛型、特征、生命周期

2022-07-12 15:26:23 293 1

原创 Rust编程:组织管理和错误处理

1.Pacakge包含一个Cargo.toml(就是通过cargo new 出来的),它描述了如何构建Crates。只能包含0-1个library crate,可以包含任意多个binary crate,但是必须至少包含一个crate(二者都可)。2.crate的类型有两种(binary和library),还有一个crate root,这个是rustc编译器开始编译的地方。其中main.rs就是入口文件。src/main.rs是binary crate的crate root。如果还有个src/lib.rs,那

2022-07-06 18:15:23 398 1

原创 Rust集合类型(vector,string,hashmap)

1.只能存储相同类型的数据,在内存中是连续存放,往vector里面添加元素时,可能这块地方不够,换个地方存储,所以你借用(引用)之后就不能修改vector。2.vector的创建:这是一个空的vector,需要指明数据具体格式。使用初始值的方式创建:使用vec!宏。3.更新vector,向里面添加元素,使用push的方法。删除vector:vector也有作用域,超出范围就会删除。4.读取vector的元素:有引用和get()方法5.遍历vector的值。6.vector+enum的实例使用en

2022-07-03 10:37:49 537 1

原创 Rust字符串切片、结构体和枚举类

上图解释了字符串切片的原理。其中,“…”这个符号需要了解一下,x…y表示[x,y)的含义。…y表示0~y。x…表示x到结束,…表示开始到结尾。有两个字符串类型我们在这里区分一下:str和string类型。凡是用双引号包括的字符串常量整体的类型性质都是 str:let s=“loot”;String 类型是 Rust 标准公共库提供的一种数据类型,它的功能更完善——它支持字符串的追加、清空等实用的操作。String 和 str 除了同样拥有一个字符开始位置属性和一个字符串长度属性以外还有一个容量(cap

2022-06-30 17:25:40 718 1

原创 Rust所有权(非常重要)

移动(move): 多个变量可以在 Rust 中以不同的方式与相同的数据交互这里的数据是基本数据类型,所以不需要存到堆中,只在栈中复制和移动。基本数据类型:1.所有整数类型,例如 i32 、 u32 、 i64 等。2.布尔类型 bool,值为 true 或 false 。3.所有浮点类型,f32 和 f64。4.字符类型 char。5.仅包含以上类型数据的元组(Tuples)。如果发生的情况在堆里面,就会不一样:此处hello需要存在堆里面,后面释放的时候,并不会释放两次,因为s2=s1

2022-06-30 14:09:30 348 1

原创 Spark内核调度(重点理解)

文章目录1.DAG2.DAG的宽窄依赖和阶段划分3.内存迭代计算4.Spark并行度5.Spark任务调度6.Spark运行中的名词解释1.DAGDAG:有向无环图下图是带分区关系的DAG图上图其实就是一个job,只有一个action,就是一个DAG图。2.DAG的宽窄依赖和阶段划分3.内存迭代计算内存迭代计算就是说在一个task进程运行,不需要网络IO,如果全部放在一个内存进程里面跑,不用网络IO,但是这样并行度会大大下降,并行度优先于网络IO。纯内存迭代就是Local模

2022-05-17 10:51:01 276 1

原创 RDD缓存、广播变量、累加器知识点笔记

文章目录1.RDD数据是过程的2.RDD缓存1.RDD数据是过程的2.RDD缓存

2022-05-16 20:40:04 261 1

原创 RDD的Action算子详细笔记,对比学习

文章目录Action算子1.countByKey算子:统计key出现的次数(一般用在kv型RDD)2.collect算子:将RDD各个分区的内容收集到Driver,形成一个list对象3.reduce算子:对RDD数据按照你传入的逻辑进行聚合4.fold算子:和reduce差不多,只是加上了一个初始值5.first算子:就是取出第一个元素6.take算子:取RDD前N个元素,返回一个list7.top算子:对RDD数据集进行降序排序,取前N个8.count算子:计算RDD有多少条数据,返回值是一个数字9.t

2022-05-14 17:21:35 493 1

原创 RDD算子案例练习

文章目录1.数据集和问题2.代码部分1.数据集和问题2.代码部分

2022-05-13 11:07:51 261 1

原创 RDD Transformation算子编程-非常详细,对比学习

文章目录Transformation算子1.map算子:和python的一样,单个单个全部处理一遍2.flatMap算子:解除嵌套,本来合在一起的现在独立3.reduceByKey算子:先分组,再两两聚合4.mapValue算子:仅仅是计算value5.groupBy算子:分组的作用6.Filter算子:过滤掉不要的,保留想要的7.distinct算子:对RDD数据进行去重8.union算子:合并两个RDD为一个,可以混合合并9.join算子:对两个RDD进行连接操作(只能k-v型的)![](https:/

2022-05-13 10:35:14 190 1

原创 大数据RDD详解笔记

1.为什么需要RDD?RDD(Resilient Distribute Datasets):弹性分布式数据集2.RDD的五大特性前三个是必须的,后面两个是可选的。1.RDD是有分区的RDD的分区是RDD数据存储的最小单位,一份RDD数据本质上被分成了很多分区。分区是物理概念,RDD是逻辑上的概念,和列表字典一样。2.计算方法会作用到每一个分区之上3.RDD之间是有互相依赖关系的4.Key- Value型的RDD可以有分区5.RDD的分区规划,会尽量靠近数据所在的服务器3.w

2022-05-12 21:00:54 808 2

原创 Pyspark基础运行原理

1.类库VS框架2.什么是pyspark?3.应用入口:SparkContext

2022-05-09 22:07:21 484 1

原创 Spark on yarn运行原理以及两种部署模式

1.Spark on yarn运行原理2.Spark on yarn 部署模式Cluster模式Client模式

2022-05-09 16:07:09 451 1

原创 Spark local模式和stand alone(HA)模式原理

1.SPARK的local模式原理local[4]的角色图,两个程序可以运行运行spark local[*]模式也可以向spark中提交已经写好的python程序,spark- submitlocal模式总结2.SPARK的standalone原理spark的standalone环境配置,主要是spark-env.sh,在worker文件里面指定workers,配置好之后要分发到其他节点上,3台服务器,一台是master和worker,另外两台均为worker。运行sbin/

2022-05-09 11:32:45 499

原创 大数据杂谈(一些知识点和Linux命令)

1.分布式和集群的区别分布式:多台机器上部署不同的组建集群:多台机器上部署相同的组建2.SSH协议的定义公钥是服务器发给客户端的,服务器自己有私钥可以解密。3.linux基础和一些常用命令常用命令1.history:查看以前所用的写过的命令2.ls3.cd4.创建文件夹、文件,删除(rm)5.复制(cp)、移动(mv)6.查看文件内容命令(cat,more,tail)其中tail -f很重要7.管道命令和echo命令8输出重定向(覆盖和追加命令)9.

2022-05-02 12:54:07 1446 1

原创 第一章 Spark的基础原理和特点

Spark的基础原理和特点Spark和Hadoop的区别?由于spark仅仅只做计算,所以现在的架构往往是用spark取代了hodoop中的mapreduce部分,沿用了HDFS和YARN部分。Spark框架模块Spark运行模式YARN中的角色Spark角色:基本和YARN一样,只是名字不一样而已在正常情况下,Executor是干活的角色,但是在local模式下,Driver既调度又干活。总结...

2022-04-28 19:41:49 870 1

原创 分布式系统---升级Paxos和Raft算法

上一篇博客写到基础的Paxos算法,但是这个基础的算法存在问题,首先就是太耗时间了,每次都需要2个大轮次才可以完成一致共识。一次提案,两阶段提交的RPC调用次数多。文章目录Multi-Paxos算法Raft算法阶段一:领导人选举阶段二:日志复制特殊情况:发生分区Multi-Paxos算法在Basic Paxos协议中,每一次执行过程都需要经历Prepare->Promise->Accept->Accepted 这四个步骤,这样就会导致消息太多,从而影响分布式系统的性能。如果Lead

2022-03-26 20:12:05 572 1

原创 分布式系统--- Paxos算法详解(一遍看懂)

Paxos算法首先来了解一个故事用来导入这个算法Lamport本人也因为Paxos算法获得了计算机最高奖项—图灵奖在这个算法中,需要有几个非常重要的角色:这个算法被叫做Basic-Paxos算法,可以看到算法本身还是比较复杂的,一共有两轮申请返回,下面举几个例子来推演一下算法,例子就是开头的故事。这个例子中,刚开始几个将军并没有收到任何申请,所以直接返回OK,进行accept阶段,对于返回success之后,之后的参谋2发送请求无效,被返回前一步已经确认的进攻消息。至此,所有的角色都知

2022-03-25 23:47:44 1335 2

原创 大数据常见专有名词解释

0.HbaseHbase和hive的区别共同点:1.hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储区别:2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。3.想象你在操作RMDB数据库,如果是全表扫描,就用Hive+Hadoop,如果是索引访问,就用HBase+Hadoop 。4.Hive query就是MapReduce jobs可以从5分钟到数小时不止

2021-01-21 22:36:54 2148

原创 Hadoop计算架构(集群,HDFS,HBase)

几种常见的计算模型Hadoop计算架构集群HDFSHBase

2021-01-21 20:54:37 119

原创 分布式并行计算模型

1.并行计算模型主要考虑多指令流多数据流(MIMD)

2021-01-20 19:01:11 395

Rust语言和C语言的相互调用

文件里面有两个资源包,一个是Rust调用C语言的,另一个是C语言调用Rust语言的,写的比较详细,各个文件写的比较清晰,可以直接使用,观察如何调用和参数编写。

2022-08-18

空空如也

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

TA关注的人

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