自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2020-08-31 16:29:20 549

原创 深入理解 netfilter 和 iptables

Netfilter (配合 iptables)使得用户空间应用程序可以注册内核网络栈在处理数据包时应用的处理规则,实现高效的网络转发和过滤。很多常见的主机防火墙程序以及 Kubernetes 的 Service 转发都是通过 iptables 来实现的。关于 netfilter 的介绍文章大部分只描述了抽象的概念,实际上其内核代码的基本实现不算复杂,本文主要参考 Linux 内核 2.6 版本代码(早期版本较为简单),与最新的 5.x 版本在实现上可能有较大差异,但基本设计变化不大,不影响理解其原理。

2023-02-07 20:49:25 176

原创 「linux」定时器方案:红黑树、最小堆和时间轮的原理

对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件;在不同框架中,这两种事件有不同的实现⽅式;第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤;例如nginx、redis;第⼆种,⽹络事件和时间事件在不同线程当中处理;例如skynet;通过epoll_wait中的timeout进行定时操作。但是由于可能会受到网络事件处理中网络影响,导致后面update_timer()时间事件处理出现比较大的误差(没有那么准时)。受到网络影响,定时器的误差较大,如何解决?

2023-02-04 16:24:06 624

原创 浅谈C/S和B/S架构的工作原理及优缺点

B/S架构是从C/S架构改进而来,可以说是三层C/S架构,由此可见两者关系不一般。B/S从C/S中脱离而出,后来随着WEB技术的飞速发展以及人们对网络的依赖程度加深,B/S一举成为当今最流行的网络架构。两种架构都在各自岗位上虎虎生威,它们各有千秋,都是非常重要的网络架构。在响应速度,用户界面,数据安全等方面,C/S强于B/S,但是在业务扩展和适用www条件下,B/S明显胜过C/S。可以这么说,B/S的强项就是C/S的弱项,反之亦然。它们各有优缺点,相互无法取代。

2023-02-02 20:43:28 605

原创 谈谈Linux epoll惊群问题的原因和解决方案

然而由于select,poll没有可扩展性,存在O(n)O(n)问题,因此在带宽越来越高,服务器性能越来越强的趋势下,越来越多的代码将收敛到使用epoll的情形,所以有必要对其进行深入的讨论。”,显然,epoll_wait刚刚取到事件的时候的时候,不可能马上就调用accept去处理,事实上,逻辑在epoll_wait函数调用的ep_poll中还没返回的,这个时候,显然符合“仍然有未处理的事件”这个条件,显然这个时候为了实现这个语义,需要做的就是通知别的同样阻塞在同一个epoll句柄睡眠队列上的进程!

2023-02-01 20:33:10 208

原创 超详细的Socket通信原理和实例讲解

上面我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。socket一词的起源。

2023-01-12 20:31:06 578

原创 IO多路复用之select、poll、epoll之间的区别总结

select,poll,epoll都是IO多路复用的实现机制。它们本质上还是同步IO,而不是异步IO,因为它们都需要在读写事件就绪后自己负责进行读写操作,而这个读写过程是阻塞的;而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核空间拷贝到用户空间。select、poll的底层实现中需要自己不断地轮询所有fd集合,直到文件描述符就绪,期间可能要睡眠和唤醒多次交替。

2023-01-11 16:52:45 864

原创 P2P中的NAT穿越(打洞)方案详解

P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图“P2P结构模型”所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信、实时文件传输甚至文字聊天等)。P2P可以是一种通信模式、一种逻辑网络模型、一种技术、甚至一种理念。在P2P网络中(如右图所示),所有通信节点的地位都是对等的,每个节点都扮演着客户机和服务器双重角色,节点之间通过直接通信实现文件信息、处理器运算能力、存储空间等资源的共享。

2023-01-10 20:37:00 913 1

原创 从Reactor模式俯瞰Nginx,你会发现你与高手的差距就在设计模式上

前面有写Reactor模式的文章,那篇文章主要是普及下概念,这次是重点介绍。Reactor 模式,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor 模式也叫 Dispatcher 模式。即I/O多路复用统一监听事件,收到事件后分发(Dispatch 给某进程),是编写高性能网络服务器的必备技术之一。

2023-01-09 17:05:25 1033

原创 实例分析Linux内存泄漏检测方法

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示内存检测方式无非分为两种:1、维护一个内存操作链表,当有内存申请操作时,将其加入此链表中,当有释放操作时,从申请操作从链表中移除。

2023-01-07 15:24:35 522

原创 腾讯三面:进程写文件过程中,进程崩溃了,文件数据会丢吗?

我们考虑如下一致性问题:如果发生写操作并且对应的数据在 Page Cache 中,那么写操作就会直接作用于 Page Cache 中,此时如果数据还没刷新到磁盘,那么内存中的数据就领先于磁盘,此时对应 page 就被称为 Dirty page。

2023-01-06 21:33:14 377

原创 Linux内存管理:NUMA技术详解(非一致内存访问架构)

O(1)是多队列调度器,每个处理器都有一条自己的运行队列,但由于O(1)调度器不能较好地感知NUMA系统中结点这层结构,从而不能保证在调度后该进程仍运行在同一个结点上,为此,Eirch Focht开发了结点亲和的NUMA调度器,它是建立在Ingo Molnar的O(1)调度器基础上的,Eirch将该调度器向后移植到2.4.X内核中,该调度器最初是为基于IA64的NUMA机器的2.4内核开发的,后来Matt Dobson将它移植到基于X86的NUMA-Q硬件上。如果需要内存的压力非常大,进程将同步释放内存。

2022-12-29 15:37:26 284 3

原创 深入了解epoll模型(原理与源码一起搞定)

epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能显著的提高程序的CPU利用率。前面说,select就像亲自下基层视察的老板,那么epoll这个老板就要显得精明的多了。他可不亲自下基层,他找了个美女秘书,他只要盯着他的秘书看就行了,呸,他只需要听取他的秘书的汇报就行了。汇报啥呢?

2022-12-28 16:42:08 66

原创 socket网络编程的5大误区

套接字编程是容易而有趣的,但是您要避免引入错误或至少使它们容易被发现,这就需要考虑本文中描述的这 5 个常见的陷阱,并且采用标准的防错性程序设计实践。GNU/Linux 工具和实用程序还可以帮助发现一些程序中的小问题。记住:在查看实用程序的帮助手册时候,跟踪相关的或“请参见”工具。您也许会发现一个必要的新工具。

2022-12-26 16:02:30 460

原创 面试题:Linux是如何避免内存碎片的

linux kernel 通过把整个物理内存划分成以一个个page进行管理,管理器就是伙伴系统,它的最小分配单元就是page。但是对于小于page的内存分配,如果直接分配一个page,是一个很大的浪费。linux kernel 通过slab来实现对小于page大小的内存分配。slab把page按2的m次幂进行划分一个个字节块,当kmalloc申请内存时,通过slab管理器返回需要满足申请大小的最小空闲内存块。

2022-12-19 16:54:58 219

原创 glibc内存管理那些事儿

32位Linux平台下进程虚拟地址空间分布如下图:进程虚拟地址空间分布图中,0xC0000000开始的最高1G空间是内核地址空间,剩下3G空间是用户态空间。用户态空间从上到下依次为stack栈(向下增长)、mmap(匿名文件映射区)、Heap堆(向上增长)、bss数据段、数据段、只读代码段。其中,Heap区是程序的动态内存区,同时也是C++内存泄漏的温床。malloc、free均发生在这个区域。本文将简单介绍下glibc在动态内存管理方面的机制,抛砖引玉,希望能和大家多多交流。

2022-12-17 15:11:47 525

原创 图解通用网络IO底层原理、Socket、epoll、用户态内核态······

这个没啥可说的,大家都知道;CPU 在执行任务途中接收到中断请求,需要保存现场后去处理中断请求!保存现场称为中断处理程序!处理中断请求也就是唤醒对应的任务进程来持有CPU进行需要的操作!有了中断之后,提升了操作系统的性能!可以异步并行处理很多任务!由CPU产生的;CPU检查到程序代码段发生异常会切换到内核态;由硬件设备发起的中断称为硬中断!可以发生在任何时间;比方说网卡设备接收到一组报文;对应的报文会被DMA设备进行拷贝到网卡缓冲区!

2022-12-16 16:52:57 46

原创 malloc底层原理剖析——ptmalloc内存池

malloc大家都用过,其是库函数。我们都知道库函数在不同的操作系统中其实执行的是系统调用,那么malloc在Linux上执行的是哪个系统调用呢?brk()和mmap(),至于为什么是两个,这跟ptmalloc内存池的分配策略有关,稍后介绍。既然是系统调用,那么就必须处于内核态去处理,而系统内核态的进入往往又经过中断机制。其大概来说是这么个经过:1.保存用户当前栈esp和页ss2.切换到内核态3.根据中断号找到相应的处理函数4.执行完后恢复栈esp和页ss。

2022-12-15 15:13:12 52

原创 彻底理解并解决服务器出现大量TIME_WAIT

首先我们说下状态出现的原因TCP的新建连接,断开连接的流程和各个状态,如下图所示由上图可知:TIME_WAIT 是主动断开连接的一方会出现的,客户端,服务器都有可能出现当客户端主动断开连接时,发出最后一个ACK后就会处于 TIME_WAIT状态当服务器主动断开连接时,发出最后一个ACK后就会处于 TIME_WAIT状态。

2022-12-14 16:01:25 510 1

原创 高性能异步io机制:io_uring

io_uring 是 linux 内核 5.10 引入的异步 io 接口。相比起用户态的DPDK、SPDK,io_uring 作为内核的一部分,通过 mmap 的方式实现用户和内核共享内存,并基于 memory barrier 在这块内存上实现了两个无锁环形队列: submission queue ring(sq) 和 completion queue ring(cq)。sq 用于用户程序向内核提交 IO 任务,内核执行完成的任务会放入cq,用户程序从 cq 获取结果。

2022-12-13 15:49:45 57

原创 C++中STL用法超详细总结(收藏级)

STL中六大组件:容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;

2022-12-09 15:29:34 430

原创 2022年,我们为什么要学习C++?(文末附完整C++后端学习路线)

大学时代,我就听过这样的说法——差不多十多年前的事儿了。那时候至少在美国,Java已经成了各公司的主流语言。程序员也许都很熟悉Joel Spolsky在2005年12月对JavaSchools发起的批驳。此外,作为微软应对Java的手段,2000年左右推出的C#也有C++杀手的称号。这之后,动态语言风靡一时,Ruby和Python开始流行起来。那么,既然有了这些好用的语言,我们为什么还要选择C++语言呢?它难道不是C语言进阶版吗,就像当初的汇编语言进阶版一样?

2022-11-16 16:01:52 184

原创 为什么要使用 TCP keepalive?C/C++代码实现TCP keepalive

现在恢复B的电源,等待系统重启。想一想 Peer A 和 Peer B 之间的简单 TCP 连接:初始的三次握手,从 A 到 B 的一个 SYN 段,从 B 到 A 的 SYN/ACK,以及从 A 到 B 的最终 ACK。在 Linux 操作系统中,我们可以通过代码启用一个 socket 的心跳检测,为特定套接字启用 keepalive 所需要做的就是在套接字本身上设置特定的套接字选项。由于 TCP/IP 规范,可以这样做,作为一种重复的 ACK,并且远程端点将没有参数,因为 TCP 是面向流的协议。

2022-11-15 16:42:33 133

原创 三次握手时,客户端发送的 SYN 报文为什么会被丢弃?

这里需要先解释一下什么是 NAT,NAT 指的是网络地址转换,简单来说就是将内部网络的私有 IP 转成公有 IP。估计很多人分不清 NAT 和桥接(Bridged)之间的区别,我们以 VMware 为例来解释一遍。提个问题,我们在使用 VMware 虚拟出一个 CentOS 之后,这个 CentOS 要如何连接外网呢?第一种模式:桥接模式VMware 在安装之后会创建一个虚拟网桥以及一个虚拟交换机,所有以桥接模式设置的虚拟机都会连接到虚拟交换机的一个接口上,共处于一个二层网络中。

2022-11-14 16:54:41 1037

原创 浅谈有栈协程与无栈协程

如今虽不敢说协程已经是红的发紫,但确实是越来越受到了大家的重视。Golang中的已经是只有goroutine,以至于很多go程序员是只知有协程,不知有线程了。就连C++也在最新的C++20中原生支持协程。更不用说很多活跃的语言如python,java等,也都是支持协程的。尽管这些协程可能名称不同,甚至用法也不同,但它们都可以被划分为两大类,一类是有(stackful) 协程,例如 goroutine,libco;一类是无栈 (stackless) 协程,例如C++的协程。这里我们想说的一点是。

2022-11-12 15:59:15 75

原创 「查缺补漏」巩固你的Nginx知识体系

见上文。

2022-11-11 20:27:13 48

原创 linux下C++ socket网络编程——即时通信系统(含源码)

1.socket 阻塞与非阻塞阻塞与非阻塞关注的是程序在等待调用结果时(消息,返回值)的状态。阻塞调用是指在调用结果返回前,当前线程会被挂起,调用线程只有在得到调用结果之后才会返回。非阻塞调用是指在不能立刻得到结果之前,该调用不会阻塞当前线程。eg. 你打电话问书店老板有没有《网络编程》这本书,老板去书架上找,如果是阻塞式调用,你就会把自己一直挂起,守在电话边上,直到得到这本书有或者没有的答案。如果是非阻塞式调用,你可以干别的事情去,隔一段时间来看一下老板有没有告诉你结果。

2022-11-10 17:00:46 302

原创 浅析进程间通信的几种方式(含实例源码)

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信机制。上述过程不涉及到内核的拷贝,这些进程间数据的传递就不再通过执行任何进入内核的系统调用来传递彼此的数据,节省了时间,所以共享内存是这五种进程间通信方式中效率最高的。因为信号量是以集合的形式存在,所以第二个参数可以传一个数组,同时对一个集合中的多个信号量进行操作。

2022-11-09 16:45:28 103

原创 最浅显易懂的 NAT 原理解析,看不懂来打我

NAT技术无可否认是在ipv4地址资源的短缺时候起到了缓解作用;在减少用户申请ISP服务的花费和提供比较完善的负载平衡功能等方面带来了不少好处。但是在ipv4地址在以后几年将会枯竭,NAT技术不能改变ip地址空间不足的本质。然而在安全机制上也潜在着威胁,在配置和管理上也是一个挑战。如果要从根本上解决ip地址资源的问题,ipv6才是最根本之路。在ipv4转换到ipv6的过程中,NAT技术确实是一个不错的选择,相对其他的方案优势也非常明显。

2022-11-08 21:07:26 67

原创 再谈Http和Https及TCP/UDP/IP协议分析,面试官都惊讶的网络见解

本文从再看HTTP 和 对比学习 HTTPS入手HTTP协议的学习核心在于搞清楚他是一次性的无状态连接方式,连接建立之后服务结束立马断开连接。。。还有就是搞清楚HTTP的报文格式上述的核心在于最开始的一行请求行 (请求方法 URL 协议版本) + 状态行(协议版本 状态码 状态码描述字段) 搞清楚空行的作用:分割报头和正文HTTPS对比 HTTP学习 : 一个是明文传输的角度来看 另外一个是从网站真实性,身份验证,中间数据修改 的角度来看去分析,HTTPS相对 HTTP多了SSL加密层。

2022-11-05 21:20:25 642

原创 深入浅出分析Linux内核slab性能优化的核心思想

今天分享一篇的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的,是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题(在不同的场景下面),并给出了这些问题的优化方案,这个对我们实现,或以后遇到内存性能问题的时候,有一定的启发,值得我们学习。来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。然而标准的slab实现太复杂且维护开销巨大,因此便分化出了更加小巧的slub,因此本文讨论的就是slub,后面所有提到slab的地方,指的都是slub。

2022-11-04 16:09:44 30

原创 面试官:说说TCP如何实现可靠传输

今天来讲一下的。这也是面试常问的一个题目,这个问题不单止能看出你是否真的了解TCP原理,更看出你是否有一个总结的能力。我们从三个部分来讲TCP是如何实现可靠传输的。

2022-11-03 16:19:49 724

原创 「底层原理」epoll源码分析,还搞不懂epoll的看过来

epoll底层实现中有两个关键的数据结构,一个是eventpoll另一个是epitem,其中eventpoll中有两个成员变量分别是rbr和rdlist,前者指向一颗红黑树的根,后者指向双向链表的头。而epitem则是红黑树节点和双向链表节点的综合体,也就是说epitem即可作为树的节点,又可以作为链表的节点,并且epitem中包含着用户注册的事件。当用户调用epoll_create()时,会创建eventpoll对象(包含一个红黑树和一个双链表);

2022-11-02 16:07:30 368

原创 一条TCP连接时占用内存空间多少?

缓存大小对象0.81KTCP2.19Kdentry0.19Kfile0.25K。

2022-11-01 16:22:08 106

原创 300行代码带你实现一个Linux文件系统

它其实是一棵目录树(没有画全):然而,虽然所有的UNIX系统以及类UNIX系统的文件系统看起来一样,但是它们的实现却是不尽相同。作为普通用户,了解文件系统的基本操作就够了;作为应用开发人员,了解文件系统的POSIX接口足矣,但是作为一个对操作系统有着浓厚兴趣的爱好者而言,自己可能就是一个新的文件系统的潜在实现者,所以必须一窥究竟,看看如此外观的文件系统到底是如何实现的。

2022-10-31 15:23:18 539 1

原创 「Linux」400行纯C语言代码带你「手撕线程池」

线程池里面最重要的是:一个任务队列;多个消费者线程IDs;一个管理者线程ID;管理线程池的锁;管理任务队列是否为满和空的条件变量;还有一些其他的辅助成员变量;{//任务队列/*对于一个任务队列:我们需要知道以下信息*///队列的容量//当前任务的个数//队头取任务//队尾放任务/*有了任务队列后,还要有管理任务队列的线程和从任务队列拿任务的线程*///管理者线程/*设置为指针的目的:工作线程有多个*///工作线程(也就是消费者)

2022-10-29 16:20:50 873

原创 音视频技术之ffplay源码分析-音视频同步

音视频同步的目的是为了使播放的声音和显示的画面保持一致。视频按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧;音频按采样点播放,声音播放设备每次播放一个采样点,声音播放速度由采样率确定,采样率指示每秒播放多少个采样点。如果仅仅是视频按帧率播放,音频按采样率播放,二者没有同步机制,即使最初音视频是基本同步的,随着时间的流逝,音视频会逐渐失去同步,并且不同步的现象会越来越严重。这是因为:一、播放时间难以精确控制,二、异常及误差会随时间累积。

2022-10-28 16:53:49 141

原创 一次解决Linux内核内存泄漏实战全过程

主要用来跟踪kmalloc()和kfree()函数对应的trace event, 因为他们的trace event被触发之后会打印kmalloc()和kfree()所申请和释放的内存地址,然后进一步只过滤申请4096字节的情况。PSS:按比例报告的物理内存,比如进程A占用20M物理内存,进程B和进程A共享5M物理内存,那么进程A的PSS就是(20 - 5) + 5/2 = 17.5M。发现从上面几个ptr内存中读出的内容都是非常相似,仔细看一下发现都是/proc/schedstat 的输出内容。

2022-10-28 15:23:19 169

原创 posix是什么都不知道,还好意思说你懂Linux?

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

2022-10-27 14:27:51 579

原创 彻底理解Linux 进程调度所有知识点

CPU 消耗型进程需要高的吞吐率,IO 消耗型进程需要强的响应性,这两点都是调度器需要考虑的。为了更快响应 IO 消耗型进程,内核提供了一个抢占(preempt)机制,使优先级更高的进程,去抢占优先级低的进程运行。

2022-10-26 15:11:56 190

空空如也

空空如也

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

TA关注的人

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