自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于二叉树的一些算法题

这篇文章总结了二叉树相关的几个算法题解,包括从前序/中序、后序/中序遍历序列构造二叉树的方法,以及二叉树的层序遍历实现。关键点包括:1)利用前序或后序遍历确定根节点,结合中序遍历分割左右子树;2)递归构造时注意顺序,前序构造先左后右,后序构造先右后左;3)层序遍历使用队列记录每层节点数。时间复杂度均为O(n),空间复杂度O(n)。文章提供了清晰的代码实现和详细的逻辑分析。

2025-10-22 15:48:56 1003

原创 关于栈的一些算法题

本文介绍了6个与栈相关的算法题,包括有效的括号、最小栈、用队列实现栈、滑动窗口最大值、接雨水II和反转括号间子串。重点解析了滑动窗口最大值问题的优先队列解法(时间复杂度O(nlogn))和二维接雨水问题的堆+BFS解法(时间复杂度O(mnlog(mn)))。文章提供了清晰的解题思路和C++代码实现,涵盖了栈在数据结构中的典型应用场景和优化技巧。

2025-10-22 15:47:27 636

原创 自定义网络协议与序列化/反序列化

本文介绍了TCP通信中的字节流边界问题及其解决方案。首先解释了TCP协议无法保证应用层报文完整性的缺陷,导致可能出现数据粘包或半包问题。然后阐述了自定义应用层协议的必要性,通过制定数据格式和字段含义的约定,使通信双方能正确解析数据。接着详细讲解了序列化和反序列化的核心概念,即如何将结构化数据转换为字节流进行传输。最后通过一个网络计算器的实例,展示了如何设计协议结构、实现序列化/反序列化方法,并采用"长度头+分隔符"的方法解决报文完整性问题。整个方案从理论到实践,提供了可运行的代码实现参考

2025-10-13 16:20:19 946

原创 TCP协议详解

本文详细介绍了TCP协议的核心特性与编程实现。主要内容包括:TCP面向连接、可靠传输等核心特性;TCP服务器的构建步骤(创建套接字、绑定地址、设置监听);监听套接字与通信套接字的分工机制;以及实现回显服务的具体代码示例。文章通过餐馆比喻形象解释概念,并强调TCP字节流特性与网络编程要点,适合网络编程初学者系统学习TCP协议。

2025-10-13 16:13:40 610

原创 从零开始实现一个高并发内存池_DayThree:内存池整体框架与ThreadCache、TLS无锁访问

本文介绍了一个高并发内存池的设计,主要解决性能、锁竞争和内存碎片问题。内存池由三个核心组件构成: ThreadCache:线程独享的无锁缓存,处理小于256KB的内存分配请求,采用TLS技术实现高效访问。 CentralCache:共享的中心缓存,为ThreadCache提供内存块,使用桶锁减少竞争,平衡各线程内存使用。 PageCache:以页为单位的顶级缓存,负责内存合并与碎片整理,当CentralCache不足时提供内存页。 代码实现包含内存对齐计算、自由链表管理、系统内存分配接口等核心功能,通过分层

2025-10-07 21:13:45 963

原创 UDP协议详解

UDP协议是一种无连接、面向数据报的轻量级传输协议,具有开销小、速度快的特点,适用于实时性要求高的场景(如语音通话、视频传输)。服务器开发流程包括创建套接字和绑定地址两个关键步骤,其中绑定地址时需特别注意网络字节序转换和0.0.0.0地址的使用。UDP通信使用recvfrom和sendto函数进行数据收发,能获取客户端地址信息实现消息回显。端口使用需遵循规范,服务器需绑定固定端口,而客户端端口由系统自动分配。

2025-10-06 21:44:43 1113

原创 C++模板编程解析

普通类可分.h(声明)和.cpp(定义),但类模板不行——分离会导致链接错误(编译时编译器看不到定义,无法生成实例化代码)。解决方案:将声明和定义都放在头文件(或.hpp文件)中。模块核心内容模板本质编译期代码生成规则,无运行时开销函数模板template <class T> 函数;实例化:隐式推导/显式指定;歧义:统一类型/显式指定类模板必须显式实例化;声明定义放头文件;类名≠类型typename嵌套依赖类型前必加,解决类型歧义非类型参数编译期常量、仅支持整形;例:固定大小栈。

2025-10-06 15:30:38 637

原创 从零开始实现一个高并发内存池_DayTwo:认识内存池,学习定长内存池

内存池技术详解:文章首先介绍了内存池的基本概念,它是一种预先分配大块内存并在程序运行中重复使用的技术,属于池化技术的一种。重点分析了内存池解决的两大核心问题:频繁分配释放小内存导致的性能问题和内存碎片问题。通过实现一个定长内存池,展示了其高效分配机制,包括空闲链表管理、批量内存申请和定位new初始化。测试表明内存池性能比传统new/delete快5-10倍。最后指出定长内存池的局限性,如只支持固定大小、存在内碎片等,为后续实现更通用的内存池奠定基础。

2025-09-27 21:27:49 936

原创 从零开始实现一个高并发内存池_DayOne:认识tcmalloc

TCMalloc核心优势摘要:Google开发的TCMalloc采用三级分层架构(线程缓存/中央池/物理页)优化多线程内存管理。其核心优势包括:1)线程本地缓存减少锁竞争,小内存(≤256KB)分配速度比glibc malloc快2-5倍;2)细粒度分类管理(86种size class)降低内存碎片至12.5%以下;3)延迟回收机制减少OS交互开销;4)RadixTree优化大内存分配效率。特别适合MySQL等高并发场景,但需注意线程缓存内存占用增加10-20%的代价。

2025-09-27 19:18:47 634

原创 初识网络:网络基础

网络基础涵盖其本质、发展历程与协议体系。网络的核心价值在于数据协作与传输,从单机时代逐步演进为全球互联网,依赖硬件设施与政策支持。协议作为通信的“共同语言”,通过结构体与报头实现标准化交互,解决定位、传输与解析问题。网络分层(如TCP/IP四层模型)通过“高内聚、低耦合”设计,将复杂功能拆解至物理层、数据链路层、网络层和传输层,各司其职,确保高效通信。我国在5G等领域的技术领先体现了基础设施投入的重要性。

2025-09-26 17:15:22 867

原创 红黑树(RBTree)详解和模拟实现

红黑树是一种近似平衡的二叉搜索树,通过颜色规则和旋转操作维持平衡。相比AVL树的严格平衡,红黑树采用"最长路径不超过最短路径两倍"的妥协策略,大幅减少了插入删除时的旋转次数。核心规则包括:节点非红即黑、根节点为黑、无连续红节点、路径黑节点数相同。插入时默认新节点为红色,通过"看叔叔颜色"决定调整策略——叔叔红色则变色向上传递,叔叔黑色则旋转调整。虽然红黑树查找效率略低于AVL树,但维护成本更低,因此成为Java、C++等主流语言容器的首选实现。工程实践中,CPU运算速

2025-09-25 14:04:07 1154

原创 AVL树详解和模拟实现

AVL树是一种高度平衡的二叉搜索树,通过平衡因子(BF=右子树高-左子树高)确保任意节点BF∈[-1,1]。插入节点后需回溯维护平衡:若BF=±2则通过旋转修复。单旋处理直线型失衡(左/右单旋),双旋解决折线型失衡(先子节点旋转再父节点旋转)。关键实现包括节点结构(含父指针和BF)、高度计算及四种旋转操作。AVL树通过主动平衡将所有操作稳定在O(log n),避免BST退化为链表的情况。

2025-09-25 13:49:33 854

原创 STL库string的使用和模拟实现

本文介绍了C++ STL中string容器的使用方法和模拟实现。主要内容包括:1. string常用接口的使用,涵盖构造初始化、赋值拼接、遍历访问、修改删除、查找比较等操作;2. string的模拟实现,讲解简易版string类的设计思路和关键代码。文章通过丰富的代码示例演示了各种接口的用法,并指出使用时的注意事项,如越界检查、迭代器失效等。最后还介绍了string在实际开发中的典型应用场景,帮助读者全面掌握这一基础容器。

2025-09-23 10:18:54 999

原创 线程安全的单例模式、自旋锁,以及读者写者问题

本文介绍了多线程编程中的三个核心概念:线程安全的单例模式、自旋锁和读者写者问题。单例模式分为饿汉模式(提前创建)和懒汉模式(延迟加载),后者需通过双重检查锁定解决线程安全问题。自旋锁适用于极短临界区场景,通过循环检测代替线程挂起。读者写者模型区分读写操作,支持读读共享但需保证读写互斥,可通过读写锁实现并解决写者饥饿问题。这些技术都体现了多线程编程中平衡安全与效率的核心思想。

2025-09-21 23:36:58 815

原创 Linux系统多线程总结

本文总结了Linux系统多线程编程的核心要点,重点介绍了环形队列与信号量的高效同步实现方法。通过环形队列的数组模拟和信号量的计数器机制,简化了生产者和消费者之间的同步逻辑。文章详细讲解了环形队列的判空判满策略,并给出了基于vector的C++实现代码示例,展示了如何利用信号量管理资源状态。最后通过单生产单消费的测试案例,验证了环形队列在多线程环境下的同步效果,为高并发场景提供了性能优化的解决方案。

2025-09-19 22:50:32 958

原创 Linux系统多线程的同步问题

本文深入探讨了Linux多线程编程中的同步问题,重点分析了死锁和条件变量两大核心概念。文章首先通过生活化比喻解释了死锁的四个必要条件(互斥、请求与保持、不剥夺、循环等待),并给出破坏这些条件的解决方案,特别是固定资源申请顺序的方法。然后详细介绍了条件变量的工作机制,说明其如何通过"等待-唤醒"机制实现线程同步,并与互斥锁配合使用。文章还提供了实际的代码示例,展示如何正确使用pthread库中的条件变量接口(初始化、等待、唤醒、销毁)。最后通过消费者-生产者模型等案例,帮助读者理解同步机制

2025-09-19 22:27:55 912

原创 Linux系统多线程的互斥问题

本文探讨了Linux多线程编程中的互斥问题。通过模拟多线程抢票场景,展示了多个线程并发访问共享变量时可能出现的数据不一致问题,如票数超卖和负数票等异常情况。文章深入分析了问题根源在于线程切换和非原子操作导致的数据竞争,并介绍了Linux互斥锁(pthread_mutex_t)的基本原理和核心接口,包括初始化、加锁、解锁和销毁操作。最后提出了通过互斥机制保证同一时间只有一个线程访问共享资源的解决方案。

2025-09-19 21:56:47 767

原创 C++强制类型转换和I/O流深度解析

本文深入解析C++中的强制类型转换和I/O流两大核心知识点。强制类型转换部分详细介绍了四种显式转换:static_cast用于相近类型的安全转换;reinterpret_cast处理不相关类型的冒险转换;const_cast专门处理const属性操作;dynamic_cast实现多态场景下的安全向下转换,具备运行时类型检查功能。文章通过典型代码示例,剖析了每种转换的使用场景、安全性和潜在风险,强调在不同场景下应选择合适的转换方式,避免滥用导致程序错误。

2025-09-19 21:30:44 894

原创 Linux:线程控制详解

Linux线程控制详解摘要: 本文深入解析Linux线程机制,从概念到实践全面剖析线程控制。主要内容包括: 线程本质:Linux通过轻量级进程(LWP)实现线程,线程共享进程资源但拥有独立栈结构,相比进程更轻量高效。 核心区别:进程是资源分配单位,线程是CPU调度单位。实验中通过ps -L和top -H命令可观察线程的LWP表现。 线程创建:详细解析pthread_create函数参数,包括线程ID本质是线程控制块(TCB)地址而非LWP ID。通过实验对比验证线程ID与LWP ID的区别。 多线程管理:演

2025-09-12 13:37:54 798

原创 Linux:线程概念详解

本文深入解析了Linux系统中的线程概念及其实现机制。文章首先通过进程切换的开销问题引出线程的必要性,指出线程是比进程更轻量的执行流。核心观点包括:1)线程是操作系统调度的基本单位,而进程承担资源分配的角色;2)Linux采用复用PCB的独特设计实现线程,避免了TCB的冗余;3)线程必须在进程地址空间内运行,通过共享页表访问资源。作者以32位系统为例详细讲解了虚拟地址到物理地址的映射过程,解释了两级页表的设计优势。全文通过生活化类比和计算示例,生动展现了Linux线程设计的卓越智慧。

2025-09-10 20:13:12 695

原创 面向对象(C++):封装、继承与多态

本文介绍了面向对象编程(OOP)的三大核心特性:封装、继承与多态。 封装:通过访问限定符(public/private/protected)控制数据访问权限,保护数据安全。建议将成员变量设为private,通过public方法提供访问接口,从而控制数据合法性、隐藏实现细节并便于调试。 继承:通过继承实现代码复用,子类(派生类)可以继承父类(基类)的成员并扩展特有功能。继承的关键是合理设计父类,抽取出子类共有的属性和方法。 多态:通过虚函数实现同一接口的不同行为表现,使派生类能够重写基类方法(文中后续会详细讲

2025-09-04 13:09:46 864

原创 Linux:信号详解--醍醐灌顶

Linux信号机制详解:从键盘组合键到系统调用的全面解析 摘要: 本文深入探讨Linux系统中的信号机制,厘清了信号与信号量的本质区别。文章通过生活化类比(如外卖通知类比信号异步性)形象解释信号的"产生-保存-处理"生命周期。重点剖析了5种信号产生方式:键盘组合键(Ctrl+C触发SIGINT)、kill命令(支持64种信号)、系统调用(kill()/raise()/abort())、硬件异常(如除零错误触发SIGFPE)以及软件条件(如定时器触发SIGALRM)。通过my_signal

2025-08-28 16:36:48 728

原创 Linux:进程间通信(IPC)-SystemV

本文介绍了Linux中SystemV进程间通信(IPC)机制,重点讲解了共享内存的原理与实现。共享内存通过映射同一块物理内存到不同进程的地址空间,实现高效通信,避免了数据拷贝开销。文章详细说明了共享内存的创建过程:首先使用ftok()生成唯一key作为标识,然后通过shmget()系统调用创建/获取共享内存,返回操作句柄shmid。关键点包括:key的生成原理、内存大小建议设为4KB整数倍、权限标志设置等。相比管道通信,共享内存省去了内核缓冲区的数据拷贝,是最高效的IPC方式。

2025-08-23 13:18:58 900

原创 Linux:进程间通信-管道

本文介绍了Linux进程间通信(IPC)的基本概念和管道实现。IPC是进程协同工作的基础,操作系统通过共享资源管理实现进程间数据传输。重点讲解了最古老的IPC方式——管道,它通过内存缓冲区模拟单向通信,常用于父子进程间数据交换。文章详细阐述了管道的实现原理、代码示例和五大特性:单向性、血缘关系限制、字节流传输、自带同步机制和随进程生命周期。理解管道机制有助于掌握更复杂的IPC方式。

2025-08-21 20:34:27 749

原创 Linux:动静态库全面分析

本文全面介绍了Linux下的动静态库,从制作到使用详细解析了两者的区别。静态库(.a)在编译时被拷贝到可执行文件,而动态库(.so)在运行时加载,支持多程序共享。文章通过数学库实例演示了如何制作静态库(使用ar命令)和动态库(需要-fPIC选项),并解释了动态库必须使用位置无关代码的原理。最后针对动态库运行时加载问题,提供了四种解决方案,包括修改环境变量、系统配置等方法。通过本文,读者可以深入理解Linux库的工作机制和实际应用场景。

2025-08-18 15:37:23 790

原创 Linux:文件补充

本文深入解析Linux文件系统的核心机制:文件通过inode和数据块存储,目录是文件名与inode的映射关系;对比硬链接(共享inode)和软链接(独立inode)的特性与适用场景;揭示内存以4KB页框管理,通过radix树维护文件缓冲区的底层原理;详细阐述从文件打开、数据写入到磁盘刷新的完整流程。这些知识帮助理解Linux如何高效管理文件存储与访问。

2025-08-17 15:03:13 894

原创 Linux:文件系统与inode、软硬链接

摘要: Linux文件系统通过inode和软硬链接机制高效管理文件。磁盘被划分为扇区,文件系统将其组织为块组,包含超级块、inode表和数据块等结构。每个文件对应唯一的inode,记录文件属性和数据块指针。目录是特殊文件,存储文件名到inode的映射。硬链接是同一inode的多个名称,共享数据但不可跨分区;软链接是独立文件,存储目标路径可跨分区。文件操作如创建、删除只需修改元数据,删除文件仅标记空间空闲而非清空数据。这种设计实现了高效的文件管理和快速访问。

2025-08-13 18:02:58 998

原创 Linux:用户缓冲区

本文深入剖析了Linux中的用户缓冲区机制。首先从文件描述符入手,解释其作为用户空间与内核空间交互桥梁的作用,以及重定向的实现原理。随后重点分析了用户缓冲区的设计目的——通过减少系统调用次数提升I/O性能,并通过实验对比展示带缓冲的库函数(fwrite)比直接系统调用(write)效率高10倍以上。文章详细介绍了三种缓冲区刷新策略:无缓冲(如stderr)、行缓冲(stdout)和全缓冲(文件操作),以及手动刷新(fflush)和进程退出等特殊触发时机。最后指出用户缓冲区采用"空间换时间&quot

2025-08-11 20:11:50 703

原创 Linux:重定向

本文深入解析Linux文件系统的核心机制,包括文件描述符、重定向原理及C标准库与系统调用的关系。文件描述符本质是进程文件描述符表的下标,默认0-2对应标准输入、输出和错误。重定向通过修改描述符指针实现:输出重定向(>)用O_TRUNC覆盖文件,追加重定向(>>)用O_APPEND续写,输入重定向(<)改变数据来源。C标准库函数(如fopen)是对系统调用(如open)的封装,加入缓冲区管理等功能。理解这些底层机制对开发高效程序、编写Shell工具等具有重要意义。

2025-08-08 15:34:21 1048

原创 Linux:文件

操作系统文件管理探析:从基础概念到底层实现 文件管理是操作系统的核心功能,负责协调用户程序、内存与硬件间的数据交互。本文系统剖析了文件管理的两大状态:未打开文件和打开文件。未打开文件通过inode机制实现高效存储与检索,包含内容与属性的双重管理;打开文件则涉及进程与操作系统的动态交互,通过文件描述符和文件对象实现多进程共享访问。文章还阐释了文件系统结构、路径寻址原理、以及库函数与系统调用的层次关系,揭示了日常文件操作背后的复杂机制。理解这些原理有助于优化程序设计,提升对系统资源的管理能力。

2025-08-08 15:13:16 1099

原创 Linux:进程替换与Shell实现、进程总结

进程替换、shell实现和进程总结

2025-08-03 18:57:39 915

原创 Linux:进程等待

进程等待机制解析 进程等待是操作系统管理进程生命周期的重要机制,主要解决三个核心问题: 僵尸进程回收 - 通过wait/waitpid系统调用回收已终止子进程的PCB资源,避免内存泄漏 执行结果获取 - 父进程可获取子进程的退出状态(正常退出码或异常信号) 资源有序释放 - 确保子进程资源在父进程确认后彻底释放 关键系统调用对比: wait():阻塞等待任意子进程退出,简单但灵活性不足 waitpid():支持指定子进程PID和非阻塞模式(WNOHANG),适用于多进程场景 开发建议:生产环境优先使用wai

2025-07-31 19:52:42 891

原创 Linux:进程管理

摘要: 进程管理是操作系统的核心,通过虚拟地址空间实现内存隔离与共享。每个进程拥有独立的虚拟地址空间(含代码区、数据区、堆栈等),由页表映射到物理内存。写时拷贝(Copy-On-Write)机制在fork创建子进程时,延迟复制内存数据,仅当修改时才分配新物理页,兼顾进程独立性与内存效率。父子进程初始共享代码区(只读)和未修改数据区,修改时触发缺页中断复制数据,确保隔离性。虚拟地址空间通过多级页表转换物理地址,减少内存开销,同时保护内核空间。这一设计使进程既独享资源,又能高效共享只读数据,是操作系统高效稳定运

2025-07-29 21:13:27 706

原创 Linux:进程地址空间

本文深入解析了进程地址空间的工作原理与实现机制。32位系统中,虚拟地址空间严格划分为用户空间(低3GB)和内核空间(高1GB),通过页表实现虚拟到物理地址的转换。系统采用写时拷贝技术(COW)高效处理父子进程内存共享,仅在写入时复制物理页。文章详细剖析了虚拟地址空间的布局结构(代码区、数据区、堆、栈等),并通过实验验证其分布规律。同时阐述了环境变量继承的页表映射机制、进程切换时的页表更新(CR3寄存器),以及页表标记位实现的内存保护功能。这些机制共同构成了现代操作系统内存管理的核心基础。

2025-07-29 20:37:57 837

原创 Linux:初识进程

冯·诺依曼体系结构是现代计算机的基础,它将程序指令存储器和数据存储器合并,明确了计算机的架构,包括输入输出设备、存储器和CPU。操作系统作为管理软件,负责协调硬件和软件资源,提供系统调用接口,确保系统稳定、安全、高效运行。进程是程序在内存中的运行实例,是资源分配的基本单位,操作系统通过进程控制块(PCB)管理进程。Linux系统中的进程状态包括运行、可中断睡眠、不可中断睡眠、跟踪、停止和僵尸状态。创建进程通常使用fork()函数,它创建子进程并允许父子进程执行不同的代码块。

2025-05-09 17:13:35 911

原创 算法+数据结构:二叉树-层序遍历

用队列实现。

2025-01-21 19:29:30 199

原创 算法+数据结构:二叉树(C)

1、从以上问题不难看出二叉树的问题对递归的要求比较高,大量使用递归,这要求熟练掌握递归,理解递归本质(多画递归展开图);2、二叉树的递归问题都有一个解题思路是:先解决根的问题(空指针)、再用递归解决左右子树的问题。

2025-01-03 20:35:10 743

原创 算法+数据结构:约瑟夫问题

(Josephus problem)是一个经典的数学问题,通常描述如下:有n个人围成一圈,从第一个人开始报数,每数到第m个人就将其移出圈子,然后从被移出的人的下一个人开始继续报数,直到最后只剩一个人为止。

2024-12-22 16:49:54 561

原创 算法+数据结构:顺序表练习

比较数组值的大小与数组值的大小,较小的值赋值给临时数组这里cur1位置的值小于cur2位置的值,故辅助数组cur位置变为1,

2024-12-19 23:32:09 446

原创 算法+数据结构:链表和快慢指针的应用

寻找链表中间节点;寻找倒数第K个节点;快慢指针

2024-11-09 18:56:29 704

空空如也

空空如也

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

TA关注的人

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