Linux基础组件
文章平均质量分 96
Lion Long
一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
展开
-
【程序狂魔】掌握LD_PRELOAD轻松进行程序修改和优化的绝佳方法!
LD_PRELOAD是Linux/Unix系统的一个环境变量,它可以影响程序的运行时的链接,它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖系统的函数库。LD_PRELOAD 超脱于动态链接库的搜索路径先后顺序之外,它可以指定在程序运行前优先加载的动态链接库。我们可以自己实现一个函数,底层调用系统调用,理由LD_PRELOAD优先加载我们的函数。原创 2023-02-06 10:31:01 · 2740 阅读 · 0 评论 -
深入protobuf(Protocol Buffers)原理:简化你的数据序列化
Protocol buffers 是⼀种语⾔中⽴,平台⽆关,可扩展的序列化数据的格式,可⽤于通信协议,数据存储 等。Protocol buffers 在序列化数据具有灵活、⾼效的特点。相⽐于 XML 来说,Protocol buffers 更加 ⼩巧,更加快速,更加简单。⼀旦定义了要处理的数据的数据结构之后,就可以利⽤ Protocol buffers 的 代码⽣成⼯具⽣成相关的代码。原创 2022-10-14 15:23:56 · 3607 阅读 · 0 评论 -
Linux基础组件之消息协议设计概述
本文摘要:《掌握消息协议设计的艺术:释放高效通信的力量》将带您深入了解消息协议设计的关键要素和技巧。通过详细讨论线程池和任务调度的实现,您将学会如何构建支持二阶任务队列的高效线程池。同时,我们将探索如何优化线程池性能,减少资源开销并避免频繁的线程切换。无论您是初学者还是有经验的开发者,本文都将为您提供宝贵的见解,帮助您在通信领域取得突破。准备好掌握消息协议设计的艺术,让您的通信变得更加高效吧!原创 2022-10-13 14:08:23 · 657 阅读 · 1 评论 -
Linux基础组件之muduo日志库分析
(1)日志可以采用批量写入(以数据大小为判断为准)来做到高性能。同步方式通过攒够数据(比如4M)或者时间超过一定阈值(比如1秒)触发写入。比如glog日志库。异步方式(比如moduo日志库)采用append积攒数据,异步落盘线程负责数据写入磁盘。什么时候触发?------> notify+wait_timeout,即 通知唤醒+超时唤醒。(2)为减少锁的粒度,减少刷新磁盘的时候日志接口阻塞,采用双队列方式(前台队列+后台刷新磁盘队列,后台队列刷新数据到磁盘)。原创 2022-10-12 14:34:37 · 545 阅读 · 1 评论 -
Linux基础组件之log4cpp剖析
(1)日志的树状模块输出。(2)支持多种输出方式,每种输出方式都可以有不同的格式化。(3)log4cpp代码结构组织。fill:#333;color:#333;color:#333;fill:none;}LayoutLayoutLayoutMessageCategoryAppender 1Appender 2Appender nOutputOutputOutput(4)不要直接把log4cpp用在服务器中,因为log4cpp的性能稍差。原创 2022-10-11 14:06:30 · 283 阅读 · 0 评论 -
Linux基础组件之日志框架
通过剖析log4cpp日志库的日志框架,可以清晰一个成熟的、完善的日志框架应该支持:(1)日志级别。(2)日志格式化。(3)日志输出方式。(4)日志回滚。(5)日志配置文件。fwrite()是有缓存去,write()没有缓存,fflush()把用户层的缓存刷新到内核,fsync()将内核的缓存刷新到磁盘中。批量写入数据,少调用write()的接口,也少调用fsync()接口,因为系统调用的性能相对比较差。原创 2022-10-10 16:06:42 · 766 阅读 · 0 评论 -
Linux基础组件之libevent实践
libevent实践中编写了处理接收连接、处理主动连接、读数据、写数据的代码。原创 2022-10-03 22:44:15 · 791 阅读 · 0 评论 -
深入理解libevent事件库的原理与实践技巧
libevent事件库是一个高效的事件驱动库,可以帮助开发者构建高性能的应用程序。本文将深入解析libevent事件库的内部原理,包括事件循环、事件回调和事件驱动模型等关键概念。同时,我们还将分享一些实践技巧,教您如何正确地使用libevent事件库,优化应用程序的性能和可靠性。通过学习本文,您将对libevent事件库有深入的理解,能够熟练地应用该库解决实际开发中的问题。无论您是初学者还是有经验的开发者,本文都将提供宝贵的见解和实践技巧,帮助您充分发挥libevent事件库的潜力,构建出卓越的应用程序。原创 2022-10-03 22:08:52 · 3268 阅读 · 1 评论 -
构建分布式应用的必备技能:掌握分布式锁的实现细节
详述分布式锁的原理,分布式锁实现方式:MYSQL、redis、etcd(1)分布式锁是分布式场景中实现互斥类型的锁。(2)分布式场景就是多台机器在不同的进程当中;需要一个具体存储锁的位置,所有的进程都可以访问。锁存储和加锁 / 解锁行为,加锁对象和解锁对象必须为同一个。(3)解决的问题,分布式场景中,某个资源或行为只允许有一个对象可以操作,主要针对分布式的隔离性。(4)分布式锁的特性:互斥性、锁超时、可用性、容错性。原创 2022-09-29 15:58:26 · 590 阅读 · 0 评论 -
从源头解决内存泄漏问题:全面解析内存泄漏检测与修复技术
本文全面解析了内存泄漏问题,详细介绍了内存泄漏检测与修复技术。首先,我们将深入了解内存泄漏的定义和原因,帮助读者理解为什么内存泄漏是一个严重的问题。然后,我们将介绍几种常见的内存泄漏检测工具和技术,包括静态分析和动态分析方法。我们将详细讨论每种方法的优缺点,并提供实际示例帮助读者更好地理解如何使用这些工具。最后,我们将介绍一些常见的内存泄漏修复技术,包括内存回收和垃圾收集算法的优化。通过本文的阅读,读者将能够全面了解内存泄漏问题,并学会如何从源头解决这些问题,提高程序的性能和稳定性。原创 2022-09-26 14:57:22 · 1031 阅读 · 0 评论 -
掌握死锁检测:策略和最佳实践
死锁的产生是因为多线程之间存在交叉申请锁的情况,因争夺资源而造成的一种僵局。hook使用:(1)定义与目标函数一样的类型;(2)具体函数实现,函数名与目标函数名一致;(3)调用dlsym()函数,初始化hook。死锁检测可以使用图算法,通过检测有向图是否有环判断是否有死锁。原创 2022-09-25 01:36:52 · 882 阅读 · 0 评论 -
释放无锁队列的力量:探索用循环数组实现无锁队列
在计算机科学领域,队列是一种常见的数据结构,用于在多线程或多进程环境中进行有效的消息传递和任务调度。然而,传统的队列实现通常使用锁来保护共享资源,这可能导致性能瓶颈和可伸缩性问题。为了克服这些限制,无锁队列应运而生。无锁队列通过采用特殊的算法和数据结构,使多个线程可以并发地访问队列,而无需使用锁来保护共享资源。其中,基于循环数组的无锁队列是一种经典的实现方式。本文将深入探讨基于循环数组的无锁队列的原理和优势。我们将介绍循环数组的基本概念,并解释如何通过适当的算法和技术实现无锁性。原创 2022-09-24 17:00:00 · 1134 阅读 · 0 评论 -
Linux基础组件之无锁消息队列ypipe/yqueue详解
ypipe_t / yqueue_t无锁队列是单写单读,通过chunk机制避免频繁内存动态分配(内存分配或释放时,多个线程之间存在锁的竞争)。ypipe_t / yqueue_t局部性原理,消息队列(概率性)在某一段时间(时间极短)可能存在波动,复用最近回收的chunk,提升效率。flush()函数可以检测队列之前是否为空(目的是通知对端唤醒),flush()后就有数据可读了。CAS原子操作。原创 2022-09-23 15:32:09 · 896 阅读 · 0 评论 -
共享内存进阶指南:深入学习mmap和shm*的用法与技巧
共享内存,可以大大加快对文件或设备的读写操作。共享内存的方式有mmap和shmget 、 shmat。所谓的零拷贝,就是不需要CPU的参与,而不是其他的意思。mmap内部其实是一个DMA技术。原创 2022-09-19 11:31:59 · 1495 阅读 · 0 评论 -
Linux进程利用CPU亲和性最大化速度和效率
CPU亲缘性/粘合,是进程或线程只运行在所设置的CPU上,而不是CPU只运行设置的线程或进程。进程或线程创建的时候,其实是在内核中创建了一个task_struct数据结构,然后等待内核的任务调度器调度执行。原创 2022-09-18 21:21:25 · 1617 阅读 · 0 评论 -
Linux原子操作与锁实现
对临界资源操作时,常用原子操作和锁。锁有互斥锁、自旋锁、读写锁等,其他应用程序实现的业务锁如悲观锁、乐观锁等。在两种情况下容易陷入死锁:(1)线程调用两次lock,第一次已经获得锁,第二次发现锁已占用进入等待,而锁是被自己占用,进入无线等待的死锁。(2)多个线程多个锁的情况,线程1获得锁1然后请求锁2,线程2获得锁2然后请求锁1,互相等待,进入锁。原子操作就是通过一条指令解决问题,封装的CAS将多条执行命令变为一条执行命令,使其不可分割。原创 2022-09-18 17:43:31 · 1213 阅读 · 0 评论 -
Linux基础组件之内存池的实现
设计一个内存池,可以有效的避免内存碎片和避免频繁的内存创建‘释放。程序通常能管理的内存主要是堆和共享内存(mmap)。应用层所谓的内存管理,主要是对堆上的内存池进行管理。内存管理方式,使用比较多的是以2n2^n2n堆叠内存池以及大小块方式管理。nginx就是使用的大小块方式管理内存;原创 2022-09-17 10:36:39 · 1730 阅读 · 0 评论 -
连接池技术:简单而强大的加速数据库访问方法
数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中的连接进行申请、使用、归还。使用连接池主要是为了复用连接资源。连接池是被动的,由任务需要时取,用完之后归还;线程池是主动的,主动的从任务队列中取出任务并执行。连接池连接数量根据线程池数量设置。原创 2022-09-15 16:04:41 · 728 阅读 · 0 评论 -
Linux基础组件之线程池的实现
线程池,就是固定线程数量,复用线程不销毁。线程池是一种生产者–消费者模型,某类任务特别耗时,会严重影响该线程处理其他任务,因此需要线程池。线程池是面向生产者的,生产者使用线程。线程池最好至少设计两个队列,任务队列和完成队列。通常,线程池的线程调度使用互斥锁(mutex)和条件变量(condition)。但也不一定非得使用condition(条件变量),可以只有互斥锁,比如redis,主线程获取mutex,其他线程会一直阻塞着,巧妙的利用互斥锁使其他线程休眠。原创 2022-09-11 17:33:40 · 352 阅读 · 0 评论