自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 30 天自制 C++ 服务器--Day3

的核心原理在于改变事件通知模型:它通过在内核使用红黑树高效管理注册的文件描述符,利用回调函数在事件发生时直接将就绪项放入链表,并通过 epoll_wait 仅返回实际就绪的事件列表,辅以 mmap 减少数据拷贝。IO复用的基本思想是事件驱动,服务器同时保持多个客户端IO连接,当这个IO上有可读或可写事件发生时,表示这个IO对应的客户端在请求服务器的某项服务,此时服务器响应该服务。epoll监听事件的描述符会放在一颗红黑树上,我们将要监听的IO口放入epoll红黑树中,就可以监听该IO上的事件。

2025-07-16 15:02:04 1219

原创 effective c++---别让异常逃离析构函数

在C++中,从析构函数抛出未捕获的异常会导致程序崩溃(直接调用std::terminate)。// ❌ 致命错误!std::fstream:析构调用close(),但关闭错误仅设置failbit,不抛出。file.close()) { // 假设close()可能抛出异常。void close() { // 用户主动调用,可处理异常。// 必须确保close()不抛出。// 若析构函数抛出异常,程序直接终止,无法到达这里。提供close()/release()等方法。// 可安全抛出(但通常仍不建议)

2025-07-14 16:50:01 241

原创 30 天自制 C++ 服务器--Day2

然而对于socket,bind,listen,accept,connect等函数,我们都设想程序完美地、没有任何异常地运行,而这显然是不可能的,不管写代码水平多高,就算你是林纳斯,也会在程序里写出bug。,这个函数会打印出errno的实际意义,还会打印出我们传入的字符串,也就是第函数第二个参数,让我们很方便定位到程序出现错误的地方。到现在最简单的错误处理函数已经封装好了,但这仅仅用于本教程的开发,在真实的服务器开发中,错误绝不是一个如此简单的话题。通常来讲,当一个系统调用返回-1,说明有error发生。

2025-07-14 16:34:28 130

原创 Effective C++之定义式和声明式

定义式的作用是为编译器提供声明式(declaration)所缺失的详细信息,使得编译器能够正确生成代码或分配内存。定义式(Definition):提供声明所缺失的细节,使得编译器可以实际使用该名称(分配内存、生成代码等)。std::size_t numDigits(int number) { // 定义式:提供函数体。声明式仅告诉编译器“这是什么”,而定义式告诉编译器“这是什么以及如何实现/分配”。// 定义式:编译器为 x 分配内存。class Widget { // 定义式:列出类的成员。

2025-07-14 10:46:55 250

原创 30 天自制 C++ 服务器--Day1

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具。socket是什么?

2025-07-11 15:42:04 590

原创 timewait和msl介绍

修改内核参数(如 net.ipv4.tcp_tw_reuse、net.ipv4.tcp_tw_recycle,但后者在 Linux 4.12 后已移除)。此时连接并未立即关闭,而是会等待一段时间(通常是 2×MSL)后才彻底释放资源(如端口、内存等)。MSL 是报文的最大生存时间,TIME_WAIT 的持续时间(2×MSL)由它决定。避免旧连接的延迟报文干扰新连接:防止网络中延迟的旧数据包被误认为是新连接的数据。是 TIME_WAIT 计算的基础(TIME_WAIT = 2×MSL)。

2025-07-09 14:45:58 275

原创 ffmpeg的安装

https://blog.csdn.net/Natsuago/article/details/143231558

2025-07-07 17:07:08 334

原创 poll的介绍

poll 是 Linux/Unix 系统中用于 多路复用 I/O 操作 的系统调用,允许程序同时监听多个文件描述符(File Descriptor, FD)的状态变化(如可读、可写、错误等)。水平触发(LT):就绪事件需及时处理,否则会重复通知(对比 epoll 的 ET 模式)。-1 出错(如被信号中断),可通过 errno 获取错误码(如 EINTR)。事件驱动:当任一被监听的 FD 就绪(如数据可读、可写)时,立即返回。效率 高(无需每次重置 FD 集合) 低(需每次重建 fd_set)

2025-07-07 17:05:09 850

原创 #if 0介绍

在C/C++中,#if 0 是一种条件编译指令,其作用是临时或永久禁用一段代码,使其不会被编译器处理(相当于“注释掉”代码)。多行注释 /* */ 不能嵌套,而 #if 0 可以嵌套禁用包含注释的代码。#if 0 是代码的“开关”:比注释更灵活,适合临时禁用大段代码或条件编译。必须配对:#if 0 必须有对应的 #endif,否则编译报错。printf(“这段代码不会编译”);若需恢复代码,只需将 #if 0 改为 #if 1。#if 0 可以保留代码语法高亮,方便后续恢复。#if 0 直接禁用代码。

2025-07-07 10:27:01 242

原创 隧道(Tunneling)的核心用途

隧道技术通过封装和传输数据,在不同网络之间建立一条逻辑通道,主要解决以下问题:

2025-07-04 15:36:30 169

原创 VRRP(Virtual Router Redundancy Protocol)详解

VRRP(虚拟路由器冗余协议)是一种网络容错协议,用于在多台路由器之间实现网关冗余,确保当主路由器故障时,备份路由器能无缝接管流量,从而保障网络的高可用性。它通过虚拟IP(VIP)和虚拟MAC地址实现透明切换,对终端设备无感知。厂商文档:华为《VRRP配置指南》、思科《HSRP vs VRRP》

2025-07-04 15:14:05 130

原创 粘包问题介绍

粘包问题是 基于流的传输协议(如TCP) 中的一种常见现象,指的是发送方连续发送的多个数据包,在接收方缓冲区中被合并成一个“大包”,导致接收方无法正确解析原始数据包的边界。缓冲区机制:为提高效率,TCP 可能合并多次发送的小数据包(Nagle算法)。接收方:可能一次性读取到 包A+包B(粘包),或分多次读取(半包)。发送方:快速连续发送多个小包(如 包A + 包B)。用特殊字符标记包结束(如 \r\n、0x00)。解决方案:长度字段(推荐)、分隔符、固定长度。在包头添加长度字段,明确告知接收方包体大小。

2025-07-03 17:40:31 480

原创 wireshark介绍和使用

Follow TCP Stream(右键数据包 → Follow → TCP Stream):查看完整会话(如 HTTP 请求/响应)。点击数据包:查看协议层级(如 Ethernet → IP → TCP → HTTP)。Statistics → Conversations:查看通信对端(IP/端口)。示例脚本目录:/usr/share/wireshark/plugins/官网:https://www.wireshark.org/基础流程:选择网卡 → 抓包 → 过滤 → 分析。

2025-07-03 17:29:56 516

原创 DPDK介绍与使用

首先确保您已经按照前面的指南安装并配置好了 DPDK 环境。学习 rte_ring、rte_mbuf 等核心数据结构。3.2 filter.c - 过滤器实现。3.3 main.c - 主程序。3.2 下载并编译 DPDK。3.4 绑定网卡到 DPDK。3. DPDK 安装与配置。根据自定义规则过滤数据包。3.3 配置大页内存。

2025-07-03 17:23:02 231

原创 mailbox 核间通信

Mailbox(邮箱) 是一种常见的核间通信(Inter-Processor Communication, IPC)机制,主要用于多核处理器(如ARM多核SoC、FPGA+CPU异构系统)或主从处理器(如MCU与DSP、CPU与GPU)之间的数据交换。Mailbox 是一种高效、低延迟的核间通信方式,适用于多核/异构系统的实时数据交换。在嵌入式Linux、RTOS及SoC设计中广泛应用,需结合硬件特性和软件框架灵活使用。

2025-07-01 16:48:28 639

原创 缓冲区(Buffer)介绍与实现

环形缓冲区是高效的数据缓存方案,尤其适合高并发实时系统。核心实现:循环数组 + head/tail 指针 + 状态标记(full)。扩展优化:无锁设计、动态扩容、批量操作。经典应用:生产者-消费者模型、音视频流、网络通信。

2025-06-30 16:57:39 390

原创 static线程安全

public:// 声明classVar++;// 必须在类外定义静态成员t1.join();t2.join();// 应为 2return 0;规则:静态类成员需在类外单独定义(链接器需要实际存储)。修改时同样需要加锁。

2025-06-30 16:43:53 278

原创 生产者-消费者模型 和 操作系统信号定时调度

线程安全队列 使用互斥锁(pthread_mutex_t)和条件变量(pthread_cond_t)保护。使用 pthread_mutex_t 和 pthread_cond_t 实现同步。生产者定时器(SIG_PRODUCER)每 1 秒 触发一次。消费者定时器(SIG_CONSUMER)每 2 秒 触发一次。信号处理函数仅设置标志位,线程检测到标志位后执行任务。消费者线程 由另一个定时器信号触发,从队列读取数据。生产者线程 由定时器信号触发,向队列写入数据。

2025-06-27 10:49:44 190

原创 缺页中断(Page Fault)详解

缺页中断是操作系统中内存管理的关键机制,当进程访问的虚拟内存页面不在物理内存(RAM)中时,由 MMU(内存管理单元) 触发 CPU 异常,操作系统通过中断处理程序将缺失的页面从磁盘(如交换空间或文件系统)加载到内存,使进程继续执行。访问非法地址(如空指针),触发 段错误(Segmentation Fault),终止进程。页面在磁盘(交换空间或文件),需从磁盘加载到内存(I/O 操作,速度慢)。首次访问分配的内存时触发软/硬缺页(实际分配物理页面)。重新执行引发缺页的指令,此时页面已在内存,正常访问。

2025-05-30 10:10:49 368

原创 pmap中的mode列,脏页,写时复制

写时复制(Copy-on-Write,简称 COW) 是一种计算机编程中的优化技术,主要用于内存或存储资源的管理。其核心思想是:只有在真正需要修改数据时,才会执行实际的复制操作,从而避免不必要的资源开销。当某个进程尝试修改数据时,系统才会透明地为该进程创建一份独立的副本,后续修改仅影响副本,其他进程仍访问原始数据。多个进程/线程访问同一份数据时,最初共享同一份物理资源(如内存页、文件块),而不是立即创建副本。USS 可以通过pmap的所有值减去共享的包括-s的内存部分,得到吗?

2025-05-20 17:57:23 227

原创 vim的操作

宏: 是一组命令的录制,可以快速重放,适用于重复性操作。寄存器: 是存储文本、命令和宏的临时存储区,允许用户灵活地管理和使用这些数据。通过理解宏和寄存器的概念,您可以更高效地使用 Vim 进行文本编辑和操作。在 Vim 中,是一系列组合命令,涉及到插入模式和普通模式的操作。这段命令的作用是从当前光标位置向右移动 24 个字符,然后向下移动 4 行,删除该位置到当前行末尾的文本,最后在当前行末尾粘贴之前删除的文本。这可以用于快速编辑文本,特别是在处理块选择和文本替换时。cd ~ls -a。

2025-04-02 14:42:38 1161

原创 gdb使用

watchpoint是gdb中一个非常有用的功能,可以帮助开发者监视变量的变化,便于调试和分析程序的行为。通过设置 watchpoint,您可以更轻松地找到导致变量变化的代码位置。

2025-04-01 16:34:57 737

原创 多线程介绍

堆的共享特性要求在访问时注意线程安全,而栈的独立性使得线程之间的局部变量不会相互干扰。例如,线程 A 使用 malloc 分配内存,线程 B 也可以使用 malloc 分配内存,但需要确保对共享数据的访问是安全的。这意味着在同一个进程中的不同线程可以动态分配和释放堆内存。由于堆是共享的,多个线程可以同时访问和修改堆中的数据,这可能导致数据竞争和不一致性的问题。线程 A 和线程 B 各自的栈中可以有相同名称的局部变量,但它们是独立的。由于每个线程有独立的栈,因此线程之间的局部变量是相互隔离的,不会相互影响。

2025-03-25 14:51:15 358

原创 笔试面试01 c/c++

时间复杂度:表示算法执行所需时间的增长率,通常用大 O 表示法表示(如 O(n)、O(log n))。评估算法的效率通常通过分析其时间复杂度和空间复杂度,比较不同算法在处理相同问题时的性能。:由节点组成的线性数据结构,每个节点包含数据和指向下一个节点的指针。:后进先出(LIFO)的数据结构,支持 push 和 pop 操作。给定一个数组,编写一个函数,找出数组中的最大值和最小值。:先进先出(FIFO)的数据结构,支持入队和出队操作。如何评估算法的效率?:层次结构的数据结构,常见的有二叉树、二叉搜索树等。

2025-03-25 14:30:18 639

原创 单例模式介绍

单例模式用于创建那些在软件系统中独一无二的对象,是一个简单但很实用的设计模式。

2025-03-20 16:56:53 605

原创 /proc/[pid]/maps介绍和pmap介绍、RSS、ldd、nm、strace

proc/[pid]/maps 是 Linux 系统中的一个虚拟文件,提供了关于特定进程(由 pid 指定)内存映射的信息。这个文件包含了进程的虚拟地址空间的详细信息,包括每个内存区域的起始和结束地址、权限、偏移量、设备和 inode 信息,以及映射的文件名(如果有的话)。调试:开发人员可以使用 /proc/[pid]/maps 来查看进程的内存布局,帮助调试内存相关的问题。/proc/[pid]/maps 文件只能被拥有该进程的用户或具有足够权限的用户访问。

2025-03-20 16:45:07 414

原创 一些有用的链接

mingw下载:

2025-03-20 16:43:16 134

原创 Dump 文件介绍

实现 dump 文件的生成通常涉及触发程序崩溃并配置系统以允许生成转储文件。生成的 dump 文件可以用于后续的调试和分析,帮助开发人员识别和修复程序中的错误。在 Windows 中,系统转储可以是小型转储(只包含内核信息)、完整转储(包含所有内存)或内核转储(只包含内核内存)。每种类型的 dump 文件都有其特定的用途和分析方法,开发人员可以根据需要选择合适的类型进行调试和故障排除。用户模式转储可以是完整的(包含所有内存)或小型的(仅包含活动线程的堆栈和一些关键数据)。它们可以用于后续分析和调试。

2025-03-14 18:01:00 520

原创 sregex_iterator介绍

sregex_iterator 是 C++ 标准库 头文件中的一个类,用于在字符串中查找与正则表达式匹配的子字符串。std::distance 是 C++ 标准库中的一个函数,用于计算两个迭代器之间的距离。它的主要功能是返回从一个迭代器到另一个迭代器之间的元素数量。结束迭代器:可以创建一个默认构造的 sregex_iterator,表示没有更多的匹配项。适用性:可以用于任何类型的迭代器,包括随机访问迭代器、双向迭代器和前向迭代器。参数:接受两个迭代器作为参数,通常是一个开始迭代器和一个结束迭代器。

2025-03-14 16:38:34 346

原创 babeltrace的使用

babeltrace 是一个用于分析和转换跟踪数据的工具,特别适用于处理 LTTng 生成的跟踪数据。它可以将跟踪数据从一种格式转换为另一种格式,并提供命令行界面来分析和查看跟踪事件。使用 Babeltrace 分析 SnapshotCopy2. 收集快照数据使用 LTTng 创建快照并收集跟踪数据。确保在创建快照时启用你感兴趣的事件。

2025-03-10 16:18:11 528

原创 Trace Compass使用

Trace Compass 是一个用于分析和可视化 LTTng、Ftrace 和其他跟踪工具生成的跟踪数据的强大工具。Copy2. 收集跟踪数据使用 LTTng 或其他工具收集跟踪数据。确保在收集数据时启用你感兴趣的事件。Copy4. 导入跟踪数据在 Trace Compass 界面中,选择“File”菜单,然后选择“Import Trace…”。浏览到你收集的跟踪数据文件(例如 LTTng 生成的 .trace 文件),并选择它。5. 分析跟踪数据。

2025-03-10 16:02:12 559

原创 lttng工具使用

LTTng(Linux Trace Toolkit Next Generation)是一个用于 Linux 系统的高性能跟踪工具,主要用于收集和分析系统和应用程序的性能数据。LTTng 是一个强大的工具,可以帮助开发者和系统管理员深入了解系统和应用程序的行为。通过上述步骤,你可以轻松地创建跟踪会话、收集数据并进行分析。可以使用 Trace Compass 等工具来分析这些数据,或者使用命令行工具查看跟踪日志。选择要跟踪的事件,可以是内核事件或用户空间事件。在跟踪会话运行时,启动你想要分析的应用程序。

2025-03-10 15:53:26 465

原创 缓存一致性和核绑定(CPU亲和性)

缓存一致性(Cache Coherence)是指在多处理器系统中,确保多个处理器的缓存中存储的数据保持一致的机制。缓存一致性是多处理器系统中一个重要的概念,通过使用一致性协议,可以确保多个处理器的缓存中数据的一致性,从而提高系统的性能和可靠性。一致性:当一个处理器修改了某个数据项后,其他处理器的缓存中该数据项的副本也应随之更新,以确保所有处理器看到的数据是一致的。数据不一致:一个处理器更新了缓存中的数据,而其他处理器仍然使用旧的数据。当一个处理器写入数据时,其他处理器的缓存中该数据的副本会被更新。

2025-02-28 16:27:26 548

原创 PCEP介绍

PCEP 允许路径计算元素(PCE)与路径请求者(如路由器或网络管理系统)之间进行通信,以计算和分发最优路径。路径计算:PCEP 允许网络设备请求路径计算,PCE 根据网络状态和约束条件计算出最佳路径。路径响应:PCE 将计算出的路径返回给路径请求者,通常以路径计算响应(PCR)消息的形式。光网络:在光网络中,PCEP 可用于计算光路径,以优化光纤资源的使用。路径安装:路径请求者根据 PCE 的响应在其路由表中安装计算出的路径。路径请求:路径请求者发送路径计算请求(PCR)到 PCE。

2025-02-28 16:22:32 726

原创 linux上模拟ose

在用户空间模拟一个完整的操作系统环境(OSE),包括调度、资源管理、进程间通信和内存分配,是一个复杂的任务。以下是一个更全面的示例,展示如何在Linux上模拟这些功能,包括基本的调度机制。这个示例将创建一个简单的OSE,支持基本的调度(使用pthread库)、进程间通信(使用管道)和内存分配。

2025-02-28 16:20:55 252

原创 线程挂起情况

假设有两个线程 A 和 B,线程 A 试图获取一个锁,而线程 B 已经持有该锁。这个示例中,我们将创建两个线程:一个线程尝试获取一个互斥锁,而另一个线程持有该锁并进行长时间的处理。在这个示例中,线程1尝试获取一个被线程2持有的锁,因此它被阻塞,直到线程2释放锁。定义:当一个线程被其他进程阻塞时,意味着该线程无法继续执行,因为它正在等待某个资源或条件,而该资源或条件被其他进程占用。在这个示例中,我们将创建两个线程:一个线程将等待信号(条件变量),而另一个线程将在稍后发送信号,通知第一个线程继续执行。

2025-02-26 15:46:51 512

原创 缓存一致性

缓存一致性(Cache Coherence)是指在多处理器系统中,确保多个处理器的缓存中存储的数据保持一致的机制。缓存一致性是多处理器系统中一个重要的概念,通过使用一致性协议,可以确保多个处理器的缓存中数据的一致性,从而提高系统的性能和可靠性。一致性:当一个处理器修改了某个数据项后,其他处理器的缓存中该数据项的副本也应随之更新,以确保所有处理器看到的数据是一致的。数据不一致:一个处理器更新了缓存中的数据,而其他处理器仍然使用旧的数据。当一个处理器写入数据时,其他处理器的缓存中该数据的副本会被更新。

2025-02-25 17:59:07 226

原创 PCEP使用

PCEP(Path Computation Element Protocol)主要用于网络中路径计算的请求和响应,特别是在多协议标签交换(MPLS)和光网络等环境中。路径请求者发送路径计算请求消息,包含计算路径所需的参数,如源地址、目的地址、带宽要求和其他约束条件。光网络:在光网络中,PCEP 可以用于计算光路径,以优化光纤资源的使用,支持动态带宽分配。PCE 将计算出的路径返回给路径请求者,通常以路径计算响应消息的形式。响应消息中包含计算出的路径信息,如路径的各个节点和链路。

2025-02-25 15:44:34 570

原创 虚中断理解

中断注入:在虚拟机监控程序中实现中断注入机制,当物理设备产生中断时,监控程序将相应的虚中断注入到目标虚拟机中。中断分发:实现中断分发机制,将物理中断分发到相应的虚拟机。中断亲和性:配置中断亲和性,以确保特定的中断处理程序在特定的CPU上运行,减少上下文切换的开销。中断管理:虚中断允许虚拟机管理程序管理来自物理设备的中断,并将这些中断分发到相应的虚拟机。隔离性:虚中断提供了虚拟机之间的隔离性,确保一个虚拟机的中断不会影响到其他虚拟机的运行。中断处理程序:在虚拟机中实现中断处理程序,以处理接收到的虚中断。

2025-02-25 11:06:51 494

原创 linux上实现ose

在用户空间模拟一个完整的操作系统环境(OSE),包括调度、资源管理、进程间通信和内存分配,是一个复杂的任务。以下是一个更全面的示例,展示如何在Linux上模拟这些功能,包括基本的调度机制。内存分配:在这个示例中,虽然没有直接使用动态内存分配,但可以在需要时使用malloc()分配内存。这个示例将创建一个简单的OSE,支持基本的调度(使用pthread库)、进程间通信(使用管道)和内存分配。管道(IPC):使用pipe()创建一个管道,用于父进程和子进程之间的通信。进程创建:使用fork()创建子进程。

2025-02-24 18:00:26 306

hadoop笔记2.pdf

hadoop平台搭建相关资料,如何利用hadoop搭建大数据平台,以及一些基本的Linux命令。shell编程

2020-03-24

空空如也

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

TA关注的人

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