自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 nginx源码分析-4

ngx_module_t:一个结构体,用于描述nginx中的各个模块,其中包括核心模块、HTTP模块、事件模块等。这个结构体包含了一些模块的关键信息和回调函数,以便nginx在运行时能够正确地加载和管理这些模块。nginx中有几大类主要模块,分别是core、http、event、mail、stream。这一章内容讲述nginx的模块化。

2024-01-02 00:17:18 422

原创 nginx源码分析-3

这一章内容讲述nginx中的事件是如何一步步添加到epoll实例中的。

2023-12-30 00:11:17 447

原创 nginx源码分析-2

ngx_worker_process_cycle:nginx工作进程的主循环,负责创建共享内存、设置信号处理、进入事件循环、处理定时器、处理连接和请求、关闭连接和资源清理。ngx_cycle_s结构体是nginx中非常重要的结构体之一,它代表了nginx运行时的环境。在nginx的生命周期中用于保存各种与运行时状态相关的信息。ngx_spawn_process用于创建新的进程,用于启动子进程来处理网络连接、缓存刷新、日志切割等任务。

2023-12-28 00:32:27 411

原创 nginx源码分析-1

gdb attach nginx的work线程。

2023-12-27 20:52:18 406 1

原创 变量名前加下划线

在C语言中,以单下划线(_)表明是标准库的变量,双下划线(__) 开头表明是编译器的变量。

2021-12-21 16:53:25 1444

原创 libevent_Linux编译问题

按照官网编译可能会报错:CMake Error at /usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message): Could NOT find MbedTLS (missing: MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDTLS_CRYPTO_LIBRARY MBEDTLS_X509_LIBRARY MBEDTLS_LIBRARIES MBEDTLS_VE

2021-12-11 15:59:26 1891 3

原创 《Linux高性能服务器编程》IO单元(9~12章)

github地址第9章 IO复用IO复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。需要指出的是,IO复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使得服务器程序看起来像是串行工作的。如果要实现并发,只能使用多进程或多线程等编程手段。select系统调用的用途是:在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常等事件。poll系统调用和select类似,也是

2021-12-10 16:39:37 620

原创 《Linux高性能服务器编程》高性能服务器程序框架(8章)

第8章 高性能服务器程序框架服务器模型C/S模型:C/S模型的逻辑很简单。服务器启动后,首先创建一个(或多个)监听socket,并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户连接。服务器稳定运行之后,客户端就可以调用connect函数向服务器发起连接。由于客户连接请求是随即到达的异步事件,服务器需要使用某种I/O模型来监听这一事件,比如select系统调用。当监听到连接请求后,服务器就调用accept函数接受它,并分配一个逻辑单元为新的连接服务。逻辑单元可以是新创建

2021-12-09 11:44:03 797

原创 《Linux高性能服务器编程》Linux网络编程基础API(5~7章)

github地址第5章 Linux网络编程基础APIsocket地址API字节序分为大端字节序和小端字节序。大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处。现代PC大多采用小端字节序,因此小端字节序又被称为主机字节序。发送端总是把要发送的数据转化为大端字节序数据后再发送,而接收端知道对方传送过来的数据总是采用大端字节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行

2021-12-09 08:59:22 65

原创 《Linux高性能服务器编程》网络协议(1~4章)

github地址第一章 TCP/IP协议族TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。数据链路层ARP协议(Address Resolve Protocol,地址解析协议):网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻址一台机器,因此网络层必须先将目标机器的IP地址转化成其物理地址,才能使用数据链路层提供的服务,这就是ARP协议的用途。RARP协议(Reverse Address Resolve Protocol,逆地址解析协议):RARP

2021-12-07 15:17:10 280

原创 leveldb编译

这里主要讲linux上编译leveldb。从github上clone的项目缺少googletest和benchmark子模块,需要自己到github上clone。首先进入third_party目录,删掉两个空目录:sudo rm -rf benchmark googletest然后git clone [email protected]:google/googletest.gitgit clone [email protected]:google/benchmark.gitapt安装一个sqlite3

2021-10-14 21:19:54 485

原创 两台linux服务器互传文件

单个文件sudo scp /home/t1.trace [email protected]:/home/jacob文件夹sudo scp -r /home/ [email protected]:/home/jacob文件夹下所有文件sudo scp /home/* [email protected]:/home/jacob拷贝文件并重命名sudo scp /home/t1.trace [email protected]:/home/jacob/t2.trace...

2021-09-25 09:44:24 86

原创 如何定义一个只能在堆上(栈上)生成对象的类?

只能在堆上方法:将析构函数设置为私有原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。只能在栈上方法:将 new 和 delete 重载为私有原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象。将 new 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象。参考:https

2021-09-23 16:35:52 83

原创 C++虚基类

虚基类中带有纯虚函数,而带有纯虚函数的类也叫抽象类。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。虚基类如果被继承,那么子类就必须实现虚基类里面的所有纯虚函数,其子类不能是抽象类。...

2021-09-23 16:34:16 156

原创 linux进程被killed如何查看日志?

使用命令dmesg | egrep -i -B100 'killed process'

2021-09-23 14:57:13 479

原创 APUE第三版源码使用

1. 找不到major minor解决方法:在devrdev.c文件中#include <sys/sysmacros.h>2. #define _flag __pad[4]报错解决方法:将下面的代码修改成:3./usr/bin/ld: cannot find -lbsd解决方法:在Linux上:apt-get install libbsd-dev...

2021-08-19 23:08:03 247

原创 数字图像处理复习(4-5)

第四第五章的内容很多,编程不必自己造轮子,写笔记也一样(狗头警告)。#ifdef REVIEW第4章 频率域滤波第一篇博客讲频率域滤波的数学基础,第二篇讲频率域滤波。https://blog.csdn.net/weixin_35732969/article/details/82918421https://blog.csdn.net/weixin_35732969/article/details/82948853?spm=1001.2014.3001.5501第5章 图像复原与重建按顺序,第一

2021-07-10 16:23:30 78

原创 前端初期学习资源

前端初期学习资源1 先来一个高屋建瓴:React.js,Angular.js,Vue.js学习哪个好?2 初期学习:这个回答讲了前期的学习顺序,可以按它的方式学。也可以看看阿里巴巴的前端学习路线,是视频教学。前期学完之后就可以选一个框架深耕。3 技术路线:这个图片来自:https://github.com/adam-golab/react-developer-roadmap/blob/master/README-CN.mdVue和Angular的知识图谱也与此类似。4 道听途说

2021-06-30 17:37:56 85

原创 C++内存模型

头文件中常包含的内容:函数原型使用#define或const定义的符号常量结构声明类声明模板声明内联函数不同的编译器名称修饰的方式可能不同,可能为同一个函数生成不同的修饰名称。名称的不同将使链接器无法将一个编译器生成的函数调用与另一个编译器生成的函数定义匹配。在链接编译模块时,请确保所有对象文件或库都是由同一个编译器生成的。如果有源代码,通常可以用自己的编译器重新编译源代码来消除链接错误。存储持续性、作用域和链接性C++使用不同的方案来存储数据:自动存储持续性静态存储持续性线程

2021-06-25 22:03:01 76

原创 C++函数相关

程序编译之后的最终产品是可执行程序——由一组机器语言指令组成。运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。内联函数使用内联函数时,编译器将使用相应的函数代码替换函数调用,如果程序在10个不同的地方调用同一个内联函数,则该程序将包含该函数代码的10个副本。内联函数的运行速度比常

2021-06-25 11:24:35 62

原创 ubuntu升级cmake

cmake官网下载网址:cmake下载地址在一个目录下直接命令行下载:wget https://cmake.org/files/v3.20/cmake-3.20.4.tar.gz解压tar -xzvf cmake-3.20.4.tar.gzcd cmake-3.20.4/编译./bootstrapmakesudo make installhash -r查看版本cmake --version...

2021-06-22 17:34:48 189

原创 《C和指针》笔记(十五)

(十五)输入输出函数就C程序而言,所有的IO操作只是简单地从程序移进或移出字节的事情。这种字节流便被称为流。绝大多数流是完全缓冲的,“读取”和“写入”实际上是从一块被称为缓冲区的内存区域来回复制数据。流分为两种类型,文本流和二进制流。文件stdio.h所包含的声明之一就是FILE结构。FILE是一个数据结构,用于访问一个流。如果你同时激活了几个流,每个流都有一个相应的FILE与它关联。对于每个ANSI C程序,运行时系统必须提供至少三个流——标准输入、标准输出、标准错误。这些流的名字分别为std

2021-06-13 11:50:00 67

原创 《C和指针》笔记(十二)

(十二)使用结构和指针单链表typedef struct NODE { struct NODE *link; int value;} Node;#include <stdlib.h>#include <stdio.h>#include "sll_node.h"#define FALSE 0#define TRUE 1int sll_insert(register Node **linkp, int new_value){ register Nod

2021-06-12 11:05:22 61

原创 《C和指针》笔记(十一)

(十一)动态内存分配数组的元素存储于内存中连续的位置上。当一个数组被声明时,它所需要的内存在编译时就被分配,但是你也可以使用动态内存分配在运行时为它分配内存。malloc 和 freeC函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放void *malloc(size_t size); /* size为需要分配的内存字节数*/void free(void *pointer); 调用malloc函数时,malloc从内存池中提取一块合适的内存,并向该程序返回一个指向这

2021-06-11 21:07:18 55

原创 《C和指针》笔记(十)

(十)结构和联合结构基础知识数组元素可以通过下标访问,这只是因为数组的元素长度相同。但是,在结构中由于一个结构的成员可能长度不同,所以不能使用下标来访问它们。相反,每个结构成员都有自己的名字,它们是通过名字访问的。当一个结构变量在表达式中使用时,它并不被替换成一个指针。你可以声明指向结构的指针,取一个结构变量的地址,也可以声明结构数组。struct tag { member-list } variable-list ;结构声明 struct{ int a;

2021-06-10 21:49:33 100

原创 vim操作指南

许多版本的linux都自带了vim,安装vim的方式(以Ubuntu为例):sudo apt-get install vim首先关注一下最重要的两个动作,即撤销和重做。有了这两个操作,你在练习的时候才可以为所欲为。撤销上一个动作: u重做上一个动作: [Ctrl] + r1. 进入输入i,I i为【从目前光标所在处输入】,I为【在目前所在行的第一个非空格符处开始输入】。a,A a为【从目前光标所在的下一个字符处开始输入】,A为【从光标所在行的最后一个字符处开始输入】。o,Oo

2021-06-10 12:11:31 115

原创 《C和指针》笔记(九)

(九)字符串、字符和字节C语言并没有显式的字符串数据类型,因为字符串以字符串常量的形式出现或者存储于字符数组中。字符串常量很适用于那些程序不会对它们进行修改的字符串。NUL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NUL字节。char *strcpy(char *dst, char const *src);这个函数把参数src字符串复制到dst参数。由于dst参数将进行修改,所以它必须是个字符数组或者是一个指向动态分配内存的数组的指针,不能使用字符串常量。即使新的

2021-06-09 09:43:53 106

原创 《C和指针》笔记(八)

(八)数组一维数组数组名的值是一个指针常量,也就是数组第1个元素的地址。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。注意这个值是指针常量,而不是指针变量。只有在两种场合下,数组名并不用指针常量来表示——就是当数组名作为sizeof操作符或单目操作符&的操作数时。sizeof返回整个数组的长度,而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。 int a[2] = {1, 2}; int b =

2021-06-08 21:40:43 64

原创 《Linux内核设计与实现》笔记(十五)

(十五)进程地址空间内核除了管理本身的内存外,还必须管理用户空间中进程的内存。我们称这个内存为进程地址空间,也就是系统中每个用户空间进程所看到的内存。Linux 操作系统采用虚拟内存技术,因此,系统中的所有进程之间以虚拟方式共享内存。对一个进程而言,它好像都可以访问整个系统的所有物理内存。更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存。地址空间进程地址空间由进程可寻址的虚拟内存组成,而且更为重要的特点是内核允许进程使用这种虚拟内存中的地址。每个进程都有一个32位或64位的平

2021-06-08 10:48:54 43

原创 《Linux内核设计与实现》笔记(十四)

(十四)块IO层系统中能够随机访问固定大小数据片的硬件设备称作块设备,这些固定大小的数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、蓝光光驱和闪存等许多其他块设备。它们都是以安装文件系统的方式使用的——这也是块设备一般的访问方式。块设备块是文件系统的一种抽象——只能基于块来访问文件系统。内核要求块大小是2的整数倍,而且不能超过一个页的长度。缓冲区和缓冲区头当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示。每一个缓冲区都有一个对

2021-06-07 22:01:50 59

原创 《Linux内核设计与实现》笔记(十三)

(十三)虚拟文件系统虚拟文件系统作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。系统中所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作。通过虚拟文件系统,程序可以利用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作。通用文件系统接口VFS使得用户可以直接使用open()、read()和write()这样的系统调用而无须考虑具体文件系统和实际物理介质。它把各种不同的文件系统抽象后采用统一的方式进行操作。文件系统抽象层之所以可以使用这种通用接口对

2021-06-07 10:30:08 86

原创 《C和指针》笔记(六)

(六)指针值与类型变量名abcde地址上内容112-11078523331100108int a = 112, b = -1;float c = 3.14;int *d = &a;int *e = &c;c所存储的是浮点值,可是在地址上的内容却是一个整数?因为该变量包含了一系列内容为0或者1的位。它们可以被解释为整数,也可以被解释为浮点数,这取决于它们被使用的方式。不能简单地通过检查一个值的位来判断它的类型,必须观察程序中这个值的使

2021-06-06 18:02:09 40

原创 《Linux内核设计与实现》笔记(十二)

(十二)内存管理内核本身不能像用户空间那样奢侈地使用内存。内核与用户空间不同,它不具备这种能力,它不支持简单便捷地内存分配方式。页内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常为字,但是,内存管理单元通常以页为单位进行处理。内核用struct page结构表示系统中的每个物理页,page结构与物理页相关,而并非与虚拟页相关。因此,该结构对页的描述只是短暂的。即使页中所包含的数据继续存在,由于交换等原因,它们也可能并不再和同一个page结构相关联。内核仅仅用这个数据结构来描述当前时

2021-06-06 12:11:14 155

原创 《深入理解计算机系统》笔记(一)

(一)计算机系统漫游从某种意义上来说,本书的目的就是要帮助你了解当你在系统上执行hello程序时,系统发生了什么以及为什么会这样。#include <stdio.h>int main(){ printf("hello, world\n"); return 0;}信息就是位 + 上下文hello程序的生命周期是从一个源程序开始的,源程序实际上就是一个由值0和1组成的位序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。像hello.c这样只由A

2021-06-05 21:36:52 107

原创 《C和指针》笔记(五)

(五)操作符和表达式<< : 左移位操作符>> : 右移位操作符& : AND| : OR^ : XOR单目操作符:~ : 求补运算,1变为0,0变为1! : 逻辑反操作,产生一个整型结果,0或1- : 产生操作数的负值+ : 什么也不干& : 产生它的操作数的地址。* : 间接访问操作符,它与指针一起使用,用于访问指针所指向的值。sizeof : 判断它的操作数的类型长度,以字节为单位表示。//sizeof(int

2021-06-05 17:12:32 41

原创 《C和指针》笔记(四)

(四)语句空语句空语句本身只包含一个分号。它所适用的场合是语法要求出现一条完整的语句,但并不需要它执行任何任务。表达式语句C并不存在专门的“赋值语句”,赋值就是一种操作,就像加法和减法一样,就在表达式内进行。例:x = y + 3;ch = getchar();实际上是表达式语句,而不是赋值语句。y + 3;getchar();这两条语句也完全合法,但它们并未使用赋值操作符。a++;这条语句并没有赋值操作符,但它却是一条非常合理的表达式语句。++操作符将增加变量a的值,这就是它的副

2021-06-05 17:11:30 50

原创 《Linux内核设计与实现》笔记(十一)

(十一)定时器和时间管理系统定时器和时钟中断处理程序是Linux系统内核管理机制中的中枢。内核中的时间概念内核必须在硬件的帮助下才能计算和管理时间。系统定时器以某种频率自行触发时钟中断,该频率可以通过编程预定,称作节拍率,当时钟中断发生时,内核就通过一种特殊的中断处理程序对其进行处理。因为预编的节拍率对内核来说是可知的,所以内核知道连续两次时钟中断的间隔时间。内核就是靠这种已知的时钟中断间隔来计算墙上时间(实际时间)和系统运行时间的。内核通过控制时钟中断维护实际时间。节拍率:HZ系统定时器频

2021-06-05 10:41:01 64

原创 《Linux私房菜》笔记(0)

0 计算机概论计算机是由几个单元所组成的,包括输入单元、输出单元、CPU内部的控制单元、算术逻辑单元与内存五大部分。CPU的种类目前世界上常见到的两种主要CPU种类,分别是精简指令集(RISC)与复杂指令集(CISC)系统。精简指令集(RISC):这种CPU的设计中,微指令集较为精简,每个指令的执行时间都很短,完成的操作也很单纯,指令的执行性能较佳;但是若要做复杂的事情就要由多个指令来完成。常见的RISC微指令集CPU主要有Sun公司的SPARC系列、IBM公司的Power Architectur

2021-06-04 17:26:45 49

原创 《C和指针》笔记(三)

(三)数据基本数据类型在C语言中,仅有4种基本数据类型——整型、浮点型、指针和聚合类型(如数组和结构等)。所有其他的类型都是从这4种基本类型的某种组合派生而来。长整型至少应该和整形一样长,而整型至少应该和短整型一样长。指针只是地址的另一个名字,指针变量就是一个其值为另外一个内存地址的变量。C语言提供了字符串常量,它就是一串以NUL字节结尾的零个或多个字符。由于NUL字节是用于终结字符串的,所以在字符串内部不能有NUL字节。用于修改变量的长度或是否为有符号数的关键字:short long sign

2021-06-03 20:39:07 90

原创 《Linux内核设计与实现》笔记(十)

(十)内核同步方法原子操作原子操作可以保证指令以原子的方式执行——执行过程不被打断。内核提供了两组原子操作接口——一组针对整数进行操作,另一组针对单独的位进行操作。针对整数的原子操作只能对atomic_t类型的数据进行处理。首先,让原子函数只接收atomic_t类型的操作数,可以确保原子操作只与这种特殊类型数据一起使用。同时,这也保证了该类型的数据不会被传递给任何非原子函数。原子整数操作最常见的用途就是实现计数器。使用复杂的锁机制来保护一个单纯的计数器显然杀鸡用了宰牛刀,所以,开发者最好使用ato

2021-06-03 11:24:04 61

空空如也

空空如也

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

TA关注的人

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