自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++11新特性

std::packaged_task类包装了一个可调用对象包装器类对象(可调用对象包装器包装的是可调用对象,可调用对象都可以作为函数来使用),这个类可以将内部包装的函数和future类绑定在一起,以便后续异步调用,跟std::promise类似,std::promise内部保存一个共享状态的值,std::packaged_task保存的是一个函数。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。条件变量需要和互斥量配合起来使用。

2025-06-12 18:08:46 866

原创 Git基础操作命令

###. SSH Key 配置(用于 GitHub)文件夹,用于版本管理。

2025-06-12 18:04:20 263

原创 死锁检测的实现

更新关系表,在关系表中添加线程与锁的对应关系,同时寻找在图中是否存在等待边并将其删除, 并在有向图中添加持有边。如果在添加等待变实,发现图中存在环,则说明可能发生死锁。可以使用深度优先搜索,或者拓扑排序来检测环。因此存在环是死锁的必要条件,但不是充分条件。但是通过环仍能在很大程度上进行死锁的检测。同时为了避免死锁,只要打破四个条件中的一个即可避免死锁的现象。从关系表中移除对应的条目,并且删除有向图中的持有边。检查是否有其他线程持有该锁,当线程尝试获取锁时,

2025-04-26 15:35:34 340

原创 手撕简易定时器

最小堆: 满二叉树:所有层节点数都是该层所能容纳节点的最大数量 .完全二叉树:若二叉树的深度为h,取出了h层节点就是一个满二叉树,且h层都几种在最左侧排列. 最小堆是一颗完全二叉树,某一个节点的值总是小于等于他的子节点的值,堆中的任意一个节点的子树都是最小堆.(==priority_queue每次插入/删除都会触发一次堆结构调整(heapify 操作),不支持你在内部随便改元素值,==比如如果你要实现。(1000 个定时任务放在堆里,按超时时间排序用。定时器的定义:组织管理大量延时任务的模块。

2025-04-26 13:46:17 323

原创 Redis分布式锁

当没有发生竞争时,在用户空间快速完成任务,当发生竞争时,将通过系统调用进入内核处理。分布式锁是指分布式场景下互斥类型的锁。分布式场景:运行的节点可能在不同的机器或不同的网段中,节点间通过socket进行通信。互斥锁:有两个部分组成1、多个线程都能访问的资源 2、加锁操作以及解锁操作。如何实现分布式锁:利用中间件(数据库,zookeeper,etcd)的特性实现分布式锁的特性。网络交互:锁超时功能(网络因素影响,需要一个超进程)由锁存储的所在节点实现。遍历等待队列唤起等待线程。插入等待队列,挂起当前线程。

2025-04-26 13:08:33 234

原创 SPSC无锁环形队列

通过使用64位对齐解决伪共享的问题,Cache line是CPU从缓存中读取数据的最小单位,对于两个不同的变量,当前处于同一个cache line中时,存在多个线程操作这两个独立的变量由于MESI缓存一致性,会导致大量的同步操作使得,出现伪共享的问题.使用万能引用以及完美转发同时支持左值与右值.右值引用类型是独立于值的,一个右值引用做为函数参数的形参时,在函数内部转发该参数给内部其他函数时,他就变成了一个左值,并不是原来的类型了,如果需要暗战原来的类型转发到另外一个函数,可以使用。依赖cas等原子操作。

2025-04-13 19:31:40 793

原创 原子操作原理及实现shared_ptr

memory_order_seq_cst:顺序一致性语义,对于读操作相当于获得,对于写操作相当于释放,对于读‐修改‐写操作相当于获得释放,是所有原子操作的默认内存序,并且会对所有使用此模型的原子操作建立一个全局顺序,保证了多个原子变量的操作在所有线程里观察到的操作顺序相同,当然它是最慢的同步模型。原子操作:原子变量的操作。多核处理器:除了不被打断,还需避免其他核心操作相关的内存空间,以往0x86 lock指令锁总线,避免所有内存的访问,现在lock指令只需阻止其他核心对相关内存空间的访问。

2025-04-13 11:02:38 670

原创 手撕MySQL连接池

服务端发起请求,try lock 获取锁,每一个连接对应一把锁,随后获取数据后会解锁,此时会阻塞连接发起线程(当前最多允许几个线程或者协程并发的使用连接)。连接的建立,每一个连接对象对应着连接池中的一个连接,需要将一个连接与一个线程进行绑定,用于执行从阻塞队列中获取查询任务并进行执行,在连接中还需要实现连接的创建关闭以及查询功能。阻塞的是建立连接的线程,类似线程池,阻塞的是线程池中的连接,当前最多允许几个连接同时执行SQL语句,通常用于业务的处理。每一个Worker对应一个线程,进行阻塞队列的获取,这里。

2025-04-12 12:31:27 324

原创 线程池的简单实现

可以设计两个队列,生产者之间对应一把锁,消费者之间对应一把锁,生产者线程对应生产者队列,消费者线程对应消费者队列,当消费者队列为空时在阻塞前先去观察消费者队列是否为空。线程池依赖一个阻塞队列与一个线程集合, 在代码中的阻塞队列需要设计为线程安全的阻塞队列队列,能够实现对线程池中线程的管理,核心设计来源于阻塞队列的设计。线程池解决的问题:异步执行耗时任务(不过度占用核心线程 耗时等待,耗时计算),充分利用多核,通常开启的线程的数量与CPU的核心的数量是息息相关的。线程池是管理维持一定数量线程的池式结构。

2025-04-11 23:39:39 331

原创 内存泄漏检测

Linux中有三个宏__FILE____func__和__LINE__,分别指示当前的文件名、函数名和行号,利用宏定义封装内存分配函数和释放函数。return p;free(p3);free(p2);return 0;return p;free(p3);free(p2);return 0;

2025-04-09 11:43:54 1459

原创 网络IO与reactor

当采用一线程一连接时,当有较大的并发时,每次建立一个新的连接都需要建立一个新的线程,会消耗更多的资源,同时计算机内部线程的资源数量时有限的,因此在大并发的情况下,并不适合实际的使用。IO生命周期由无数个事件组成。当采用select方式进行IO多路复用时,需要将集合在内核与用户空间之间进行拷贝,同时在内核中采用线性遍历的方式进行查询状态,在默认情况下fd_set的大小为1024个比特,因此select此时最多建立1024个连接。

2025-04-08 13:53:12 1826

原创 UDP可靠传输与并发

发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速模式后不x2,只是x1.5(实验证明1.5这个值相对比较好),提高了传输速度。TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正丢失的数据包。

2025-04-08 13:35:32 933

原创 基于DPDK的用户态协议栈简单实现

通过上述的过程,即能够实现对于DPDK接收UDP数据报的协议的解析,随后在进行数据的发送时,为了让客户端能够接收到数据需要将原始数据重新进行封装,为其分别添加UDP头,IP头,以及网络头,这三部分使其符合网络协议的要求,将其放入发送队列中,即可实现数据的发送。在这里三次握手的过程,通过状态机的方式实现状态的迁移。在DPDK从队列中读取的数据为网络中原始的数据包,如果想要获得真正的数据还需要对网络数据进行进一步的解析,同时在发送的过程中,还需要对数据进行进一步的封装以符合网络协议的具体的要求。

2025-04-07 16:30:03 1015

原创 io_uring基础操作

当一个或多个 CQE 被处理后,调用该函数更新下一次读取 CQE 时的起始位置,同时告知 I/O uring 已经成功处理了一定数量的完成事件,并释放这些事件所占用的资源。io_uring_peek_batch_cqe() 函数会尝试从I/O uring环境中立即获取指定数量的已完成CQE,并将它们存储到 cqes 指向的指针数组中。io_uring_submit 函数将等待队列中的 SQEs 进行提交,并触发 I/O uring 环境的处理。该函数将返回一个文件描述符,称为 io_uring文件描述符。

2025-04-01 15:33:15 778

原创 POSIX API与 TCP

当服务器收到客户端的ACK包(第三次握手),它会在半连接队列中查找与该ACK包匹配的SYN-ACK节点。如果找到匹配的节点,服务器会将该连接从半连接队列移到全连接队列。TCP的P2P(Peer-to-Peer)连接是指两台计算机(或节点)直接相互通信,而不是通过一个中介服务器。TCP连接的生命周期从客户端发起连接请求(即发送第一个SYN包)开始,到连接关闭(即收到FIN包并完成连接释放)结束。在三次握手的前两次(SYN -> SYN-ACK)期间,服务器将收到的SYN包放入半连接队列。

2025-03-31 21:53:15 1515

原创 协程设计基本原理

setjmp,longjmp //跨平台效果最好,实现起来比较复杂ucontext //实现比较简单,仅仅支持linux平台汇编性能最好,受到CPU体系结构的限制int fd;void *arg;//准备对列//等待红黑树,查找,//睡眠红黑树,查找,//协程结构体co.ss_sp =//scheduler 调度器int epfd;

2025-03-31 17:42:48 336

原创 网络用户态缓冲区设计

在应用程序中设计缓冲区,通过一定的算法来组织好我们的网络数据,方便应用程序在处理业务逻辑的时候从缓冲区中获取数据,进行解析,展开相对应的业务逻辑。2、生产者的速度大于消费者的速度(严格情况,UDP不需要使用发送缓冲区,因为UDP不需要确保接收成功)1、用于解决粘包的问题 (使用特殊字符或者长度界定数据包)2、生产者的速度比消费者的速度快,缓存没来得及处理的数据。1、可能一次不能将所有数据发送出去。使用高效,不需要频繁移动数据。

2025-03-31 14:09:39 311 1

PWM_motor库函数.zip

使用stm32与Ln298,使用按键控制电机的正反转,并且通过PWM控制电机转速

2021-09-16

空空如也

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

TA关注的人

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