自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 offer收割机——linux后台服务器开发方向(专业学习路线图总结)

IT行业,从业技术方向千千万,为什么我称后台服务器开发领域为offer收割机。首先我们看一下,如果要从事后台服务器开发要掌握哪些技术!有点多,做好心理准备。可能技术的全面度是你之前没有见过。看到这里是不是先关注,收藏一波。便于日后再学~~~1.算法与设计排序与查找常用算法常用的数据结构常用的设计模式推荐学习书籍:CLRS 算法导论 算法百科全书、Algorithm Design 算法设计、算法设计与分析视频学习地址:https://www.ixigua.com/i68291875094

2020-08-31 16:29:20 717

原创 深入浅出全面解析RDMA技术

传统的TCP/IP网络通信,数据需要通过用户空间发送到远程机器的用户空间。数据发送方需要讲数据从用户应用空间Buffer复制到内核空间的Socket Buffer中。然后内核空间中添加数据包头,进行数据封装。通过一系列多层网络协议的数据包处理工作,这些协议包括传输控制协议(TCP)、用户数据报协议(UDP)、互联网协议(IP)以及互联网控制消息协议(ICMP)等。数据才被Push到NIC网卡中的Buffer进行网络传输。

2024-04-11 20:16:49 751

原创 一文搞定 mmap 内存映射原理

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。

2024-04-10 17:20:43 770

原创 C/C++如何快速学习?少走3年弯路

于我而言,最开始学习就是 C++,除了计算机专业,其他专业可能学习的第一门编程语言为 C 语言,还是谭浩强爷爷那本,当时想着有点 C 基础,无外乎就是 C 语言的升级版,于是开启了 C++ 的路程。

2024-04-09 20:38:08 942

原创 聊聊Linux内核中内存模型

在Linux中二进制的程序从磁盘加载到内存,运行起来后用户态是使用pid来唯一标识进程,对于内核都是以task_struct表示。二进制程序中的数据段、代码段、堆都能提现在task_struct中。每一个进程都有自己的虚拟地址空间,虚拟地址空间包含几种区域,具体参照如下在内核中进程分配内存时候并非立马给定虚拟内存对应的物理内存,而是分配虚拟内存的使用权。只有当进程真正访问申请的虚拟内存才会分配物理页帧并建立页表映射。

2024-04-07 16:34:04 947

原创 Linux性能分析工具-perf并生成火焰图

perf 是一个非常实用且深入的性能分析工具,适用于从底层硬件交互到上层应用程序逻辑的全方位性能剖析。perf 工具的设计目的是为了帮助开发者和系统管理员分析应用程序以及内核本身的性能,寻找潜在的性能瓶颈,并据此进行针对性的优化。perf 主要特性包括以下几个方面:1、函数级和指令级热点分析:perf 可以通过采样分析,精确到函数级别或甚至指令级别来发现CPU占用率高的热点代码段。

2024-04-03 14:22:56 728

原创 掌握Linux内存故障追踪:技术指南

其中特殊的值IPC_PRIVATE,用于创建当前进程的私有共享内存, 多用于父子进程间。获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享。单靠memleak无法判断这些内存分配操作是真正的内存泄漏(即,分配的内存没有任何引用,永远不会被释放),还是只是内存用量的正常增长,或者仅仅是真正的长期内存。

2024-04-01 17:14:03 933

原创 从易到难,推荐9个适合练手的C++项目

老有一些同学和我说学习了 C++ 以后,想要做些项目锻炼自己,让我从「简单到难」都推荐一些。那有啥说的,必须推荐!毕竟 C++ 的优质项目我见过太多了!下面我就按照「从易到难」的梯度,依次来推荐,总共 9 个。

2024-03-30 16:30:30 705

原创 【c++】剖析 stl + glibc “内存泄漏” 原因

最近项目增加了一个模块,在 Centos 系统压测,进程一直不释放内存。因为新增代码量不多,经过排查,发现 stl + glibc 这个经典组合竟然有问题,见鬼了!通过调试和查阅 glibc 源码,好不容易才搞明白它 "泄漏" 的原因。问题在于:ptmalloc2 内存池的 fast bins 快速缓存和 top chunk 内存返还系统的特点导致。

2024-03-28 17:16:29 641

原创 腾讯二面:epoll性能那么高,为什么?

一个有5个通知的地方三次握手完成之后接收数据回复ACK之后发送数据收到ACK之后接收FIN回复ACK之后接收RST回复ACK之后Linux相关面试题,是非常常见的面试题。以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。t=N7T8linux c/c++开发之高性能网络编程,面试与开发都非常重要的技术,不容错过!

2024-03-26 20:33:43 900

原创 浅谈C++20 协程那点事儿

先介绍一点协程的概念,如果你已经理解和掌握了相关的背景知识就可以跳过这个章节(或者快速浏览下,也许我们有些观念不一致可以讨论)。这里我想稍微聊的深入一点,这涉及到入门后遇到复杂的协程问题时能不能正确的理解并解决问题。协程(Coroutines),也被称为微线程,纤程。一般指一个可以被暂停和恢复执行的逻辑体。一个普通的函数有 2 个常规的操作和行为:调用(Call)和返回(Return)。当调用这个函数的时候,会暂停当前的执行,跳转到这个函数的起始位置去执行。当函数执行完成后会返回结果(或者抛出异常)。这个调

2024-03-21 20:57:06 1082

原创 图文详解io_uring高性能异步IO架构

可以使用io_uring_prep_XXX()系列函数来准备不同类型的I/O请求,例如io_uring_prep_read()用于读取数据,io_uring_prep_write()用于写入数据。已创建的io_ring对象需要和fd进行绑定, 以便能够通过fd找到io_uring对象,创建一个新的file,file private_data成员指向io_ring对象,申请一个未使用的文件描述符fd,fd映射至file,并存储在进程已打开文件表中。

2024-03-20 15:21:32 1123

原创 一篇文章让你真正搞懂epoll机制

epoll机制本身也是阻塞的,当epoll_wait未检测到epoll事件时,会出让CPU,阻塞进程,这种阻塞是非常有必要的,如果不及时出让CPU会浪费CPU资源,导致其他任务无法抢占CPU,只要epoll机制能够在检测到epoll事件后,及时唤醒进程处理,并不会影响epoll性能。epoll的实现机制是通过内核与用户空间共享一个事件表,这个事件表中存放着所有需要监控的文件描述符以及它们的状态,当文件描述符的状态发生变化时,内核会将这个事件通知给用户空间,用户空间再根据事件类型进行相应的处理。

2024-03-19 17:22:47 659

原创 你真的懂Linux线程和信号的关系吗?

其他线程收到信号后,如果线程设置了阻塞/屏蔽信号集,那么该信号会存储在私有未决信号队列,比如通过tkill,tgkill,pthread_kill,以及pthread_sigqueue函数发送给线程的信号。当主线程收到信号后,如果主线程设置了阻塞/屏蔽信号集,那么该信号会存储在共享未决信号队列,比如通过kill或者sigqueue函数发送给主线程的信号。讲到信号,我们更多的是站在进程的角度去理解信号,当一个进程有多个线程的时候,那么进程,线程,信号三者之间会是什么样的关系呢?

2024-03-18 16:46:21 836

原创 一篇文章讲清楚mmap实现原理

VMA(Virtual Memory Area,虚拟内存区域)是Linux内核中用于管理进程虚拟内存的数据结构。每个进程都有一个VMA链表,用于描述进程的虚拟地址空间的不同区域。VMA包含了一段连续的虚拟地址空间,它定义了该区域的起始地址、结束地址以及一些属性信息。VMA可以表示进程的代码段、数据段、堆、栈等不同的内存区域。VMA对应Linux内核struct vm_area_struct对象。

2024-03-16 15:48:23 909

原创 从菜鸟到大师!年薪20W的c++ QT开发工程师需要懂哪些技术?

Qt是一个跨平台的C++应用程序开发框架,广泛用于开发图形界面和跨平台应用程序。它提供了丰富的工具和库,使开发者能够快速构建可靠、高效、美观的应用程序。Qt不仅支持主流操作系统如Windows、macOS和Linux,还可以在移动平台如Android和iOS上进行开发。Qt具有许多强大的功能,包括图形渲染、事件处理、数据库连接、网络通信等。它还提供了丰富的UI组件库,使开发者可以轻松创建各种交互式用户界面。Qt还支持多线程编程、国际化和本地化等特性,并且拥有活跃的社区和广泛的第三方库支持。

2024-03-13 16:11:51 867

原创 从内存管理的角度聊聊MMU的那些事

从计算机大致发展历程来了解内存管理的大致发展策略,如何衍生出 MMU,以及固定分片管理、可变分片管理等不同机制的差异,最后衍生出单级分页管理机制、多级分页管理机制、TLB 的作用。从概念上相对比较易懂的角度描述了 MMU 的诞生、机制,而忽略了处理器的具体实现细节。作为从概念上更深入的理解 MMU 的工作机理的角度,还是不失为一篇浅显易懂的文章。t=N7T8。

2024-03-11 20:03:32 916

原创 图文并茂的讲清楚Linux零拷贝技术

Linux零拷贝技术是一种优化数据传输的技术,它可以减少数据在内核态和用户态之间的拷贝次数,提高数据传输的效率。在传统的数据传输过程中,数据需要从内核缓冲区拷贝至应用程序的缓冲区,然后再从应用程序缓冲区拷贝到网络设备的缓冲区,最后才能发送出去。而零拷贝技术通过直接在应用程序和网络设备之间传输数据,避免了中间的拷贝过程,从而提高了数据传输的效率。sendfile系统调用:sendfile系统调用可以在内核态中直接将文件内容发送到网络设备的缓冲区,避免了数据在用户态和内核态之间的拷贝。

2024-03-08 16:05:46 1116

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

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

2024-03-07 17:32:22 1183

原创 一个10年C++程序员对技术和业务的感悟,献给还在迷茫中的你

涵盖手写代码实现:sdpk文件系统,dpdk用户态协议栈,异步网络库zvnet,协程,io_ uring,Nginx,bpf,线程池,内存池,连接池,原子操作, ringbuffer,定时器,死锁检测,分布式锁,日志,probuf,kafka,grpc,udp可靠传输。由于面试中被问到线程池,TCP/IP网络的时候,让面试官问得人仰马翻,哑口无言,所以回来之后洗心革面,下决心要把线程池,TCP/IP好好研究个明白,再也无法容忍自己只知其一不知其二了。现在的技术的学习曲线的增加,让我的忍耐性越来越低。

2024-03-06 21:06:33 851

原创 【c++】基于无锁循环队列的线程池的实现

获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享。因为存在中间层,所有的操作都不是不是CPU直接跟内存交互,直接完成的,而是通过缓存(寄存器)这个中间层间接完成的。memory_order_seq_cst:默认内存序(全局内存序),保障指令的执行肯定是顺序的,根本没给编译器和CPU留余地,是最严苛的内存序级别。

2024-03-05 20:37:25 856

原创 C++内存模型与内存序

在真正了解Memory Order的作用之前,曾经简单地将Memory Order等同于mutex和atomic来进行线程间数据同步,或者用来限制线程间的执行顺序,其实这是一个错误的理解。直到后来仔细研究了Memory Order之后,才发现无论是功能还是原理,Memory Order与他们都不是同一件事。

2024-03-02 16:53:22 917

原创 Muduo库核心代码及优秀编程细节剖析

Muduo库是陈硕个人开发的Tcp网络编程库,支持Reactor模型。这篇博文对Muduo库中的Multi-reactor架构代码进行逻辑梳理,同时认真剖析了作者每一处精妙的代码设计思想。目前我只重构并剖析了Muduo库中的核心部分,即Multi-Reactor架构部分。但是这部分已经足够支撑起一个基本的高并发TCP服务器的运行了。另外,Muduo库中剩余的rpc、HTTP等通信协议还暂时没有完成,日后一定补上。

2024-03-01 20:10:15 878

原创 从CPU缓存结构到原子操作

原子操作是指在执行过程中不会被中断的操作,要么全部执行成功,要么全部不执行,不会出现部分执行的情况。原子操作可以看作是不可分割的单元, 运行期间不会有任何的上下文切换。1)在单核处理器上,原子操作可以通过禁止中断的方式来保证不被中断。当一个线程或进程执行原子操作时,可以通过禁用中断来确保原子性。在禁用中断期间,其他线程或进程无法打断当前线程或进程的执行,从而保证原子操作的完整性。2)在多核处理器上,原子操作的实现需要使用一些特殊的硬件机制或同步原语来保证原子性。

2024-02-29 20:07:41 947

原创 深入理解基于 eBPF 的 C/C++ 内存泄漏分析

对于 C/C++ 程序员来说,内存泄露问题是一个老生常谈的问题。排查内存泄露的方法有很多,比如使用 valgrind、gdb、asan、tsan 等工具,但是这些工具都有各自的局限性,比如 valgrind 会使程序运行速度变慢,gdb 需要了解代码并且手动打断点,asan 和 tsan 需要重新编译程序。对于比较复杂,并且在运行中的服务来说,这些方法都不是很方便。好在有了 eBPF,我们可以使用它来分析内存泄露问题,不需要重新编译程序,对程序运行速度的影响也很小。

2024-02-24 20:39:41 906 3

原创 年薪30万+的C/C++工程师需要掌握哪些技能?

所以,多了解你的编译器,你就可以更好地了解你的程序是如何生成的。举例来说,TCP协议的“三次握手”,“四次挥手”,“TIME-WAIT状态”这些基本的知识点要弄明白,其它的边角知识学完老不用忘得也快,还是用时google一下效率更高。涵盖手写代码实现:sdpk文件系统,dpdk用户态协议栈,异步网络库zvnet,协程,io_ uring,Nginx,bpf,线程池,内存池,连接池,原子操作, ringbuffer,定时器,死锁检测,分布式锁,日志,probuf,kafka,grpc,udp可靠传输。

2024-02-23 17:40:43 945

原创 线程与进程,你真的理解了吗?

先给一个定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。进程有哪些特征?进程依赖于程序运行而存在,进程是动态的,程序是静态的;进程是操作系统进行资源分配和调度的一个独立单位(CPU除外,线程是处理器任务调度和执行的基本单位);每个进程拥有独立的地址空间,地址空间包括代码区、数据区和堆栈区,进程之间的地址空间是隔离的,互不影响。

2024-02-22 19:50:25 774

原创 DPDK应该如何入门学习?

我的读者当中应该有一部分人是做 DPDK 相关的,我自己虽然现在已经不做 DPDK 了,但对这块仍然有兴趣,今天这篇文章就来总结下 DPDK 的技术栈。注意:这篇文章是小白文,不适合大神哦。文章从 DPDK 的产生背景,到核心技术,再到应用场景,都进行了阐述,有可能是你见过的讲得最全面的文章了,当然,讲得全面自然会少了深度,你如果不屑忽略就好了。

2024-02-21 20:01:45 829

原创 Linux内核解读

工作过程中遇到的调度、内存、文件、网络等可以参考。

2024-02-20 20:16:51 873

原创 Linux程序性能分析60秒+

Linux性能分析大师Brendan Gregg有一篇非常著名的博客,介绍在性能分析开始的60秒内,利用标准的Linux命令行工具,执行一次充分的性能检查,获得系统资源利用率和进程运行情况的整体概念,查看是否存在异常、评估饱和度。本文在大师的肩上进一步扩展,根据实际工作经验介绍几款工具,可以在定位到程序性能问题之后,进一步详细分析解决问题,故名Linux程序性能分析60秒+。本文不介绍相关软件安装和详细使用,只介绍基本用法,作为快速检查单使用。

2024-02-19 20:07:23 1369

原创 超超超详细讲解TCP三次握手与四次挥手(大图解),值得收藏

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。

2024-01-30 20:25:05 837

原创 C与C++相互调用的“底层原理“

由于每一条 #include 指令后面都隐藏这一个未知的世界,除非你刻意去探索,否则你永远都不知道,当你把一条条#include指令放置于extern "C" { }里面的时候,到底会产生怎样的结果,会带来何种的风险。

2024-01-29 20:38:50 1049

原创 怎样编写高性能C/C++程序

3GHz的CPU时钟周期是0.3纳秒,而光在真空中跑这么久,只能前进10cm,只有一个手掌的长度。(缓存一致性的协议可能比你想的复杂,特别是涉及ccNUMA缓存一致性非均匀内存访问机器);寄存器、L1、L2缓存都可以在10ns以内完成操作;L3可能需要20ns,内存至少需要100ns甚至更多。缓存的优化非常重要。数据中心到你家的时间延迟,大概是10ms以上,这看起来比较长,但这是物理规律决定的。任何优化,都不能超越物理。

2024-01-27 20:06:10 883

原创 作为过来人,如果一定要在 C++ 和 Java 中选择,是选 C++ 还是 Java ?

对于 C/C++ 的同学来说,汇编是建议一定要掌握的,只有这样,你才能在书写 C++ 代码的时候,清楚地知道你的每一行C++代码背后对应着什么样的机器指令,if/for/while 等基本程序结构如何实现的,函数的返回值如何返回的,为什么整型变量的数学运算不是原子的,最终你知道如何书写代码才能做到效率最高。第三个基础知识是狭义的操作系统原理。如果你急着找工作,或者对编程没多大兴趣,只是为了糊口饭吃,那么你可以优先选 Java,甚至 Java 的八股文面经背一背,如果运气不错的话,也能找到一份不错的工作。

2024-01-26 20:30:46 958

原创 C++是如何发展起来的?如何学习C++呢?

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。

2024-01-25 20:41:45 1067

原创 存储开发入门到进阶,这几本书一定要看!!

对于一个新的领域,笔者认为学习的路径应该是从使用姿势开始,先用起来,先知其然。保持兴趣,保持自己的信心最重要;等你各种姿势使用都体验了个遍,不出意外你肯定对其内部原理会很感兴趣,这个时候可以从一个很小的点切入,把这个点分析个透彻,会给你带来不一样的感受,这个时候知其所以然也;t=N7T8。

2024-01-24 16:17:14 832

原创 操作系统的灵魂--MMU详解

虚拟内存能够创建一个连续的更大的空间给进程使用,出现的原因是由于主存的空间是有限。当运行多个进程或者一个进程需要更大的空间进行存储运行,主存显然是不够的,这个时候就需要更大更便宜的磁盘进行保存一部分数据。对于进程来说,虚拟内存就是一张连续的内存空间,这个空间有些在主存中,有些在磁盘中。虚拟存储器的工作原理是有一些复杂,本文描述的也并不全是最真实的计算机中的工作方式,比如,PTE由一个有效位和一个地址字段组成其实是为了便于理解而假设出来的。但是这种方式成功的解决了直接使用物理内存会出现的问题。

2024-01-22 20:36:02 844

原创 Linux系统资源分析手段:CPU,内存,磁盘与网络IO的瓶颈定位

用于优化:在程序编码完成后,我们通常要对自己编写的工具进行功能测试与性能分析。用于监控:在观察某个系统的运行情况时,需要观察系统内多个中间件及组件的资源占用情况。用于测试:在开启某个服务时,我们需要拥有对于该服务运行时资源占用的量化手段。在这些场景下,我我们需要一些调试手段帮我们量化进程对于系统资源的占用情况。

2024-01-16 20:20:11 1068

原创 从线程概念到linux多线程的所有知识点,一网打尽

针对上面出现的问题,对公共资源的访问不再是整体加锁,而是对一块公共资源进行再划分,让多个线程可以并发访问对一块公共资源中的一块小的公共资源,而对小块公共资源的管理引入了信号量,信号量本质是一把计数器,用来衡量临界资源中资源数量多少的问题。以后再访问临界资源的时候不需要上来直接加锁,然后检测,而是可以通过先申请信号量,申请成功就一定可以访问一块临界资源,申请失败就说明没有临界资源。是一种经典的常用的设计模式对一些经典的常用场景,给定了一些对应的解决方案,这个就是设计模式。

2024-01-09 17:37:31 891

原创 一口气搞懂【Linux内存管理】,就靠这60张图、59个问题了

按:基于x86处理器上,以系统启动过程中内存管理的逐步构建为主轴,分析内存的管理方式与其相关的安全防护功能。

2024-01-08 20:28:57 834

空空如也

空空如也

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

TA关注的人

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