自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 压测Nginx时对Linux内核参数优化,以支持更高的并发

滑动窗口的大小与socket缓存区会在一定程度上影响并发连接数。每个TCP连接都会为维护TCP滑动窗口而消耗内存,这个窗口会根据服务器的处理速度收缩或扩张。- 参数net.core.wmem_max的设置,需要平衡物理内存的总大小、Nginx并发处理的最大连接数量确定的。(最大连接数由nginx.conf中的worker_processes和worker_connections参数决定)- 提高并发量服务器必然会出现内存不足(out of memory)的问题,此时不建议使用降低滑动窗口大小的方式来缓解

2024-04-01 23:33:13 534

原创 Nginx学习(12)—— 配置指令整理

当某一个worker进程建立的连接数量达到worker_connections配置的最大连接数的7/8时,会大大地减小该worker进程试图建立新TCP连接的机会,以此实现所有worker进程之上处理的客户端请求数尽量接近。使用accept锁后到真正建立连接之间的延迟时间:在使用accept锁后,同一时间只有一个worker进程能够取到accept锁。accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但worker进程之间的负载会非常不均衡,因此不建议关闭它。

2023-09-07 10:06:10 229

原创 Nginx学习(11)—— Nginx源码架构、configure是怎么执行的(编译的具体细节)

nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我们可以很方便地找到相关功能的代码。我们先来看一下nginx源码的目录结构。使用tree命令看一下:主要目录详情如下:Nginx的编译流程从configure开始:configure脚本将根据我们输入的选项、系统环境参与来生成所需的文件(包含源文件与Makefile文件)。configure会调用一系列auto脚本来实现编译环境的初始化auto脚本由一系列脚本组成,他们有一些是实现一些通用功能由其它脚本来调用(如have),有一些则

2023-03-31 18:48:47 1156

原创 C语言中命令行工具 (getopt和getopt_long)

1. char* optarg:正在解析的选项的参数2. int optind:指向下一个选项的索引3. int opterr:非0时会将错误信息打印在stdout上4. int optopt:若一个选项在argv中,但不在选项字符串中时,或者一个带参数的选项没有参数时,getopt()会返回字符?,同时将optopt设为该选项

2023-03-31 10:47:25 445 1

原创 Nginx学习(10)—— event模块、core模块、变量

Nginx的模块种类有很多,除了HTTP模块,还有一些核心模块和mail系列模块。核心模块主要是做一些基础功能,比如Nginx的启动初始化,event处理机制,错误日志的初始化,ssl的初始化,正则处理初始化。mail模块可以对imap,pop3,smtp等协议进行反向代理,这些模块本身不对邮件内容进行处理。启动模块从启动Nginx进程开始,做了一系列的初始化工作,源代码位于src/core/nginx.c,从main函数开始

2023-03-30 19:35:29 492

原创 Nginx学习(9)—— 负载均衡模块

之所以说是预备操作,是因为在这两个函数中,并不实际进行建立连接或者释放连接的动作,而只是执行获取连接的地址或维护连接状态的操作。需要理解的清楚一点,在peer.get函数中获取连接的地址信息,并不代表这时连接一定没有被建立,相反的,通过get函数的返回值,nginx可以了解是否存在可用连接,连接是否已经建立。这是一个很重要的性质,因为不同的负载均衡模块对各种属性的支持情况都是不一样的,那么就需要在解析配置文件的时候检测出是否使用了不支持的负载均衡属性并给出错误提示,这对于提升系统维护性是很有意义的。

2023-03-29 16:56:37 1253 2

原创 Nginx学习(8)—— upstream模块

nginx模块一般被分成三大类:handler、filter和upstream。前面的章节中,读者已经了解了handler、filter。利用这两类模块,可以使nginx轻松完成任何单机工作。而upstream模块,将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,使它具备了网络应用级别的拆分、封装和整合的功能。数据转发是nginx有能力构建一个网络应用的关键组件。

2023-03-29 10:56:58 1402

原创 Nginx学习(7)—— 过滤模块(filter)

过滤模块是过滤响应头和内容的模块。它工作在获取回复内容之后,向用户发送响应之前。它的处理过程分为两个阶段,过滤HTTP回复的头部和主体,在这两个阶段可以分别对头部和主体进行修改。所有模块的响应内容都要调用这两个函数指针指向的函数,被这两个函数处理后再返回给客户端。响应的主体内容就存于单链表in,链表一般不会太长,有时in参数可能为NULL。in中存有buf结构体中,对于静态文件,这个buf大小默认是32K;对于反向代理的应用,这个buf可能是4k或者8k。

2023-03-28 18:13:05 1141

原创 Nginx学习(6)—— handler模块(自定义handler配置模块的编码编译)

Handler模块就是接受来自客户端的请求并产生输出的模块。配置文件中使用location指令可以配置content handler模块,当Nginx系统启动的时候,每个handler模块都有一次机会把自己关联到对应的location上。如果有多个handler模块都关联了同一个location,那么实际上只有一个handler模块真正会起作用。所以在开发阶段应该避免多个handler模块关联同一个location的情况发生。handler模块处理的结果通常有三种情况处理成功。

2023-03-27 17:29:35 1039

原创 Nginx学习(5)—— 基本结构(源码)

可以看到,Nginx自定义了一个带有长度的字符串结构。这意味着,data所指向的字符串并不是以 “\0” 结束的。:对src按照type方式编码,结果放到dst中。如果dst传NULL可获得结果的空间大小。:将src的前n个字符转换成小写存放到dst字符串中。:将结果放到dst中,需要保证dst有足够的空间存放结果。:log为后续在该pool上进行操作时输出日志的对象。:dst传NULL返回结果占用空间大小。:dst传NULL返回结果占用空间大小。

2023-03-22 14:50:23 825

原创 Nginx学习(4)—— 高可用配置(keepalived实现Nginx的高可用)

一般高可用的服务端会都有备用服务,当某一个服务节点挂掉的时候就会有备用机顶上。这往往需要反向代理(Nginx)来将连接切换到可用的服务机器上。那么,当反向代理服务Nginx挂掉之后,就没办法再对外提供服务了。所以,要想Nginx也高可用就需要有备用Nginx,每个Nginx服务上都有负责检测的keepalived:

2023-03-16 14:05:05 208

原创 Nginx学习(3)—— 反向代理、负载均衡、动静分离、URLRewrite、防盗链

所谓代理,指的是在用户和服务器之间有个中间人,对于用户而言它是代理的服务器,对服务器而言它是代理的用户。那么正向代理就是用户主动配置的代理服务器,通过代理服务器向目标服务器发送请求。反向代理就是服务器主动提供的,供用户来访问的代理。

2023-03-08 15:16:57 545

原创 Nginx学习 (2) —— 虚拟主机配置

当用户提交请求URI后nginx会将完整的URI反馈给后端应用服务器,应用服务器通过解析URI再查询数据库拿到真实的资源路径并返回给nginx,再由nginx返回给用户。不同用户通过不同的域名来访问nginx服务的时候nginx通过泛解析将真实的域名传给最终的服务端(比如tomcat),服务端拿到这个域名后解析字符串的前缀去数据库查询对应的用户信息并返回给nginx,nginx再回显给用户。类似于多用户二级域名,当用户需要访问服务器上的资源时,用户输入的网址并不是真实的,而是一个唯一随机串,也叫做短网址。

2023-03-07 14:04:24 579 1

原创 Nginx学习 (1) —— 初识Nginx(编译安装、启动停止、简单配置)

当一个用户请求进来后,首先由worker子进程解析这一次请求(因为子进程是知道配置文件的内容的,所以子进程可以判断该请求的资源是否存在)发现请求是想获取index.html文件,然后做出响应。nginx启动时会启动主进程,负责读取配置文件并做校验,校验成功后会fork()多个子进程,此后主进程主要的工作就是协调子进程进行工作。对于初次安装Nginx的Linux系统来说是不支持 service 和 systemctl 命令启动的。浏览器输入ip地址访问:显示如下表示成功。:(启动nginx需要的最少配置)

2023-02-22 09:44:41 1016 1

原创 Qt基础学习笔记

绘图设备是指继承QPainterDevice的子类,Qt一共提供了4个这样的类。* QPixmap:专门为图像在屏幕上的显示做了优化。* QBitmap:是QPixmap的一个子类,它的色深限定为1,可以使用QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。只有黑色和白色。* QImage:专门为图像的像素级访问做了优化。可以访问具体的像素点。* QPicture:则可以记录和重现QPainter的各条命令。......

2022-07-01 20:26:29 360 1

原创 设计模式之适配器模式

将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。用vector容器中的for_each()举例子注意:上述代码会报错原因:仿函数中的形参有两个,而系统只能识别一个。解决:但是我们的需求就是要两个参数,此时就需要一个适配器。定义目标函数,我要适配成如下结构的仿函数适配器如下所以使用时直接调用适配器的仿函数就行完整代码如下:......

2022-06-27 19:25:16 108

原创 设计模式之外观模式

外观模式就是将一个复杂的子类系统抽象到同一个接口进行管理外界只需要通过此接口与子类系统进行交互,不需要直接与复杂的子类系统进行交互外观模式属于结构型模式1、实现KTV模式:打开电视,关灯,音响打开,麦克风打开,dvd打开2、实现游戏模式:电视打开,音响打开,游戏机打开...

2022-06-26 14:35:14 611

原创 ARM指令之MOV指令汇编与机器码的对应关系

条件码就是一种简单的测试ALU状态标志位的方法。比如:立即数:3第一个操作数:寄存器1S:0 (注意:mov指令后面加主机符为s时S位为1)指令操作数:0011101,这是mov指令特有的条件码:1110,无条件执行所以它的指令机器码就是:1110 0011 1010 0000 0001 0000 0000 0011看一下keil编译的结果:(这里是16进制)E3A01003......

2022-06-20 13:39:03 6515

原创 ARM接口技术基础

嵌入式系统:嵌入式系统 = 嵌入式硬件 + 嵌入式软件。硬件是软件的载体,软件是硬件的灵魂。嵌入式软件:1、裸机:APP2、系统:OS+APP嵌入式硬件:嵌入式硬件 = 输入+输出+存储器+控制器+运算器+总线;输入和输出:GPIO存储器:(从内到外 四级存储体系) 寄存器(Reg) --> Cahe(高速缓存器) --> 内存(Main Memory) --> 外存控制器:指挥中心,由一系列的时序逻辑电路组成运算器:信息进行处理和运算的部件,也称为ALU总线(BUS):①用来连接嵌入式硬件的各

2022-06-19 16:29:24 611

原创 设计模式之代理模式

为其他对象提供一种代理,用来控制对象的访问。在某些情况下,一个对象不适合或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。如上:代理类MySystemProxy 可以控制MySystem 对象的访问常用于 代理服务器 的设计...

2022-06-16 15:27:00 142

原创 面向对象单例模式

单例模式: 一个类只能创建一个对象。将构造方法私有化,提供一个静态方法将创建好的对象返回给调用者。每当调用静态方法获取的时候才去创建一个对象出来,所以叫懒汉式。饿汉式的构造先于main函数执行,提前就创建好了一个对象等着获取,所以叫饿汉式。单例模式在整个程序中只生成一个对象在堆区,在程序结束的时候,系统会自动回收,所以不需要考虑释放内存。如果非要手动释放,那就写个私有的析构吧。懒汉模式: 在调用者调用静态获取对象的方法时,多线程情况下有 if 判断都为 NULL的可能,那么就创建了不止一个对象,违背了

2022-06-15 20:11:17 143

原创 抽象工厂模式

抽象工厂模式针对的是对产品族,而不是产品等级结构。产品族: 生产一类产品的工厂。产品等级: 同一类产品中具体不同的产品。比如水果类里面由苹果和香蕉,水果就是产品族,苹果香蕉就是产品等级。......

2022-06-14 19:12:57 58

原创 简单工厂模式+工厂方法模式

1、客户端与具体实现类解耦。2、对于某些创建对象的过程比较复杂的情况。只需给工厂传参,然后工厂根据传入的参数返回对象,无需了解对象创建的具体过程。缺点:1、简单工厂模式在增加新功能时是通过修改源代码来实现的,这不符合开闭原则。2、工厂类职责过重,不符合单一职责原则。所以简单工厂模式并不在23种设计模式之列代码示例工厂的使用只需要创建一个工厂,通过传参给工厂返回不同的对象,用户不需要了解具体对象的创建过程,对象的创建都是工厂来完成的。对于工厂类而言,如果要增加新的功能,就需要修改工厂类,这违背了开闭

2022-06-13 19:45:59 157

原创 设计模式基本概念

设计模式共有23种,它们分为三大类:注意:简单工厂模式不在23种之列,加上简单工厂模式共24种。设计模式基础是多态。(目的都是为了 高内聚,低耦合)重点原则代码示例1、开闭原则(OCP):这不是将简单问题复杂化了吗?没错,确实如此,但是我们这个程序简单,假设一个及其复杂的程序,源码的实现非常复杂,后期维护起来,开闭原则就能体现出它的巨大优势2、依赖倒转原则(DIP)传统过程设计倾向于使高层次的模块依赖于低层次的模块,抽象层次依赖于具体层次。这样设计,高层、中层、底层的耦合度极高。很容易导致牵一发而

2022-06-10 11:48:19 278

原创 C++中函数对象、内建函数以及STL常用的标准算法

先理解一下什么是谓词仿函数的返回值类型是bool数据类型,称为谓词,其中仿函数的形参有一个就是一元谓词,两个就是二元谓词代码演示:函数对象函数对象就是仿函数1、函数对象在使用时可以有参数也可以有返回值2、函数对象超出普通对象的概念,函数对象可以有自己的状态3、函数对象可以做参数传递代码演示:内建函数内建仿函数(STL已经写好的仿函数,需要引入#include头文件代码演示:算数仿函数1、negate 一元仿函数 算数仿函数2、plus 二元反函数 取反仿函数使用内建函数需要引

2022-06-07 20:56:31 219

原创 C++STL基础——各个容器的用法

1、构造2、赋值操作3、大小操作4、遍历方式1:通过迭代器访问方式2:利用STL提供的for_each5、插入和删除操作6、数据存取7、互换操作swap的用途:内存收缩8、预留空间string1、构造2、赋值操作3、拼接操作4、字符串的查找和替换5、字符串的比较6、字符串的字符存取[] 的重载 at()成员函数7、插入和删除8、子串截取stack 栈1、构造与赋值2、栈的接口栈不允许有遍历操作set与multisetset 与 multiset的区别:1

2022-06-06 16:17:58 313

原创 零钱兑换+三次握手与四次挥手

如果已经建立了连接,但是客户端突然出现故障了怎么办?为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

2022-06-03 23:34:29 76

原创 斐波那契数列的逐步优化 + 宏中#和##的区别

斐波那契数列的逐步优化问题本身不难,主要体会优化的过程。什么是斐波那契数列:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)满足这个公式的数列就称为斐波那契数列。最简单的实现方式——递归我们容易想到的斐波那契数列的求法就是递归,当然递归也是最简单的解决办法,那么先从递归开始看。递归实现斐波那契数列的代码如下:假设上述代码N传20,可以画出递归树如下:可以看出有很多重复计算,再来计算一下它的时间复杂度,有节点的个数很明显是2n-1个在指数级别

2022-06-01 17:26:04 143

原创 C++多态基础

什么是多态所谓多态就是一种事务的多种表现状态,比如说一条狗,通过它的毛色区分可以是黄狗,黑狗,白狗等等,这就是狗的多态。那么在C++代码中怎么体现多态呢。多态在C++中的表现多态分为静态多态和动态多态静态多态: 函数重载 和 运算符重载都属于 静态多态,复用函数名动态多态: 派生类和虚函数实现动态多态(也就是父类指针或引用指向子类实例化对象)两者的区别静态多态 函数的地址 早 绑定,编译时期就已经确定了函数地址。动态多态 函数的地址 晚 绑定,运行时确定函数地址动态多态的满足条

2022-05-16 19:11:30 257

原创 C++中的static、const与类、成员变量成员函数分开存储

static都知道static在C语言中的作用,这里回顾一下:static修饰局部变量时会延长变量的生命周期。static修饰全局变量和函数时 对外部隐藏,只能在本文件访问。static修饰的变量只能初始化一次,不初始化时默认值为0.那么C++中static有哪些特性呢?首先应该知道C++是完全兼容C的,所以static在C中的特性可以延用。但是C++中的static与类搭配使用时会有一些新操作。static修饰成员变量static 修饰成员变量在编译时期分配内存空间。class P

2022-05-11 20:51:22 320

原创 局域网五子棋——C语言基于IO多路复用+简易进程工作池的网络编程小项目

复制即可运行想拿走即可运行的同学请严格按照我的目录结构准备好文件夹和文件拷贝完成后linux终端在wuziqi目录下make即可启动服务端,这个时候bin目录下会有客户端的可执行文件发给局域网内的电脑添加可执行权限执行就可以对战了chmod 0777 wzq_client // 该命令加可执行权限./wzq_client //执行若是报thread的错误请执行下面的两条命令,make不报错的略过sudo apt-get install glibc-doc#man手册sudo apt

2022-05-07 17:35:25 1390 3

原创 网络编程之IO多路复用

首先了解一下什么是流,什么是I/O可以进行I/O操作的内核对象。比如文件,管道,套接字等都会有流的概念。流的入口一般是文件描述符,在Linux中一切皆文件。文件的读写需要通过流来进行,而对流的读写操作即为I/O阻塞在处理问题时我们一般选择阻塞的方式,节省CPU资源。但不是绝对的。阻塞等待:此期间不占用CPU的时间。非阻塞轮询:所谓轮询是指不停的询问,占用CPU资源。当然阻塞的缺点也很明显,比如说我等待的资源刚好这一时刻只来了一个需要我处理的资源,我结束等待处理完成皆大欢喜。但是资源

2022-05-02 17:02:59 872

原创 C语言网络编程——基础

OSI七层参考模型是理想化的并没有完全实现的模型。应用层提供响应的应用服务表示层数据的表示和加密会话层建立会话关系传输层通过传输协议传输数据网络层实现跨子网通信,路由转发,维护路由表。数据链路层实现以太网内数据帧的转发物理层按照一定的传输规则传输电信号。TCP/IP 四层模型详细介绍见https://blog.csdn.net/Stars____/article/details/108694074SCTP协议:TCP的升级版TCP/IP 网络编程unix域套接字:用于

2022-04-28 16:23:01 7656 1

原创 C++中的构造函数、析构函数以及拷贝构造函数

只要创建了一个类编译器会默认创建三个构造,1.无参构造2.有参构造3.拷贝构造这三个函数你不写编译器就自动用编译器默认的,你写了就用你的。// 构造函数和析构函数// 类实例化一个对象时强制调用构造函数,对象销毁后自动调用析构函数进行清理工作。// 如果没有手动写出构造和析构函数,编译器会自动补上,只不过是空实现。#include <iostream>using namespace std;class fun {public: // 如果私有化 则该类将不能在外部实例

2022-04-26 20:54:24 1006

原创 C语言进程——基础

什么是进程什么是程序一组可以被计算机直接识别的 有序 指令 的集合。通俗讲:C语言编译后生成的可执行文件就是一个程序。那么程序是静态还是动态的?程序是可以被存储在磁盘上的,所以程序是静态的。那什么是进程进程是程序的执行过程,是动态的,随着程序的使用被创建,随着程序的结束而消亡。可以说进程是一个独立的可调度的任务。进程是程序执行的最小单位。进程是资源(内存资源)管理的最小单位。一个程序可以只有一个进程,此时正在运行的这个程序也叫进程。一个程序也可以有多个进程,此时正在运行的这个程序

2022-04-25 10:58:15 6153

原创 C++中对C进行了哪些扩展

namespace命名空间:在C语言多文件多模块开发中,难免会有相同的变量名引起冲突。C++中使用namespace对变量的作用域进行了划分,只在引用当前命名空间的情况下空间内的变量才生效。代码演示如下:// 定义命名空间namespace nameA{ int a = 10;}namespace nameB{ int a = 20;}// 使用命名空间using namespace nameA;int main(){ //using namespace nameB; /

2022-04-19 10:57:56 728 1

原创 C语言文件IO基础,静态库与动态库的创建

输入:从文件到内存。输出:从内存到文件。标准IOC语言标准的一系列用来进行输入和输出的函数。可跨平台。标准IO通过缓冲机制,减少系统调用。实现最大化提升效率。文件流指针。通过一个结构体来操作。文件的基本概念一组相关数据的有序集合。(视频、音频、图片)文件名:这组数据集合的名字。文件的类型:普通文件。ASCII码文件。(文本文件)二进制文件。d 目录文件。c 字符设备文件。b 块设备文件。l 链接文件。p 管道文件。s 套接字文件。(socket)

2022-04-06 17:51:39 1215

原创 make与makefile

gcc的工作流程流程预处理。1.处理#开头的文件。gcc -E test.c -o tset.i编译。1.编译为汇编语言。 gcc -S test.i -o test.s汇编。1.将输入的汇编文件转变为机器代码。gcc -c test.s -o test.o链接。1.将所有的.o文件生成可执行文件。gcc [test.o a.o b.o…] -o test编译方式gcc编译一般来说会将1-3步放在一起处理。1.多文件编译gcc -o test test.c 这种方式将1-4步

2022-04-02 11:08:41 1509

原创 C语言和汇编语言的接口

C语言即可以实现高级语言的模块化编程,又可以实现很多底层操作。但是与汇编语言相比,C语言的效率毕竟还是无法媲美的。因此在对效率和硬件操作比较高的地方,可以采用将部分汇编语句嵌入到C语言中的方式来进行。gcc的内联汇编语言提供了一种在C语言源程序中直接嵌入汇编指令的方法。既能够直接控制所形成的指令序列,又有着与C语言的良好接口。ARM体系结构下的内联汇编 __asm__用法格式__asm__ (汇编语句模板:输出部分:输入部分:破环描述部分)。// asm的四个部分用:隔开就算空着也要:隔开。例如

2022-04-01 16:37:45 704

原创 malloc函数

函数功能在堆区申请连续的空间,将该空间的首地址返回给调用者。相关函数1.void * malloc(size_t size); //size_t 表示无符号整型。2.void * realloc(void * ptr, size_t size); //ptr为堆区的地址,之前开辟的空间首地址,size位新的大小。通常用来增加或减少空间3.void free (void *ptr); // 释放空间。4.perror(“error”); // 打印错误信息。所在包#include &.

2022-04-01 15:17:25 390

空空如也

空空如也

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

TA关注的人

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