<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Raizeroko的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Zero__two_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Zero__two_]]></copyright><item><title><![CDATA[【CPP】死锁产生、排查、避免]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/147340451</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/147340451</guid><author>Zero__two_</author><pubDate>Fri, 18 Apr 2025 21:08:45 +0800</pubDate><description><![CDATA[死锁是指两个或多个线程互相等待对方释放资源，导致程序无法继续执行的现象。在多线程编程中，死锁是一种常见且严重的并发问题。]]></description><category></category></item><item><title><![CDATA[【形象解析】ptmalloc、tcmalloc与jemalloc对比]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/147314857</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/147314857</guid><author>Zero__two_</author><pubDate>Thu, 17 Apr 2025 22:14:48 +0800</pubDate><description><![CDATA[对于ptmalloc，tcmalloc，jemalloc网上有很多解析，讲的很好也很仔细，但是想要彻底看懂还是很有难度的，我这篇文章主要以自己的理解并结合形象的举例对比三者的区别，相对于大部分文章我不会深入的探讨三者的具体结构，而是从接触新手的角度，通过对比三者的区别，以举例子让大家对这三个常见内存池有一个整体且直观的概念，其中有很多地方舍弃了结构设计的细节，只保留核心的申请释放过程，讲解相对来讲没有那么严谨，如有错误请在评论区指正。]]></description><category></category></item><item><title><![CDATA[【CPP】内存泄漏详解]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/147051901</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/147051901</guid><author>Zero__two_</author><pubDate>Mon, 07 Apr 2025 20:16:53 +0800</pubDate><description><![CDATA[内存泄漏通常会逐渐积累，导致程序占用过多的内存资源，最终可能引发程序崩溃、系统卡顿，甚至在长时间运行的系统中发生内存溢出。RAII（Resource Acquisition Is Initialization）是 C++ 中的一种资源管理模式，意味着资源（如内存、文件句柄、网络连接等）在对象的构造函数中分配，并且在析构函数中释放。如果在容器中存储指针类型数据而没有正确释放对象的内存，会导致内存泄漏。在 C++ 中，如果你为一个对象或数组动态分配了内存，但没有在适当的位置释放这些内存，就会导致内存泄漏。]]></description><category></category></item><item><title><![CDATA[【CPP】学习路线]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146447384</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146447384</guid><author>Zero__two_</author><pubDate>Sat, 22 Mar 2025 22:08:50 +0800</pubDate><description><![CDATA[C++ 学习路线]]></description><category></category></item><item><title><![CDATA[【Linux】高级IO]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080878</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080878</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:32:12 +0800</pubDate><description><![CDATA[它是 Unix-like 操作系统中非常重要的一个函数，提供了一些功能，如设置文件描述符的属性、修改文件状态、获取文件信息等。是计算机系统中两种常见的 I/O 模型，它们描述了应用程序如何与操作系统进行交互来执行 I/O 操作（如读取文件、网络通信等）。它允许一个程序监视多个文件描述符（如套接字、文件等），并在其中某些文件描述符准备好进行读写操作时，通知应用程序进行相应的处理。不同的I/O模型有不同的特点，适用于不同的应用场景。如果指定了超时时间，它将阻塞，直到一个文件描述符上的事件发生，或者超时。]]></description><category></category></item><item><title><![CDATA[【Linux】网络基础（网络层，数据链路层）]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080857</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080857</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:31:34 +0800</pubDate><description><![CDATA[当IP地址的主机部分（即子网部分）全部为0时，表示该IP地址是该网络的标识符，即。]]></description><category></category></item><item><title><![CDATA[【Linux】网络基础（应用层，传输层）]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080827</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080827</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:30:17 +0800</pubDate><description><![CDATA[假设最后一个。]]></description><category></category></item><item><title><![CDATA[【Linux】网络套接字]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080781</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080781</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:27:52 +0800</pubDate><description><![CDATA[是在后台运行的进程，它通常不与任何终端交互，并且在系统启动时或系统运行过程中自动启动。守护进程化（Daemonization）指的是将一个普通的进程转变为守护进程的过程。需要注意的是，这个返回值是一个静态缓冲区的指针，因此在多线程环境中使用时需要小心。的区分主要是通过进程的输入/输出交互方式来确定的，具体来说是基于终端控制和进程的执行方式。后台进程是指在系统后台运行的进程，它不会占用当前终端的输入输出流。是一个系统调用函数，用于创建一个新的套接字，用于在应用程序和操作系统的网络协议栈之间进行数据传输。]]></description><category></category></item><item><title><![CDATA[【Linux】线程控制]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080754</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080754</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:26:24 +0800</pubDate><description><![CDATA[生产者-消费者模型是多线程编程中的经典同步问题，它的目标是协调多个线程的操作，确保生产者和消费者之间的交互不会发生冲突。生产者：生产者线程负责产生数据，并将数据放入共享缓冲区或队列中。消费者：消费者线程负责从共享缓冲区或队列中取出数据并消费。缓冲区的大小是有限的，因此生产者和消费者之间需要协调：如果缓冲区已满，生产者需要等待；如果缓冲区为空，消费者需要等待。]]></description><category></category></item><item><title><![CDATA[【Linux】进程信号]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080731</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080731</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:25:35 +0800</pubDate><description><![CDATA[信号是 Linux 操作系统提供的一种轻量级、异步的进程间通信机制，用于通知进程某些事件的发生统一机制：进程自动继承信号机制：操作系统通过系统调用（如 、）和库函数（如 、），暴露信号管理的接口。进程可以通过这些接口查询、屏蔽、修改或触发信号。异步性：信号可以在任意时刻产生，与进程当前执行的代码无关。统一性：所有进程共享统一的信号处理机制，无需单独实现。轻量性：相比消息队列、管道等通信方式，信号更加高效。 是每个进程的核心数据结构，包含了描述进程状态的所有信息。]]></description><category></category></item><item><title><![CDATA[【Linux】进程通信]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080694</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080694</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:24:18 +0800</pubDate><description><![CDATA[共享内存的主要特点是高效、直接、低开销的进程间数据共享，但同时它也带来了进程间同步和安全性的问题，要求合理的同步机制来避免数据冲突和不一致。尽管管道的核心是内存缓冲区，但操作系统通过对管道的实现，让它看起来像文件一样可以用文件操作接口（如。生成对应对的唯一标识符，然后交给操作系统，操作系统统一维护共享内存段，返回给我他维护下的。当读取管道时，如果管道缓冲区中没有数据，读取的进程会阻塞，直到有数据写入为止。，来确保访问共享内存的进程之间的协调，避免同时修改同一数据而导致的不一致。，用于在进程之间传递数据。]]></description><category></category></item><item><title><![CDATA[【Linux】文件]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080669</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080669</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:23:00 +0800</pubDate><description><![CDATA[在获取到相应的文件数据块后，操作系统会将文件的内容加载到物理内存中的一个页框（page frame）。的指针，而它当中又存有调用该文件读写时对应的读写函数指针，此时只要将该函数指针指向驱动提供的读方法和写方法，操作系统不需要知道具体是如何读写的，但由于接口的统一，它只需要调用就能完成外设的控制。当文件被映射到虚拟内存后，文件的内容并不是立即加载到内存中的，而是在进程访问文件内容时，操作系统根据需要将文件的相关部分加载到内存。文件的物理数据存储在磁盘的块中，这些块由文件系统（如 ext4 等）管理。]]></description><category></category></item><item><title><![CDATA[【Linux】进程控制]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080419</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080419</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:11:49 +0800</pubDate><description><![CDATA[在 Linux 系统中，创建进程通常通过fork()系统调用实现。fork()会创建一个新的进程，称为子进程，它与父进程共享几乎所有的资源（如文件描述符、环境变量等），但具有独立的地址空间。子进程最初的内容是父进程的精确副本。]]></description><category></category></item><item><title><![CDATA[【Linux】进程]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146080376</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146080376</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:10:45 +0800</pubDate><description><![CDATA[进程被操作系统或用户主动暂停执行，可以是由于系统资源紧张或人为干预。]]></description><category></category></item><item><title><![CDATA[【Linux】工具]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/146053164</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/146053164</guid><author>Zero__two_</author><pubDate>Thu, 06 Mar 2025 21:08:47 +0800</pubDate><description><![CDATA[宏替换条件编译头文件展开去注释。]]></description><category></category></item><item><title><![CDATA[【学习笔记】二叉树（c语言）]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/122432444</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/122432444</guid><author>Zero__two_</author><pubDate>Tue, 11 Jan 2022 15:18:56 +0800</pubDate><description><![CDATA[1.树

1.1树的性质

树是一种非线性的数据结构，他是由n（n &gt;= 0）个有限结点组成一个具有层次关系的集合。把他叫做树是因为他看起来向一颗倒挂的树，也就是说他是根在上，叶在下的。

1.2树的相关概念

节点的度：一个节点含有的子树的个数称为该节点的度； 如上图：A的为6

叶节点或终端节点：度为0的节点称为叶节点； 如上图：B、C、H、I...等节点为叶节点

非终端节点或分支节点：度不为0的节点； 如上图：D、E、F、G...等节点为分支节点

双亲节点或父节点：若一个节点含有子节点，则这]]></description><category></category></item><item><title><![CDATA[【学习笔记】堆（c语言）]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/122409896</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/122409896</guid><author>Zero__two_</author><pubDate>Mon, 10 Jan 2022 17:35:25 +0800</pubDate><description><![CDATA[1.堆的概念

堆（heap）是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。

我们抛去表面看本质：堆就是一种特殊的数组，但在想象中是二叉树的结构，且该二叉树的mei。



2.堆的分类

2.1大根堆

堆中某个结点的值总是不大于其父结点的值

图：

2.2小根堆

堆中某个结点的值总是不小于其父结点的值

图：

3.堆的性质



	堆中某个结点的值总是不大于或不小于其父结点的值；
	
	
	堆总是一棵完全二叉树。
	


4.将数组建成堆

前面说过堆就是一种特]]></description><category></category></item><item><title><![CDATA[【学习笔记】双向带头循环链表（c语言）]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/121040892</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/121040892</guid><author>Zero__two_</author><pubDate>Fri, 29 Oct 2021 19:46:32 +0800</pubDate><description><![CDATA[1.链表分类

链表的结构多种多样有三个大分类：

1.单向、双向

2.带头、不带头

3.循环、不循环

而三组之间又可以互相组合，使得链表的结构多达8种，本篇的单链表主要是指单向不带头不循环链表，这也是本篇的重点。

1.1单向链表

单向链表：指链表的链接方向是单向的，对链表的访问要通过顺序读取从头部开始，只能通过前一个结点找到后一结点，而不能从后一结点找到前一结点。

1.2双向链表

双向链表：指链表的每个数据中结点都有两个指针，分别指向直接后继和直接前驱，它能从双向链表中的任意一个结点开始，并]]></description><category></category></item><item><title><![CDATA[【详解】指针与函数传参——多图、多例子（c语言）]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/120922718</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/120922718</guid><author>Zero__two_</author><pubDate>Thu, 28 Oct 2021 12:15:16 +0800</pubDate><description><![CDATA[前言

在用c语言实现链表时，会有很多朋友无法理解明明传了指针到函数中，函数中对指针改变却无法影响原函数中指针的位置，事实上，这是因为你对形参和实参的关系理解还不够透彻。通过这篇文章，我将告诉你指针传参时，函数的形参到底该选择怎样的类型接收。

1.函数的实参与形参

实际参数（实参）


真实传给函数的参数叫实参。

实参可以是常量、变量、指针甚至函数等。

无论实参是何种类型的量，在进行函数调用时，他们都必须有确定的值，一边把这些值传给形参。


形式参数（形参）


形式参数时至函数名后括号中的变量，]]></description><category></category></item><item><title><![CDATA[【学习笔记】栈（c语言）]]></title><link>https://blog.youkuaiyun.com/Zero__two_/article/details/120921757</link><guid>https://blog.youkuaiyun.com/Zero__two_/article/details/120921757</guid><author>Zero__two_</author><pubDate>Sat, 23 Oct 2021 16:10:36 +0800</pubDate><description><![CDATA[1.栈的概念

栈：一种特殊的线性表，其只允许再固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶，另一端成为栈底。栈中的数据元素遵循后进先出LIFO(Last In First Out)的原则。

压栈（push）：栈的插入操作叫做进栈/压栈/入栈，入栈数据在栈顶。



出栈（pop）：栈的删除操作叫做出栈。出数据也在栈顶。

2.栈实现

2.1栈结构


typedef int StackDataType;
typedef struct Stack
{
	StackDataTy.]]></description><category></category></item></channel></rss>