Linux基础组件
文章平均质量分 95
Linux基础组件
闲谈社
有没有生发神药推荐啊
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
应用层协议设计及ProtoBuf
协议是一种约定,通过约定,不同的进程可以对⼀段数据产生相同的理解,从而可以相互协作,存在进程间通信的程序就⼀定需要协议。比如不同表的插头,需要根据不同的国标进行各种转换。如果我们两端进行通信没有约定好协议,那彼此是不知道对方发送的数据是什么意义。1)Protobuf 采用 Varints 编码和 Zigzag 编码来编码数据其中 Varints 编码的思想是移除数字高位的 0,用变长的二进制位来描述一个数字,对于小数字,其编码长度短,可提高数据传输效率。原创 2023-07-16 23:27:19 · 688 阅读 · 0 评论 -
两种异步日志方案的介绍
如何实现高性能的日志1)批量写入:同步方式通过积攒一定的数据(如4M)或者设定超时时间,以此触发写入。如glog日志库。异步方式通过append积攒数据,异步落盘线程负责数据写入磁盘,如moduo日志库。2)唤醒机制:通知唤醒 notify + 超时唤醒 wait_timeout3)锁的粒度:为减少锁的粒度,减少刷新磁盘的时候日志接口阻塞,采用双队列方式。前台队列实现日志接口,后台队列实现刷新磁盘。4)内存分配:通过move语义,避免深拷贝;双缓冲,前台后台都设有。原创 2023-07-15 16:04:50 · 1083 阅读 · 0 评论 -
分布式锁的实现方式
通常我们说的锁,指的是单机单进程中多线程环境下,当多个线程同时访问共享资源时,会引发并发访问的问题,可能导致数据不一致或竞态条件。通过使用锁,可以确保一次只有一个线程能够访问共享资源,从而避免这些问题。通常使用的锁有:1)互斥锁2)自旋锁3)信号量4)读写锁5)原子变量以及内存屏障6)条件变量那么,如果是多个进程相互竞争一个资源,如何保证资源只会被一个操作者持有呢?原创 2023-07-14 16:37:55 · 2761 阅读 · 0 评论 -
内存泄漏检测组件
内存泄漏是在没有自动 gc 的编程语言里面,经常发生的一个问题。自动垃圾回收(Automatic Garbage Collection,简称 GC)是一种内存管理技术,在程序运行时自动检测和回收不再使用的内存对象,以避免内存泄漏和释放已分配内存的负担。因为没有 gc,所以分配的内存需要程序员自己调用释放。其核心原因是调用分配与释放没有符合开闭原则,没有配对,形成了有分配,没有释放的指针,从而产生了内存泄漏。free(p1);以上代码段,分配了两个s1大小的内存块,由 p1 与 p2 指向。原创 2023-07-11 21:19:57 · 470 阅读 · 0 评论 -
实现死锁检测组件
死锁,是指多个线程或者进程在运行过程中因争夺资源而造成的一种僵局,当进程或者线程处于这种僵持状态,若无外力作用,它们将无法再向前推进。如下图所示,以申请锁资源为例。线程 A 想申请线程 B 的锁,线程 B 想申请线程 C 的锁,线程 C 想申请线程 D 的锁,线程 D 想申请线程 A 的锁,从而构建了一个资源申请环。多个线程之间依次想要访问其他线程的资源,这样相互僵持形成的一个资源申请闭环。死锁的存在是因为有资源申请环的存在,所以只要能检测出资源申请环,就等同于检测出死锁的存在。原创 2023-07-11 21:19:02 · 616 阅读 · 0 评论 -
分别基于红黑树、timefd、多级时间轮实现定时器
分别基于红黑树、timefd、多级时间轮实现定时器原创 2023-07-07 16:29:15 · 995 阅读 · 0 评论 -
详解高性能无锁队列的实现
无锁队列(Lock-Free Queue)是一种并发数据结构,它允许多个线程在没有锁的情况下进行并发操作。传统的队列通常通过互斥锁来实现线程安全的操作,但互斥锁在高并发情况下可能会造成竞争和性能瓶颈。为了避免使用锁,无锁队列采用了基于原子操作的并发算法。无锁队列的设计目标是在保持线程安全的前提下提供高性能的并发操作。它通常使用 CAS(Compare and Swap)等原子指令来实现对队列头部和尾部指针的更新和操作。CAS 操作可以确保只有一个线程能够成功修改指针,其他线程则需要重试或者尝试其他操作。原创 2023-07-05 16:41:19 · 2427 阅读 · 0 评论 -
从CPU缓存结构到原子操作
原子操作是指在执行过程中不会被中断的操作,要么全部执行成功,要么全部不执行,不会出现部分执行的情况。原子操作可以看作是不可分割的单元, 运行期间不会有任何的上下文切换。1)在单核处理器上,原子操作可以通过禁止中断的方式来保证不被中断。当一个线程或进程执行原子操作时,可以通过禁用中断来确保原子性。在禁用中断期间,其他线程或进程无法打断当前线程或进程的执行,从而保证原子操作的完整性。2)在多核处理器上,原子操作的实现需要使用一些特殊的硬件机制或同步原语来保证原子性。原创 2023-07-03 21:30:39 · 3259 阅读 · 11 评论 -
Linux组件之内存池的实现
内存申请与释放都需要与操作系统进行交互,具体来说就是系统维护一个内存链表,当有一个内存申请过来时,根据分配算法在链表找一个合适的内存分配给它。此时,可以选择重置内存池,将所有已经分配的内存块释放回来,并重新初始化内存池的状态,使其恢复到最初的状态,以便重新利用这些内存空间。总之,内存池是一种有效管理内存的机制,通过提高内存分配和释放的效率,减少内存碎片化,降低动态内存分配的次数,能够帮助提高程序的性能和可靠性。4)调用内存分配函数的时,小块内存每次都分配固定大小的内存块,这样就避免了内存碎片产生的可能。原创 2023-07-02 16:35:22 · 1013 阅读 · 0 评论 -
Linux组件之数据库连接池
创建数据库连接是一个很耗时的操作(后面会具体介绍),因此利用池化技术,在应用程序和数据库服务器之间建立一个缓存区,即数据库连接池。当应用程序需要访问数据库时,可以从连接池中获取一个可用的数据库连接对象进行操作,并在完成操作后将其归还到连接池中。当某任务需要操作数据库时,只要从连接池中取出一个连接对象,当任务使用完该连接对象后,将该连接对象放回到连接池中。数据库连接池在初始化工作完成后,对于业务请求处理而言,直接利用现有可用的连接,避免了从数据库连接初始化和释放过程的开销,从而缩减了系统整体响应时间。原创 2023-07-01 14:28:54 · 1014 阅读 · 0 评论 -
Linux组件之线程池
手写线程池原创 2023-06-29 16:50:43 · 1026 阅读 · 0 评论
分享