<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Stars____的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Stars____</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Stars____]]></copyright><item><title><![CDATA[计算机存储原理——基础]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/140585379</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/140585379</guid><author>Stars____</author><pubDate>Wed, 21 Aug 2024 18:21:03 +0800</pubDate><description><![CDATA[存储介质的存储原理；文件系统概念梳理；接口与存储协议原理；DAS、SAN、NAS原理；RAID的多种实现模式]]></description><category></category></item><item><title><![CDATA[压测Nginx时对Linux内核参数优化，以支持更高的并发]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/137249484</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/137249484</guid><author>Stars____</author><pubDate>Mon, 01 Apr 2024 23:33:13 +0800</pubDate><description><![CDATA[滑动窗口的大小与socket缓存区会在一定程度上影响并发连接数。每个TCP连接都会为维护TCP滑动窗口而消耗内存，这个窗口会根据服务器的处理速度收缩或扩张。
- 参数net.core.wmem_max的设置，需要平衡物理内存的总大小、Nginx并发处理的最大连接数量确定的。(最大连接数由nginx.conf中的worker_processes和worker_connections参数决定)
- 提高并发量服务器必然会出现内存不足(out of memory)的问题，此时不建议使用降低滑动窗口大小的方式来缓解]]></description><category></category></item><item><title><![CDATA[Nginx学习（12）—— 配置指令整理]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/130689092</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/130689092</guid><author>Stars____</author><pubDate>Thu, 07 Sep 2023 10:06:10 +0800</pubDate><description><![CDATA[当某一个worker进程建立的连接数量达到worker_connections配置的最大连接数的7/8时，会大大地减小该worker进程试图建立新TCP连接的机会，以此实现所有worker进程之上处理的客户端请求数尽量接近。使用accept锁后到真正建立连接之间的延迟时间：在使用accept锁后，同一时间只有一个worker进程能够取到accept锁。accept锁默认是打开的，如果关闭它，那么建立TCP连接的耗时会更短，但worker进程之间的负载会非常不均衡，因此不建议关闭它。]]></description><category></category></item><item><title><![CDATA[Nginx学习（11）—— Nginx源码架构、configure是怎么执行的（编译的具体细节）]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129874565</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129874565</guid><author>Stars____</author><pubDate>Fri, 31 Mar 2023 18:48:47 +0800</pubDate><description><![CDATA[nginx的源码目录与nginx的模块化以及功能的划分是紧密结合，这也使得我们可以很方便地找到相关功能的代码。我们先来看一下nginx源码的目录结构。使用tree命令看一下：
主要目录详情如下：Nginx的编译流程从configure开始：configure脚本将根据我们输入的选项、系统环境参与来生成所需的文件（包含源文件与Makefile文件）。configure会调用一系列auto脚本来实现编译环境的初始化auto脚本由一系列脚本组成，他们有一些是实现一些通用功能由其它脚本来调用（如have），有一些则]]></description><category></category></item><item><title><![CDATA[C语言中命令行工具 (getopt和getopt_long)]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129874598</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129874598</guid><author>Stars____</author><pubDate>Fri, 31 Mar 2023 10:47:25 +0800</pubDate><description><![CDATA[1. char* optarg：正在解析的选项的参数2. int optind：指向下一个选项的索引3. int opterr：非0时会将错误信息打印在stdout上4. int optopt：若一个选项在argv中，但不在选项字符串中时，或者一个带参数的选项没有参数时，getopt()会返回字符？，同时将optopt设为该选项
]]></description><category></category></item><item><title><![CDATA[Nginx学习（10）—— event模块、core模块、变量]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129851900</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129851900</guid><author>Stars____</author><pubDate>Thu, 30 Mar 2023 19:35:29 +0800</pubDate><description><![CDATA[Nginx的模块种类有很多，除了HTTP模块，还有一些核心模块和mail系列模块。核心模块主要是做一些基础功能，比如Nginx的启动初始化，event处理机制，错误日志的初始化，ssl的初始化，正则处理初始化。mail模块可以对imap，pop3，smtp等协议进行反向代理，这些模块本身不对邮件内容进行处理。启动模块从启动Nginx进程开始，做了一系列的初始化工作，源代码位于src/core/nginx.c，从main函数开始]]></description><category></category></item><item><title><![CDATA[Nginx学习（9）—— 负载均衡模块]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129832667</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129832667</guid><author>Stars____</author><pubDate>Wed, 29 Mar 2023 16:56:37 +0800</pubDate><description><![CDATA[之所以说是预备操作，是因为在这两个函数中，并不实际进行建立连接或者释放连接的动作，而只是执行获取连接的地址或维护连接状态的操作。需要理解的清楚一点，在peer.get函数中获取连接的地址信息，并不代表这时连接一定没有被建立，相反的，通过get函数的返回值，nginx可以了解是否存在可用连接，连接是否已经建立。这是一个很重要的性质，因为不同的负载均衡模块对各种属性的支持情况都是不一样的，那么就需要在解析配置文件的时候检测出是否使用了不支持的负载均衡属性并给出错误提示，这对于提升系统维护性是很有意义的。]]></description><category></category></item><item><title><![CDATA[Nginx学习（8）—— upstream模块]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129821882</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129821882</guid><author>Stars____</author><pubDate>Wed, 29 Mar 2023 10:56:58 +0800</pubDate><description><![CDATA[nginx模块一般被分成三大类：handler、filter和upstream。前面的章节中，读者已经了解了handler、filter。利用这两类模块，可以使nginx轻松完成任何单机工作。而upstream模块，将使nginx跨越单机的限制，完成网络数据的接收、处理和转发。数据转发功能，为nginx提供了跨越单机的横向处理能力，使nginx摆脱只能为终端节点提供单一功能的限制，使它具备了网络应用级别的拆分、封装和整合的功能。数据转发是nginx有能力构建一个网络应用的关键组件。]]></description><category></category></item><item><title><![CDATA[Nginx学习（7）—— 过滤模块(filter)]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129811918</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129811918</guid><author>Stars____</author><pubDate>Tue, 28 Mar 2023 18:13:05 +0800</pubDate><description><![CDATA[过滤模块是过滤响应头和内容的模块。它工作在获取回复内容之后，向用户发送响应之前。它的处理过程分为两个阶段，过滤HTTP回复的头部和主体，在这两个阶段可以分别对头部和主体进行修改。所有模块的响应内容都要调用这两个函数指针指向的函数，被这两个函数处理后再返回给客户端。响应的主体内容就存于单链表in，链表一般不会太长，有时in参数可能为NULL。in中存有buf结构体中，对于静态文件，这个buf大小默认是32K；对于反向代理的应用，这个buf可能是4k或者8k。]]></description><category></category></item><item><title><![CDATA[Nginx学习（6）—— handler模块（自定义handler配置模块的编码编译）]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129726119</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129726119</guid><author>Stars____</author><pubDate>Mon, 27 Mar 2023 17:29:35 +0800</pubDate><description><![CDATA[Handler模块就是接受来自客户端的请求并产生输出的模块。配置文件中使用location指令可以配置content handler模块，当Nginx系统启动的时候，每个handler模块都有一次机会把自己关联到对应的location上。如果有多个handler模块都关联了同一个location，那么实际上只有一个handler模块真正会起作用。所以在开发阶段应该避免多个handler模块关联同一个location的情况发生。handler模块处理的结果通常有三种情况处理成功。]]></description><category></category></item><item><title><![CDATA[Nginx学习（5）—— 基本结构（源码）]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129668563</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129668563</guid><author>Stars____</author><pubDate>Wed, 22 Mar 2023 14:50:23 +0800</pubDate><description><![CDATA[可以看到，Nginx自定义了一个带有长度的字符串结构。这意味着，data所指向的字符串并不是以 “\0” 结束的。：对src按照type方式编码，结果放到dst中。如果dst传NULL可获得结果的空间大小。：将src的前n个字符转换成小写存放到dst字符串中。：将结果放到dst中，需要保证dst有足够的空间存放结果。：log为后续在该pool上进行操作时输出日志的对象。：dst传NULL返回结果占用空间大小。：dst传NULL返回结果占用空间大小。]]></description><category></category></item><item><title><![CDATA[Nginx学习（4）—— 高可用配置（keepalived实现Nginx的高可用）]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129404330</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129404330</guid><author>Stars____</author><pubDate>Thu, 16 Mar 2023 14:05:05 +0800</pubDate><description><![CDATA[一般高可用的服务端会都有备用服务，当某一个服务节点挂掉的时候就会有备用机顶上。这往往需要反向代理(Nginx)来将连接切换到可用的服务机器上。那么，当反向代理服务Nginx挂掉之后，就没办法再对外提供服务了。所以，要想Nginx也高可用就需要有备用Nginx，每个Nginx服务上都有负责检测的keepalived：]]></description><category></category></item><item><title><![CDATA[Nginx学习（3）—— 反向代理、负载均衡、动静分离、URLRewrite、防盗链]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129381510</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129381510</guid><author>Stars____</author><pubDate>Wed, 08 Mar 2023 15:16:57 +0800</pubDate><description><![CDATA[所谓代理，指的是在用户和服务器之间有个中间人，对于用户而言它是代理的服务器，对服务器而言它是代理的用户。那么正向代理就是用户主动配置的代理服务器，通过代理服务器向目标服务器发送请求。反向代理就是服务器主动提供的，供用户来访问的代理。]]></description><category></category></item><item><title><![CDATA[Nginx学习 (2) —— 虚拟主机配置]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129188223</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129188223</guid><author>Stars____</author><pubDate>Tue, 07 Mar 2023 14:04:24 +0800</pubDate><description><![CDATA[当用户提交请求URI后nginx会将完整的URI反馈给后端应用服务器，应用服务器通过解析URI再查询数据库拿到真实的资源路径并返回给nginx，再由nginx返回给用户。不同用户通过不同的域名来访问nginx服务的时候nginx通过泛解析将真实的域名传给最终的服务端(比如tomcat)，服务端拿到这个域名后解析字符串的前缀去数据库查询对应的用户信息并返回给nginx，nginx再回显给用户。类似于多用户二级域名，当用户需要访问服务器上的资源时，用户输入的网址并不是真实的，而是一个唯一随机串，也叫做短网址。]]></description><category></category></item><item><title><![CDATA[Nginx学习 (1) —— 初识Nginx（编译安装、启动停止、简单配置）]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/129137175</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/129137175</guid><author>Stars____</author><pubDate>Wed, 22 Feb 2023 09:44:41 +0800</pubDate><description><![CDATA[当一个用户请求进来后，首先由worker子进程解析这一次请求（因为子进程是知道配置文件的内容的，所以子进程可以判断该请求的资源是否存在）发现请求是想获取index.html文件，然后做出响应。nginx启动时会启动主进程，负责读取配置文件并做校验，校验成功后会fork()多个子进程，此后主进程主要的工作就是协调子进程进行工作。对于初次安装Nginx的Linux系统来说是不支持 service 和 systemctl 命令启动的。浏览器输入ip地址访问：显示如下表示成功。：（启动nginx需要的最少配置）]]></description><category></category></item><item><title><![CDATA[Qt基础学习笔记]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/125535301</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/125535301</guid><author>Stars____</author><pubDate>Fri, 01 Jul 2022 20:26:29 +0800</pubDate><description><![CDATA[绘图设备是指继承QPainterDevice的子类，Qt一共提供了4个这样的类。
* QPixmap：专门为图像在屏幕上的显示做了优化。
* QBitmap：是QPixmap的一个子类，它的色深限定为1，可以使用QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。只有黑色和白色。
* QImage：专门为图像的像素级访问做了优化。可以访问具体的像素点。
* QPicture：则可以记录和重现QPainter的各条命令。......]]></description><category></category></item><item><title><![CDATA[设计模式之适配器模式]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/125490247</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/125490247</guid><author>Stars____</author><pubDate>Mon, 27 Jun 2022 19:25:16 +0800</pubDate><description><![CDATA[将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。用vector容器中的for_each()举例子
注意：上述代码会报错
原因：仿函数中的形参有两个，而系统只能识别一个。
解决：但是我们的需求就是要两个参数，此时就需要一个适配器。定义目标函数，我要适配成如下结构的仿函数
适配器如下
所以使用时直接调用适配器的仿函数就行
完整代码如下：......]]></description><category></category></item><item><title><![CDATA[设计模式之外观模式]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/125469700</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/125469700</guid><author>Stars____</author><pubDate>Sun, 26 Jun 2022 14:35:14 +0800</pubDate><description><![CDATA[外观模式就是将一个复杂的子类系统抽象到同一个接口进行管理
外界只需要通过此接口与子类系统进行交互，不需要直接与复杂的子类系统进行交互外观模式属于结构型模式1、实现KTV模式：打开电视，关灯，音响打开，麦克风打开，dvd打开
2、实现游戏模式：电视打开，音响打开，游戏机打开...]]></description><category></category></item><item><title><![CDATA[ARM指令之MOV指令汇编与机器码的对应关系]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/125368531</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/125368531</guid><author>Stars____</author><pubDate>Mon, 20 Jun 2022 13:39:03 +0800</pubDate><description><![CDATA[条件码就是一种简单的测试ALU状态标志位的方法。
比如：
立即数：3
第一个操作数：寄存器1
S：0 （注意：mov指令后面加主机符为s时S位为1）
指令操作数：0011101，这是mov指令特有的
条件码：1110，无条件执行
所以它的指令机器码就是：1110 0011 1010 0000 0001 0000 0000 0011
看一下keil编译的结果：(这里是16进制)E3A01003......]]></description><category></category></item><item><title><![CDATA[ARM接口技术基础]]></title><link>https://blog.youkuaiyun.com/Stars____/article/details/125354761</link><guid>https://blog.youkuaiyun.com/Stars____/article/details/125354761</guid><author>Stars____</author><pubDate>Sun, 19 Jun 2022 16:29:24 +0800</pubDate><description><![CDATA[嵌入式系统：
嵌入式系统 = 嵌入式硬件 + 嵌入式软件。
硬件是软件的载体，软件是硬件的灵魂。嵌入式软件：
1、裸机：APP
2、系统：OS+APP嵌入式硬件：
嵌入式硬件 = 输入+输出+存储器+控制器+运算器+总线；输入和输出：GPIO存储器：(从内到外 四级存储体系) 寄存器(Reg) --> Cahe(高速缓存器) --> 内存(Main Memory) --> 外存
控制器：指挥中心，由一系列的时序逻辑电路组成运算器：信息进行处理和运算的部件，也称为ALU总线(BUS)：①用来连接嵌入式硬件的各]]></description><category></category></item></channel></rss>