自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【从0实现muduo库系列】第二讲:基础类型与工具类

/ 将std::string引入到mymuduo命名空间// 也可以这么使用。这样可以在mymuduo命名空间里直接使用string// 现在可以直接使用string,而不需要写std::string// 等价于 std::string// 不需要写std::string// 代码更简洁重点:理解nocopyable/copyable基类的作用和意义(重点掌握)

2025-03-21 20:14:12 585

原创 【从0实现muduo库系列】第一讲:CMake构建大型项目

MyMuduo是一个基于C++11的多线程网络库,参考陈硕的muduo实现。该库采用Reactor模式,以事件驱动和非阻塞I/O为核心,提供了高性能的网络,章节规划如下所示:1.项目概述与环境搭建muduo库整体架构介绍编译环境配置CMake构建系统实现:CMakeLists.txt2.基础类型与工具类C++11特性介绍实现:Types.h实现:copyable.h和noncopyable.h实现:StringPiece.h3.时间类的实现时间戳处理实现:Timestamp.h/cc实现:Date.h/cc

2025-03-20 14:54:58 614

原创 如何高效定位网络丢包问题?

数据在Internet上是以数据包为单位传输的,单位为字节,数据在网络上传输,受网络设备,网络质量等原因的影响,使得接收到的数据少于发送出去的数据,造成丢包。1.dropwatch工具原理: 监听 kfree_skb(把网络报文丢弃时会调用该函数)函数或者事件吗,然后打印对应调用堆栈;想要详细了解 linux 系统在执行哪个函数时丢包的话,可以使用 dropwatch 工具,它监听系统丢包信息,并打印出丢包发生的函数:2. tcpdump工具。

2025-03-17 21:12:13 663

原创 C++高性能多线程任务队列系统的实现,可以写进简历的项目

这是一个高性能的多线程任务队列系统,主要提供以下功能:支持多个命名任务队列的创建和管理支持异步任务的提交和执行支持延迟任务的调度保证任务的FIFO(先进先出)顺序执行支持多线程并发提交任务线程安全的任务管理开源项目源地址:别盯着C++线程池了,来看看C++高性能多线程任务队列系统的实现,可以写进简历的项目(非老廖开源,老廖这里只是加以分析和改进,让大家更容易掌握)

2025-03-13 17:20:02 965

原创 C++ Qt开发成长之路,从入门到企业级实战项目,保姆级学习路线

Qt是一个跨平台的C++图形用户界面应用程序开发框架,最初由挪威的Trolltech公司开发,后来被诺基亚收购,现在由Qt公司维护。它提供了丰富的工具和类库,使开发者能够轻松地创建各种类型的应用程序,包括桌面应用、移动应用、嵌入式应用和即时通讯软件等。Qt官网:https://www.qt.io/

2025-03-10 21:58:26 828

原创 C++项目---- 高并发内存池(项目解析与源代码)

这个高并发内存池是google公司开源的一个叫tcmalloc的项目,tcmalloc全称 Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数如malloc、free,它的知名度也是非常高的,不少公司都在用它,甚至Go语言直接用它做了自己内存分配器。这个项目是把tcmalloc最核心的框架简化后拿出来,模拟实现出一个自己的高并发内存池,目的就是学习tcamlloc的精华,通过这个项目的实现学习C++高手的设计思路。

2025-03-08 15:44:34 673

原创 【C++】什么是协程?深入理解协程的实现原理与应用

一个进程就是一个程序的运行实例。它有自己的地址空间,除了通过共享内存,不与其他进程共享。线程存在于进程中,它们不能脱离进程存在,尽管在Linux中,进程和线程都被视为任务。它们以相同的方式被调度,并且在内核级别有相同的控制结构。尽管如此,线程被认为是轻量级的,因为程序的初始负载的较大开销由父进程承担。但这并不是完整的情况。还有纤程和协程。如果说进程和线程是真正的并发并且在共享资源上并行工作,纤程就像线程,但不符合并发。虽然线程通常依赖于任务调度器的抢占式时间分片,纤程使用协作式多任务处理。

2025-03-06 15:34:46 744

原创 linux内核同步机制详解:原子操作、自旋锁、信号量、读写锁等

提到内核同步,这还要从操作系统的发展说起。操作系统在进程未出现之前,只是单任务在单处理器cpu上运行,只是系统资源利用率低,并不存在进程同步的问题。后来,随着操作系统的发展,多进程多任务的出现,系统资源利用率大幅度提升,但面临的问题就是进程之间抢夺资源,导致系统紊乱。因此,进程们需要通过进程通信一起坐下来聊一聊了进程同步的问题了,在linux系统中内核同步由此诞生。实际上,内核同步的问题还是相对较复杂的,有人说,既然同步问题那么复杂,我们为什么还要去解决同步问题,简简单单不要并发不就好了吗?凡事都有两面性,

2025-03-04 17:01:31 829

原创 高性能网络编程之 Reactor 网络模型(彻底搞懂)

网络框架的设计离不开 I/O 线程模型,线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络框架,在网络 IO 处理层面几乎都采用了「I/O 多路复用方案」,这是服务端应对高并发的性能利器。进一步看,当上升到整个网络模块时,另一个常常听说的模式出现了 ---- 「Reactor模式」,也叫反应器模式,本质是一个事件转发器,是网络模块核心中枢,负责将读写事件分发给对应的读写事件处理者。

2025-03-01 17:25:34 670

原创 c++程序员简历中项目怎么写?避免踩坑!

从面试官的角度来说,我们也是从学生时代过来的,对于大多数学生做的项目的水平都心知肚明。对于应届生,项目其实不是必需的,面试官更看重的还是基础知识部分;倘若某位同学在简历中描述了自己的项目,那么面试的时候,面试官会结合项目的内容考察一下。为了让大家可以感同身受,我截取了两份真实应届生求职 C++ 岗位的简历中项目描述,你可以自己先想一想,如果在简历中这样描述项目,面试时可能会被问到哪些问题。面试的开场通常是面试官让面试者做一下自我介绍。

2025-02-27 16:10:53 653

原创 Linux C++项目推荐:文件服务器+如何快速上手C++大项目

学完C++和Linux编程后, 可以以WebFileServer文件服务器作为练手项目,比WebServer项目多了文件上传的功能,更加有意义。使用 Reactor 事件处理模型,通过统一事件源,主线程使用 epoll 监听所有的事件,工作线程负责执行事件的逻辑处理。预先创建线程池,当有事件发生时,加入线程池的工作队列中,使用随机选择算法选择线程池中的一个线程处理工作队列的事件。这样可以不断优化项目的性能,面试的时候也能有更多可以讲解的内容。说明数据的响应也是在线程池的线程进行的。

2025-02-26 17:03:50 729

原创 C++实战项目:Qt6开源音视频播放器 - 校招必备作品

开发环境:QT 6.5.3 mingw64bit编译器QT自带的multimedia,multimediawidgets模块对QT版本非常敏感:这个代码可以在QT6.5.3运行,但不能在QT6.5运行。QT6.7.2又不行,这个版本画面黑屏。所以,如果要运行这个项目,请安装QT6.5.3的版本,其他版本不保证运行。B站最强QT音视频播放器分享-附24页详细文档界面截图:该项目完美展现了Qt多媒体开发技术,采用C++开发,代码结构清晰,注释详尽,非常适合作为校招作品集的重要组成。

2025-02-22 17:23:35 694

原创 C++项目推荐-基于muduo库的单聊群聊项目-可写简历

今天分享基于muduo库实现的单聊群聊项目,该项目支持QT客户端一对一聊天,服务端基于muduo+MySQL+Redis.C++校招项目-基于muduo库的分布式单聊群聊项目-可写简历GitHub - haojoy/WeChat: 基于QT仿微信客户端以及基于muduo服务端的集群聊天服务器。

2025-02-21 21:03:10 923

原创 高性能网络框架:DPDK 最佳入门指南

目前Cache主要由三级组成: L1 Cache, L2 Cache和Last Level Cache(LLC)。L1最快,但容量小,可能只有几十KB。LLC慢,但容量大,可能多达几十MB。L1和L2 Cache一般集成在CPU内部。另外,,L1和L2 Cache是每个处理器核心独有的 ,而LLC是被所有核心所共享的。Intel处理器对各级Cache的访问时间一直都保持稳定, 见下表所示。

2025-02-20 21:21:00 482 1

原创 用户态网络协议栈的原理与代码实现(C++)

Netmap 是一个高性能收发原始数据包的框架,由 Luigi Rizzo 等人开发完成,其包含了内核模块以及用户态库函数。其目标是,不修改现有操作系统软件以及不需要特殊硬件支持,实现用户态和网卡之间数据包的高性能传递。其原理图如下,数据包不经过操作系统内核进行处理,用户空间程序收发数据包时,直接与网卡进行通信。代码位置:https://github.com/luigirizzo/netmap(1)性能高:数据包不走传统协议栈,不需要层层解析,用户态直接与网卡的接受环和发送环交互。

2025-02-19 15:11:08 372

原创 C++Linux项目推荐-Web多人聊天+MySQL+Redis+Websocket+Json,可以写简历的C++项目

发送端的json数据只所以不带用户信息,是因为其可以通过cookie从redis读取user_id,再根据 user_id去MySQL查询到username,这里这个设计可以了解,但这种做法虽然减少了客户端发送的数据量,但每条消息都访问MySQL对性能有影响的。继续分析accept_loop(), 我们有tcp server端的基础,应该能理解每个新连接过来,需要通过accept获取新连接,这里我们只关注拿到新连接后怎么处理,即是run_http_session是我们关注的重点。的 C++ 服务器。

2025-02-18 13:55:53 384

原创 C++Linux进阶项目分析-仿写Redis之Qedis

Qedis网上很多编译方式是错误的。C++后台开发偏基础服务,比如分布式存储相关的岗位,基本上都是使用c++。校招的时候如果想从事分布式存储相关的岗位,则需要深入掌握MySQL/Redis,而且即使不是做分布式存储,C++后台开发也是必须掌握Redis,所以建议大家可以参考Qedis项目仿写Redis,这样和其他人写webserver就有区分度。Qedis 是一个基于 C++11 实现的 Redis 服务器,支持集群功能,并使用 LevelDB 作为持久化存储。

2025-02-17 20:29:17 1081

原创 GitHub推荐C++项目:基于muduo、protobuf、zookeeper实现RPC框架

完整的RPC过程如下图:远程调用需传递服务对象、函数方法、函数参数,经序列化成字节流后传给提供服务的服务器,服务器接收到数据后反序列化成服务对象、函数方法、函数参数,并发起本地调用,将响应结果序列化成字节流,发送给调用方,调用方接收到后反序列化得到结果,并传给本地调用。//Login函数的参数。

2025-02-14 20:18:32 926

原创 GitHub项目推荐--适合练手的13个C++开源项目

你可以先把别人优秀的项目下载下来,自己把代码跑起来,配置环境、跑代码、看结果,然后研究别人的代码实现了什么功能、如何实现的,是否可以优化一下,加一些自己的独特思考。水平高的可以直接参考这个C++Linux项目-Web多人聊天,可以通过该项目掌握MySQL+Redis+Websocket+Json等知识的运用,这个项目还可以根据自己的技术栈进行进一步扩展,形成自己独一无二的项目。这个存储库是C++实现的各种算法的开源实现的集合,算法涵盖了计算机科学、数学和统计学、数据科学、机器学习、工程等领域的各种主题。

2025-02-12 17:03:30 945

原创 C++性能优化 —— TCMalloc的原理与使用

TCMalloc(Thread-Caching Malloc,线程缓存的malloc)是Google开发的内存分配算法库,最初作为Google性能工具库 perftools 的一部分,提供高效的多线程内存管理实现,用于替代操作系统的内存分配相关的函数(malloc、free,new,new[]等),具有减少内存碎片、适用于多核、更好的并行性支持等特性。

2025-02-10 17:27:17 648

原创 深入探索GDB调试技巧及其底层实现原理

本文分为两个大模块,第一部分记录下本人常用到的GDB的调试方法和技巧,第二部分则尝试分析GDB调试的底层原理。

2024-11-12 21:05:53 836

原创 并发编程的基础:深入理解内存屏障(Memory Barriers)

内存屏障是一种基础语言,在不同的计算机架构下有不同的实现细节。本文主要在x86_64处理器下,通过Linux及其内核代码来分析和使用内存屏障对大多数应用层开发者来说,“内存屏障”(memory Barrier)是一种陌生,甚至有些诡异的技术。实际上,他机制常被用在操作系统内核中,用于实现同步、驱动程序利用它,能够实现高效的无锁数据结构,提高多线程程序的性能表现。本文首先探讨了内存屏障的必要性,之后介绍如何利用内存屏障实现一个无锁唤醒振荡器(队列),用于在多个线程间进行高效的数据交换。

2024-11-06 22:01:55 1214

原创 盘点近几年腾讯的精选面试题(c/c++研发岗)

1)新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素;2)对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了;3)初始时刻vector的capacity为0,塞入第一个元素后capacity增加为1;4)不同的编译器实现的扩容方式不一样,VS2015中以1.5倍扩容,GCC以2倍扩容。

2024-10-21 20:59:04 842 1

原创 epoll究竟是同步的还是异步的?

select,poll 实现需要自己不断轮询所有 fd 集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而 epoll 其实也需要调用 epoll_wait 不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪 fd 放入就绪链表中,并唤醒在 epoll_wait 中进入睡眠的进程。

2024-10-08 19:45:33 1428 1

原创 深入探索linux的零拷贝(zero-copy):底层技术原理与代码实现

I/O 或输入/输出通常意味着中央处理器(CPU) 与外部设备(如磁盘、鼠标、键盘等)之间的读写。在深入研究零拷贝之前,有必要指出磁盘 I/O(包括磁盘设备和其他块导向设备)和网络 I/O之间的区别。磁盘 I/O 的常用接口是 read()、write() 和 seek()。同时,网络 I/O 的接口通常是套接字相关接口。套接字接口背后发生的事情是发送方和接收方计算机创建自己的套接字,并设置发送或接收文件的连接。

2024-09-25 21:39:07 1375

原创 io多路复用:epoll水平触发(LT)和边沿触发(ET)的区别和优缺点

在进行ET模式的正式分析之前,我们来举个例子简单地了解下ET和LT:假设我们通过fork函数创建了父子两个进程,并通过匿名管道来通信,在子进程中,我们一次向管道写入10个字符数据,为"aaaa\nbbbb\n";每隔5s写入10个字符数据;

2024-09-18 17:23:37 1382

原创 面试官:epoll 为什么用红黑树?

对服务端而言,每一个客户端接入,就会形成一个和客户端对应的 Socket 对象,如果服务器要读取客户端发送的信息,或者向客户端发送信息,就需要通过这个客户端 Socket 对象。可以看到,尽管 ep_send_events_proc 已经尽可能的考虑周全,使得用户空间获得的事件通知都是真实有效的,但还是有一定的概率,当 ep_send_events_proc 再次调用文件上的 poll 函数之后,用户空间获得的事件通知已经不再有效,这可能是用户空间已经处理掉了,或者其他什么情形。其一,这是一个文件;

2024-09-12 20:52:34 1183

原创 虚拟内存、用户空间 、内核空间、用户态、内核态

虚拟内存:在多任务系统系统中,多任务并行,大大提升了 CPU 利用率,但却引出了多个进程对内存操作冲突的问题,虚拟内存 概念的提出就是为了解决这个问题,每个进程都运行在属于自己的 虚拟内存 中。如上图,虚拟内存通过MMU将自己映射到物理内存上,使程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片。至于具体使用的物理内存是哪块他们不需知道。所以保证了进程之间不会互相影响。

2024-09-07 17:25:26 1305

原创 从linux内核看网络包发送流程

获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享。在网络层,如果sk_buffer对象的大小超过了MTU,则还会将【sk_buffer对象】进行拆分,拆分为多个大小小于MTU的【sk_buffer对象】(将原来的sk_buffer里的数据拷贝到小的sk_buffer对象里)

2024-09-04 21:15:32 1560

原创 环形缓冲区(ring buffer)原理与实现详解

ring buffer称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。如下为环形缓冲区(ring buffer) 的概念示意图。在任务间的通信、串口数据收发、log缓存、网卡处理网络数据包、音频/视频流处理中均有环形缓冲区(ring buffer) 的应用。

2024-09-02 21:08:21 5370

原创 C++高并发异步定时器的实现

getchar();return 0;本篇介绍了如何优雅地处理异步任务的:创建、发起、回调、取消、进程退出多种并发行为,其中包含了许多常用的技巧!不记得的小伙伴自行翻回去再看一遍._.当然这在并发的世界中还只是冰山一角,因为很有可能写下某一句话的时机不对,任务一结束,程序就GG了。

2024-08-28 15:30:04 922

原创 全网最透彻的五种linux IO模型分析「值得收藏」

(4).由于2阶段的拷贝是不需要CPU参与的,所以在2阶段准备数据的过程中,cpu可以去处理其它进程的任务。但是在httpd想要加载index.html时,它首先检查自己的app buffer中是否有index.html对应的数据,没有就发起系统调用让内核去加载数据,例如read(),内核会先检查自己的kernel buffer中是否有index.html对应的数据,如果没有,则从磁盘中加载,然后将数据准备到kernel buffer,再复制到app buffer中,最后被httpd进程处理。

2024-08-14 17:36:09 919

原创 一篇文章读懂dpdk——dpdk原理详解

DPDK中普遍采用纯轮询模式进行数据包收发,所有的收发包有关的中断在物理端口初始化的时候都会关闭。物理端口上的每一个收包队列,都会有一个对应的由收包描述符组成的软件队列来进行硬件和软件的交互。DPDK驱动程序负责初始化好每一个收包描述符,其中包含把包缓冲内存块的物理地址填充到收包描述符对应的位置,并把对应的收包成功标志复位,通知网卡硬件把收到的包进行填充。网卡硬件将收到的包一一填充到对应的收包描述符表示的缓冲内存块中,将必要信息填充到收包描述符内,标记好收包成功标志。

2024-08-12 14:40:46 4939

原创 DNS是什么?一文彻底搞懂DNS的原理机制

DNS ,全称 Domain Name System。采用 client/server 模式,DNS client 发出查询请求,DNS server 响应请求。DNS client 通过查询 DNS server 获得主机的 IP 地址,进而完成后续的 TCP/IP 通信过程。当 Windows 系统用户使用 nslookup hostname/domainname 命令时,DNS 会自动查找注册了主机名和 IP 地址的数据库,并返回对应的 IP 地址。

2024-08-05 20:19:42 2569

原创 一文带你彻底搞懂posix

POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),

2024-08-01 20:08:01 2148

原创 网络原理:史上最全tcp/ip协议详解

2MSL翻译过来就是两倍的MSL。MSL全称为Maximum Segment Lifetime,指的是一个TCP报文片段在网络中最大的存活时间,具体来说,2MSL对应于一次消息的来回(一个发送和一个回复)所需的最大时间。如果直到2MSL,主动断开方都没有再一次收到对方的报文(如FIN报文),则可以推断ACK已经被对方成功接收,此时,主动断开方将最终结束自己的TCP连接。所以,TCP的TIME_WAIT状态也称为2MSL等待状态。有关MSL的具体的时间长度,在RFC1122协议中推荐为2分钟。

2024-07-26 21:43:15 548

原创 【linux】彻底搞懂零拷贝(Zero-Copy)技术

Linux系统中一切皆文件,仔细想一下Linux系统的很多活动无外乎读操作和写操作,零拷贝就是为了提高读写性能而出现的。

2024-07-24 20:05:11 1072

原创 初识RDMA技术——RDMA概念,特点,协议,通信流程

RDMA有两种基本操作,包括Memory verbs和Messaging verbs。Memory verbs:包括read、write和atomic操作。RDMA Read:从远程主机读取部分内存。调用者指定远程虚拟地址,像本地内存地址一样用来拷贝。在执行 RDMA 读操作之前,远程主机必须提供适当的权限来访问它的内存。一旦权限设置完成, RDMA 读操作就可以在对远程主机没有任何通知的条件下执行。

2024-07-22 21:05:56 2088

原创 C++线程池:从底层原理到高级应用

线程池是一种并发编程技术,它能有效地管理并发的线程、减少资源占用和提高程序的性能。C++线程池通过库,结合C++ 11、14、17、20等的新特性,简化了多线程编程的实现。线程池默认的任务调度策略可能不适用于所有场景。例如,某些任务需要优先执行,而其他任务可以在空闲时间处理。自定义任务调度策略可以提高线程池的执行效率,并使其更具可配置性。

2024-07-19 20:45:01 1246

原创 线上大量CLOSE_WAIT的原因深入分析

整个分析过程还是废了不少时间。最主要的是主观意识太强,觉得运行了一年没有出问题的为什么会突然出问题?因此一开始是质疑 SRE、DBA、各种基础设施出了问题(人总是先怀疑别人)。导致在这上面费了不少时间。理一下正确的分析思路:1、出现问题后,立马应该检查日志,确实日志没有发现问题;2、监控明确显示了socket不断增长,很明确立马应该使用 netstat 检查情况看看是哪个进程的锅;3、根据 netstat 的检查,使用 tcpdump 抓包分析一下为什么连接会被动断开(TCP知识非常重要);

2024-07-18 20:34:27 1294

空空如也

空空如也

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

TA关注的人

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