自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 资源 (5)
  • 收藏
  • 关注

原创 【docker】2.docker网络

每一个docker容器拥有自己的网络命名空间,那么容器之间是如何通信的呢?docker容器有4种通信方式:bridge模式(默认)host模式container模式none模式。

2024-04-19 21:50:57 219

原创 【go-zero框架】1.goctl工具

go-zero框架与goctl工具

2024-04-18 18:43:17 175

原创 【go的测试】2.性能测试

性能测试,benchmark,pprof,abtest

2024-04-09 22:17:59 619 1

原创 【go的测试】1.错误测试

1. go的几种测试1. go的几种测试错误测试:模糊测试 fuzzingmockmonkey性能测试:基准性能测试 benchmarkpprofab测试其他第三方工具本章总结的是几种错误测试,性能测试见下节。2. go test 命令参数3. Fuzzing 模糊测试(1)Fuzzing 模糊测试(随机测试)一种基于随机输入的自动化测试技术。Fuzzing不需要像单元测试那样使用预先定义好的数据集作为程序输入,而是会通过数据构造引擎自行构造或基于开发人员提供的初始数据。

2024-04-09 21:55:01 275 1

原创 【Web框架】3.GRPC原理

RPCRPC1. rpc协议rpc远程过程调用,是一套协议,基于这套协议规范来实现的框架都可以称为 rpc 框架,常见的 Dubbo、Thrift 和 gRPC。本地方法调用的形式:对于调用方来说,调用 rpc 方法和调用本地方法并没有明显区别。保存服务端地址信息请求编码:将客户端请求方法名、参数等打包,序列化发送请求到服务端(grpc用的是http2方式发送的)接收请求:包含要调用的方法名、参数、其他元数据,并解码调用本地方法:将请求中的参数传递给本地方法,并等待执行。

2024-03-27 23:06:23 640

原创 【Web框架】2.Gin框架

为了能快速找到并组合完整的路由,GIN 在添加路由的同时,会在每个节点中添加 Priority 这个属性。Context 是通过中间件来传递的,在处理 HTTP 请求时,Gin 会依次执行注册的中间件,每个中间件可以对 Context 进行一些操作,然后通过Next() 将 Context 传递给下一个中间件。会将注册的中间件函数HandlerFunc 添加到路由组的函数链HandlersChain中,后续路由组下新注册的 handler 都会在前缀中拼上这部分公共的 handlers。

2024-03-27 22:49:45 864

原创 【Web框架】1.go的net/http标准库

调用链:Post()->Client.Post()->Client.Do()->Client.send()->Transport.RoundTrip()若无可用连接,通过 queueForDial 异步创建一个新的连接,并通过接收一个ready channel的方式,等待连接创建完成。Transport.dialConn:调用 Transport.dial 创建 tcp 连接,并启动异步。persistConn.roundTrip:通过 tcp 连接完成与服务端的交互。for + Accept 阻塞。

2024-03-27 22:39:43 885

原创 【etcd】3.lease租约

在v2版本:没有lease概念,ttl属性携带在key上,etcd client为每个key/ttl创建一个http连接,定时发送请求给etcd server。当ttl短(续期频繁)、key多时,对性能有很大影响。v3版本:将ttl属性绑定在lease上,多个key可以复用一个lease,且将http优化为grpc连接,多路复用流式传输,一个连接可以为多个租约续期,减少了连接数。KeepAlive()——永久续期,客户端只需调用一次,并监听返回值channel,若被closed表示租约被中断。

2024-03-26 17:41:57 759

原创 【etcd】2.mvcc与etcd watch

4. 读源码1. MVCCMVCC(Multi-Version Concurrency Control)多版本并发控制:一种机制,用于实现分布式系统中的并发控制。集群的版本号Revision:逻辑时间戳,全局单调递增,任何 key 的增删改都会使其自增key的版本号CreateRevision:创建 key 时集群的 Revision, 直到删除前都不变ModRevision:修改 key 时集群的 Revision, key 更新时会自增Version:初始为1,更新时自增。

2024-03-26 17:22:08 892

原创 【docker】1.docker的虚拟化原理

docker的虚拟化原理,namespace命名空间,control group资源隔离,unionFS联合文件系统

2024-03-24 20:19:56 641

原创 【etcd】1.etcd架构与raft算法

etcd架构。

2024-03-24 18:50:21 909

原创 redis原理

1、redis的主要思想(1)哈希桶redis用一个全局的哈希表保存所有的键值对,这张哈希表里有多个哈希桶,每个哈希桶中的entry保存了key和value指针,*key指向实际的键,*value指向实际的值。(2)查找过程先通过key计算哈希值,找到对应的哈希桶位置,然后定位到entry,在entry找到对应的数据。(3)哈希冲突不同的key经过哈希函数计算后映射到了同一个位置,落在同一个哈希桶中。解决方式:链式哈希,同一个哈希桶中,多个元素用一个链表来保存,它们之间依次用指针连接。

2024-03-24 18:21:30 718

原创 【go基础】17.系统监控sysmon

Golang的系统监控:go内部启动了一个不会中止的循环,在循环的内部会轮询网络抢占长期运行或者处于系统调用的Goroutine以及触发垃圾回收,通过这些行为,让系统的运行状态变得更健康。主要工作:检查死锁运行计时器:计算与触发计时器轮询网络:管理I/O和网络操作抢占处理器:工作窃取机制,避免线程饥饿问题垃圾回收:定时或内存使用率过高时,触发gc。

2024-03-24 16:46:44 757

原创 【go基础】16.I/O模型与网络轮询器netpoller

一、I/O模型在linux世界中,所有I/O设备被抽象为文件Everything is File,都通过文件操作:open 打开;seek 改变读写位置;read write 读写;close 关闭文件描述符(File descriptor,FD):用于访问文件或者其他 I/O 资源的抽象句柄,例如:管道或者网络套接字。不同的 I/O 模型会使用不同的方式操作文件描述符。5种I/O模型:同步的阻塞I/O模型非阻塞I/O模型I/O多路复用模型信号驱动I/O模型异步I/O模型。

2024-03-24 16:32:58 521

原创 【go基础】15.定时器Timer, Ticker

调度器调用 runtime.findrunnable 获取可执行的goroutine 或从其他处理器窃取计时器时。每个P拥有一个最小四叉堆,单独管理。交给网络轮询器和调度器触发,较少上下文切换开销。将全局四叉堆分成64个更小的四叉堆,每个处理器(P)创建的计时器由对应的四叉堆维护。后台系统监控(函数runtine.sysmon)会检查是否有未执行的到期计时器。3. go 1.14之后,每个处理器单独管理计时器,并通过网络轮询器触发。这种分片方式降低了锁粒度,提高了性能,但是造成了cpu频繁上下文切换。

2024-03-24 16:13:18 390

原创 【go基础】14.sync之ErrGroup, Semaphore, SingleFlight

为一组 goroutine 中做同步、错误提取、上下文取消1、初始化2、Go() 接口启动一个goroutine运行任务,可以返回err3、Wait() 接口对sync.WaitGroup的简单封装4、多个goroutine的错误提取控制访问资源的进程数量,保证持有的计数器在0到初始化的权重之间波动。每次获取资源时都会将信号量中的计数器减去对应的数值,在释放时重新加回来;当遇到计数器大于信号量大小时,会进入休眠等待其他线程释放信号。创建信号量Acquire ——

2024-03-22 23:03:40 460

原创 【go基础】13.sync之Map, WaitGroup, Once, Cond, Pool

Map。

2024-03-22 22:57:19 649

原创 【go基础】12.unsafe包

intp与floatp 的地址相同,但是指向不同的数据类型,intp指向一个int值,floatp指向一个float32值。由于int类型有64位,float32只有32位,所以将int转换为float32时发生了内存截断,超出位数的部分被丢弃。这使得go语言是类型安全的,所有类型检查都在编译时完成,可以减少运行时的错误。强制类型转换存在安全隐患,比如转换后的类型字节长度变化,发生内存溢出或截断。强类型:每个变量在编译时明确确定,切类型不能改变。支持一些动态类型的功能,如接口和类型断言,

2024-03-22 22:44:48 401

原创 【go基础】11.atomic与锁 Mutex, RWMutex

几种锁互斥锁同一时刻只有一个线程可以访问(包含读写)资源问题:加锁失败时,会用阻塞进入内核态,当再次加锁成功,一共会有两次线程切换的成本自旋锁:特殊的互斥锁,在加锁失败时不会使线程进入休眠,而是处于忙等待,让线程在循环中不断检查锁的状态适用:持锁时间短的场景,不会造成线程切换读写锁允许多个线程同时读,但只允许一个线程写适用:可以区分读和写的场景,能提高并发乐观锁:操作数据时认为别人不会修改数据,实现方式——CAS(CompareAndSwap):仅数据是期望值时才修改。

2024-03-22 22:35:42 726

原创 【go基础】10.垃圾回收GC

垃圾回收 trace过程Go的GC设计原理。

2024-03-22 22:30:32 772

原创 【go基础】9.内存分配, 内存逃逸, 栈空间

概括。

2024-03-22 22:18:54 774

原创 【go基础】8.反射reflect

因为 Go 语言的语法元素很少、设计简单,所以它没有特别强的表达能力,但是 Go 语言的 reflect 包能够弥补它在语法上 reflect.Type 的一些劣势。使用反射来调用方法非常复杂,原本只需要一行代码就能完成的工作,现在需要十几行代码才能完成,但这也是在静态语言中使用动态特性需要付出的成本。反射作为一种元编程方式可以减少重复代码,但是过量的使用反射会使我们的程序逻辑变得难以理解并且运行缓慢。interface{}类型的转换需要额外的时间和空间开销,机器码也需要额外的指令来完成类型转换。

2024-03-22 22:04:27 331

原创 【go基础】7.context上下文

context是interface{}类型,本质是个指针(interface{}是引用传递),在函数传递过程中会拷贝这个指针,但是context没有暴露直接修改context内容的方法,所以无法修改指针指向的内容。stop是一个用于取消ctx与f关联的function,即如果f还未被触发,stop()可以取消f的注册,若stop()返回值false,说明f已经被触发。在旧版本中done用的chan struct{}类型,现在做了锁优化,atomic.Value是并发安全的,并且可以存储更多种类型的数据。

2024-03-22 21:57:06 454

原创 【go基础】6.关键字之for/range, make/new, defer, panic/recover

可以遍历的结构数组/切片map字符串channel- 循环永动机以上代码是不会发生永动的。对于所有的 range 循环,go会在编译期将原切片或者数组赋值给一个新变量,在赋值的过程中就发生了拷贝,又通过 len 关键字预先获取了切片的长度,所以在循环中追加新的元素也不会改变循环执行的次数- 保存range返回变量的地址时,会出现覆盖。

2024-03-22 21:45:23 635

原创 【go基础】5.基本数据结构之array, slice, string

策略:如果期望容量大于当前容量的两倍就会使用期望容量;新的字符串是一片新的内存空间,与原来的字符串也没有任何关联,一旦需要拼接的字符串非常大,拷贝带来的性能损失是无法忽略的。当数组中元素所占的字节大小为2/4/8 的倍数时,运行时会对齐内存,将待申请的内存向上取整,提高内存的分配效率并减少碎片。不会拷贝原数组或者原切片中的数据,它只会创建一个指向原数组的切片结构体,所以修改新切片的数据也会修改原切片。go的数组变量代表了整个数组,在传递时传递的是原数组的拷贝,可以理解为一种有序的struct。

2024-03-22 21:28:33 419

原创 【go基础】4.基本数据结构之map

而遍历的过程,其实就是按顺序遍历内存地址,同时按顺序遍历内存地址中的 key,但这时已经是无序的了。但也是因为这样,GO设计者加上随机的元素,将遍历 map 的顺序随机化,用来防止使用者用来顺序遍历。(先插入很多元素创建了很桶,但是装载因子达不到6.5的临界值,未触发扩容,之后,删除元素,再插入很多元素,导致创建很多的溢出桶)数组+链表实现,先用哈希函数选择一个桶,遍历桶中的链表,更新或追加键值。反过来,如果是全写,没有读,那么sync.Map还不如加普通map+mutex锁,只有普通map性能的一半;

2024-03-22 21:08:14 844

原创 【go基础】3.读channel与select源码

ring buffer环形缓冲区:对于buffered channel,buffer队列是环形队列,有G消费数据时,将队元素取出,下一个元素变为队头,刚刚取出的位置变成队尾。对于接收操作,如果通道中有可用的数据,调度器会唤醒相应的接收goroutine,并将数据从通道的内存复制到接收goroutine的内存中。同样,这个过程也是原子的。以上代码用readyc和advancec的赋值,按轮次处理两个channel,实现了一来一回的通信,readyc向外发一个,advancec就向内接收一个,就很妙。

2024-03-22 20:59:51 938

原创 【go基础】2.GMP调度模型

每个P都拥有自己的本地队列,当P上的M执行完当前goroutine后,可以直接从本地队列中取出下一个goroutine来执行,而无需与其他P的队列进行交互。M0:M0是启动程序后的编号为0的主线程,这个M对应的实例会在全局变量runtime.m0中,不需要在heap上分配,M0负责执行初始化操作和启动第一个G, 在之后M0就和其他的M一样了。从缓存区取G的过程,如果本地P为空,从调度器中取P容量的一半个G,放到自己的P里,根据work stealing,偷取的是其他P的一半,所以是否所有P容量相同?

2024-03-22 20:43:00 422

原创 【go基础】1.编译器与运行时

它们的运行时既包含运行时环境又包含运行时库,比如JRE里既包含了JVM运行时环境,又包含一整套的Java标准库。在编译阶段,编译器会确定哪些变量应该存储在栈上,以及它们的大小和生命周期,然后生成机器码,这些机器码会指示运行时系统如何执行代码,如何管理栈内存。从线程模型上看:无运行时的语言在线程模型上往往会直接依赖于操作系统,有运行时的Java和C#,往往有自己的一个线程机制,且与系统不一定完全对应。从运行效率上看:无运行时的C/C++运行效率高,有运行时增加了一些负担,不考虑JIT的情况下运行效率会差。

2024-03-22 20:26:53 597

学习资料 golang的GMP调度模型

视频教程+笔记+ppt

2023-11-02

基于稀疏表示的人脸表情识别程序

基于稀疏表示的人脸表情识别matlab程序,用KSVD构建稀疏表示字典,OMP算法重构信号,实现表情的识别。

2018-06-30

利用模糊算法进行边缘检测的例子

使用模糊理论做的边缘检测的matlab小例子,可以时间简单的图像边缘检测。

2018-06-30

NSGA-2 matlab 实例

NSGA-II非支配排序遗传算法的matlab实例,完整程序可直接运行

2018-06-30

android界面——图片轮播

android简单的界面,包括图片轮播,图片滑动

2016-01-19

android界面-图片轮播VeiwPager

android界面,包含简单的图片轮播,图片滚动等

2016-01-19

空空如也

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

TA关注的人

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