自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

BeZer0的学习笔记

BeZer0的学习笔记

  • 博客(195)
  • 资源 (26)
  • 收藏
  • 关注

原创 Linux 网络编程学习笔记

本文是学习《Linux 高性能服务器编程(游双 著)》时所记录的重点知识。

2023-03-20 20:58:05 10961

原创 tinyWebServer 学习笔记——六、注册登录

【代码】tinyWebServer 学习笔记——六、注册登录。

2023-06-15 14:04:58 293

原创 tinyWebServer 学习笔记——五、数据库连接池

【代码】tinyWebServer 学习笔记——五、数据库连接池。

2023-06-08 19:24:34 366

原创 tinyWebServer 学习笔记——四、日志系统

public :// C++11以后,使用局部变量懒汉不用加锁 static Log * get_instance() {} // 可选择的参数有日志文件、日志缓冲区大小、最大行数以及最长日志条队列 bool init(const char * file_name , int close_log , int log_buf_size = 8192 , int split_lines = 5000000 , int max_queue_size = 0);

2023-05-15 10:57:35 5680 1

原创 tinyWebServer 学习笔记——三、定时器处理非活跃链接

【代码】tinyWebServer 学习笔记——三、定时器处理非活跃链接。

2023-05-15 10:56:42 1674

原创 tinyWebServer 学习笔记——二、HTTP 连接处理

从模型的角度来看,从状态机负责通用的操作处理,主状态机负责特定的操作处理,主状态机需要使用从状态机提供的数据,从状态机需要被主状态机调用,每个状态机又是一个有限状态机。有限状态机是一种抽象的理论模型,使用选择语句来实现。模型要求代码存在 n 个状态,使用当前状态。

2023-05-15 10:54:54 5453

原创 tinyWebServer 学习笔记——一、半同步半反应堆线程池

public :// 构造函数 // actor_model:工作模式 // connPool:数据库连接池指针 // thread_number:线程池中线程的数量 // max_request:请求队列中最多允许的、等待处理的请求的数量 threadpool(int actor_model , connection_pool * connPool , int thread_number = 8 , int max_request = 10000);// 析构函数 ~ threadpool();

2023-05-15 10:49:44 5642 1

原创 Linux 网络编程学习笔记——十五、进程池和线程池

在前面的章节中,我们是通过动态创建子进程(或子线程)来实现并发服务器的。这样做有如下缺点:本章将分析这两种“池”的细节,给出它们的通用实现,并分别用进程池和线程池来实现简单的并发服务器。进程池和线程池相似,所以这里我们只以进程池为例进行介绍。如没有特殊声明,下面对进程池的讨论完全适用于线程池。进程池是由服务器预先创建的一组子进程,这些子进程的数目在 3 ~ 10 个之间(典型情况)。比如 httpd 守护进程就是使用包含 7 个子进程的进程池来实现并发的。线程池中的线程数量应该和 CPU 数量差不多。进程池

2023-03-30 20:39:15 12505

原创 Linux 网络编程学习笔记——十三、多进程编程

进程是Linux操作系统环境的基础,它控制着系统上几乎所有的活动。

2023-03-30 20:38:47 15353

原创 Linux 网络编程学习笔记——十四、多线程编程

线程是程序中完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境和调度者的身份,线程可分为内核线程和用户线程。内核线程,在有的系统上也称为 LWP(Light Weight Process,轻量级进程),运行在内核空间,由内核来调度;用户线程运行在用户空间,由线程库来调度。当进程的一个内核线程获得 CPU 的使用权时,它就加载并运行一个用户线程。可见,内核线程相当于用户线程运行的“容器”。一个进程可以拥有 M 个内核线程和 N 个用户线程,其中 M ≤ N。

2023-03-30 20:36:43 14725

原创 Linux 网络编程学习笔记——十二、高性能 I/O 框架库 Libevent

I/O 框架库以库函数的形式,封装了较为底层的系统调用,给应用程序提供了一组更便于使用的接口。这些库函数往往比程序员自己实现的同样功能的函数更合理、更高效,且更健壮。因为它们经受住了真实网络环境下的高压测试,以及时间的考验。各种 I/O 框架库的实现原理基本相似,要么以 Reactor 模式实现,要么以 Proactor 模式实现,要么同时以这两种模式实现。

2023-03-30 20:36:16 14688

原创 Linux 网络编程学习笔记——十一、定时器

网络程序需要处理的第三类事件是定时事件,比如定期检测一个客户连接的活动状态。服务器程序通常管理着众多定时事件,因此有效地组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响。为此,要将每个定时事件分别封装成定时器,并使用某种容器类数据结构,比如链表、排序链表和时间轮,将所有定时器串联起来,以实现对定时事件的统一管理。本章主要讨论的就是两种高效的管理定时器的容器:时间轮和时间堆。不过,在讨论如何组织定时器之前,我们先要介绍定时的方法。

2023-03-30 20:36:01 14624

原创 Linux 网络编程学习笔记——十、信号

Linux 下,一个进程给其他进程发送信号的 API 是 kill 函数。pid 参数含义pid > 0信号发送给 PID 为 pid 的进程pid = 0信号发送给本进程组内的其他进程pid = -1信号发送给除 init 进程外的所有进程,但发送者需要拥有对目标进程发送信号的权限pid < -1信号发送给组 ID 为 -pid 的进程组中的所有成员Linux 定义的信号值都大于 0 ,如果 sig 取值为 0 ,则 kill 函数不发送任何信号。

2023-03-30 20:35:40 14696

原创 Linux 网络编程学习笔记——九、I/O 复用

I/O 复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。需要指出的是,I/O 复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使服务器程序看起来像是串行工作的。如果要实现并发,只能使用多进程或多线程等编程手段。Linux 下实现 I/O 复用的系统调用主要有 select 、poll 和 epoll。

2023-03-27 21:02:20 14872

原创 Linux 网络编程学习笔记——八、高性能服务器程序框架

服务器可被解构为 3 个主要模块:TCP/IP 协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地用了客户端/服务器模型,即所有客户端都通过访问服务器来获取所需的资源:C/S 模型的逻辑很简单:P2P(Peer to Peer,点对点)模型比 C/S 模型更符合网络通信的实际情况。它摒弃了以服务器为中心的格局,让网络上所有主机重新回归对等的地位:P2P 模型使得每台机器在消耗服务的

2023-03-27 17:11:46 14731 1

原创 Linux 网络编程学习笔记——七、Linux 服务器程序规范

除了网络通信外,服务器程序通常还必须考虑许多其他细节问题。这些细节问题涉及面广且零碎,而且基本上是模板式的,所以称之为服务器程序规范。

2023-03-24 16:02:19 14575

原创 Linux 网络编程学习笔记——六、高级 I/O 函数

pipe 函数的参数是一个包含两个 int 型整数的数组指针。该函数成功时返回 0 ,并将一对打开的文件描述符值填入其参数指向的数组。如果失败,则返回 -1 并设置 errno。通过 pipe 函数创建的这两个文件描述符 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据可以从 fd[0] 读出。并且,fd[0] 只能用于从管道读出数据,fd[1] 则只能用于往管道写入数据,而不能反过来使用。如果要实现双向的数据传输,就应该使用两个管道。默认情况下,这一对文件描述符都是阻塞的。

2023-03-23 21:53:28 14696

原创 Linux 网络编程学习笔记——五、Linux 网络编程基础 API

现代 CPU 的累加器一次都能装载(至少)4 字节(下面均考虑 32 位机),即一个整数。那么这 4 字节在内存中排列的顺序将影响它被累加器装载成的整数的值。这就是字节序问题。字节序分为大端字节序(big endian)和小端字节序(little endian)。现在 PC 大多采用小端字节序,因此小端字节序又被称为主机字节序。当格式化的数据(比如 32 bit 整型数和 16 bit 短整型数)在两台使用不同字节序的主机之间直接传递时,接收端必然错误地解释之。

2023-03-22 21:50:11 14721

原创 Linux 网络编程学习笔记——四、HTTP 通信

在 HTTP 通信链上,客户端和目标服务器之间通常存在某些中转代 理服务器,它们提供对目标资源的中转访问。一个 HTTP 请求可能被多个代理服务器转发,后面的服务器称为前面服务器的上游服务器。

2023-03-22 21:00:15 15271 1

原创 Linux 网络编程学习笔记——三、TCP 协议详解

传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者的特点是:面向连接、字节流和可靠传输。使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP 连接是全双工的,即双方的数据读写可以通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。

2023-03-21 22:47:18 15145

原创 Linux 网络编程学习笔记——二、IP 协议详解

由于网络是实时变化的,因此路由表必须能够实时更新。前文中提到,不是发送给本机的 IP 数据报将由数据报转发子模块来处理,这称之为 IP 转发,路由器都能执行数据报转发操作,而主机一般只发送或接受数据报,这是因为 /proc/sys/net/ipv4/ip_forward 内核参数默认被设置为 0 ,将其修改为 1 可使主机具备数据转发功能。IP 模块实现数据报路由的核心数据结构是路由表,此表按照数据报的目标 IP 地址分类,同一类型的 IP 数据报将被发往相同的下一跳路由器。

2023-03-21 15:38:46 14665

原创 Linux 网络编程学习笔记——一、TCP/IP 协议族

数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环等)上的传输,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。最常用的协议是 ARP(Address Resolve Protocol,地址解析协议)和 RARP(Reverse Address Resolve Protocol),它们实现了 IP 地址和机器物理地址(通常是 MAC 地址)之间的相互转换。

2023-03-20 20:37:33 14961

原创 C++ 学习笔记——十二、探讨 C++ 新标准

解决这个问题的方法为不删除 tmp 变量,而是转移所有权,该操作称为移动语义(move semantics),这样避免了删除和拷贝原数据。可以定义两个构造函数,一个是常规拷贝构造函数,使用 const 左值引用作为参数,这个引用关联到左值实参,如语句 1 的 vstr;另一个是移动构造函数,使用右值引用作为参数,该引用关联到右值实参,如语句 2 种 allcaps 函数的返回值 tmp。C++ 11 扩大了用大括号括起的列表(初始化列表)的适用范围,使其可用于所有内置类型和用户定义的类型(即类对象)。

2023-03-18 17:51:15 9825

原创 C++ 学习笔记——十、标准模板库

此时由于 demo 函数返回一个临时的 unique_ptr ,然后 ps 接管了原本返回的 unique_ptr 所有的对象,而返回的 unique_ptr 被销毁,这没有问题,因为 ps 拥有了 string 对象的所有权。如果一定要使用第一种方式赋值,可以采用。根据不同智能指针的特点,若有多个智能指针同时指向同一个对象,则使用 shared_ptr ,否则建议使用 unique_ptr。,它们都定义了类似指针的对象,可以将 new 获得的地址赋给它,并且当智能指针过期时,这些内存将自动被释放。

2023-03-17 19:22:34 9872 1

原创 C++ 学习笔记——九、友元、异常和其他

友元类可以位于共有、私有或保护部分,由于 Remote 类提到了 Tv 类,所以编译器必须了解 Tv 类后,才能处理 Remote 类,为此,最简单的方法是首先定义 Tv 类。

2023-03-16 21:46:52 9840

原创 C++ 学习笔记——八、代码重用

由于声明为私有成员,此时对于姓名和成绩的管理只能通过成员函数利用姓名类和成绩类的接口来实现,注意,此时学生类并没有获得姓名类和成绩类的接口,而只是通过对象调用他们。那么问题来了,儿砸到底有几个名字?Type 为泛型标识符,被称为类型参数(type parameter),这意味着它类似于变量,但赋给它们的不能是数字,而只能是类型,因此最后一句的参数 Type 的值为 int。但是使用姓名来排序是一件有意义的事情,因此没有继承接口的情况下就需要编写这个成员函数,在函数中通过姓名对象调用它的接口来实现。

2023-03-16 20:24:32 10107

原创 Linux 学习笔记——五、文件与目录

默认情况下,所有系统上的账号与一般身份使用者、root 相关信息都记录在 /etc/passwd ,密码记录在 /etc/shadow。群组名称记录在 /etc/group。

2023-03-15 22:45:05 443

原创 C++ 学习笔记——五、内存模型和名称空间

头文件管理:在同一个文件中只能将同一个头文件包含一次,为防止意外,可以采用基于预处理器编译指令#ifndef多个库的链接:由于不同编译器所编译文件的名称修饰不同,可能导致链接器无法将一个编译器生成的函数调用与另一个编译器生成的函数定义匹配,因此在链接编译模块时,应确保所有对象文件或库都是由同一个编译器生成的。

2023-03-14 17:09:49 418

原创 Linux 学习笔记——二、主机规划与磁盘分区

P1 为主要分区,P2 为延伸分区,延伸分区的目的是使用额外的扇区来记录分区信息,因此延伸分区本身不能被格式化,可以通过延伸分区所指向的区块继续作分区的记录。BIOS 会分析计算机里面有哪些储存设备,以硬盘为例,BIOS 会依据使用者的设置去取得能够开机的硬盘,并且到该硬盘里面去读取第一个扇区的 MBR 位置,而 MBR 会存放最基本的开机管理程序,因此它会接替 BIOS 进行后续工作。由于 GPT 分区已经没有所谓的主、延伸、逻辑分区的概念,每个记录都可以单独存在,因此均可以视为主分区,并进行格式化。

2023-03-11 17:01:11 762

原创 eddsa 算法

eddsa 算法

2023-02-26 17:35:23 813

原创 Linux 学习笔记——〇、零碎知识

零碎知识

2023-02-10 14:44:56 262

原创 C++ 学习笔记——〇、零碎知识

预备知识

2023-02-10 10:19:48 295

原创 309. Best Time to Buy and Sell Stock with Cooldown

考虑第一种情况,说明在第 i 天要么没进行操作,要么买了股票;考虑第二种情况,说明第 i 天卖出了股票;考虑第三种情况,说明第 i 天什么都没干。对应不同的情况进行操作即可。

2022-11-21 22:22:05 69

原创 240. Search a 2D Matrix II

假设目标元素为 14 ,首先我考虑了一种递归方式,即判断对角线元素的大小,从而排除两个正方形的区域(左上角区域元素均小于目标元素,右下角区域均大于目标元素),因此就可将问题缩小为图 1 中两个标红的区域,按此规则递归查找即可。当判断区域不是正方形时,先判断如图 2 所示蓝色区域,若未找到则再判断黄色的区域。每次从右上角元素开始向左搜索,如果遇到比目标元素小的元素,则将其下面的元素作为新的起点,直到找到目标元素或搜索结束,时间复杂度。

2022-11-16 19:19:52 164

原创 221. 最大正方形

首先考虑第一行或第一列的元素,发现边长只能为 0 或 1 ,再来考虑其他元素,可以发现边长只与左边元素、上边元素、左上方元素的边长有关,时间复杂度为。由于每个元素只用到上一行的 dp 值以及前一个元素的 dp 值,因此可以用一维数组和一个变量来记录 dp 表,从而使得空间复杂度降为。假设每一个元素为最大正方形的右下角点,那么可以对每个元素维护其对应最大正方形的边长。

2022-09-28 22:26:17 56

原创 207. 课程表

该题本质是求一个拓扑排序,若求不出,则说明存在环,由于不需要记录具体排序内容,因此可以省略栈,时间复杂度。,由于需要邻接表,因此空间复杂度。

2022-09-25 18:07:01 74

原创 215. 数组中的第 k 个最大元素

由于快速排序每次都能确定一个元素在数组中的位置,因此在排序过程中若枢轴为所求第 k 大值,则可终止排序。由于快速排序最慢的时间复杂度为。,为防止每次划分过程中取得最差结果,因此采用随机化来进行加速,时间复杂度。

2022-09-24 20:58:17 72

原创 200. 岛屿数量

遍历地图,每遇到一个连通图,都将其所有元素标记为true,然后遍历下一个连通图即可。可以遍历地图上所有1,如果周围有与其连接的1,则将其合并。

2022-07-28 21:57:47 74

原创 并 查 集

初始化最开始,每个元素各自为战,没有从属关系,因此将其所属(父结点)标为自己。查询用递归的方法来实现对代表元素的查询,逐层访问父结点,直至根结点。判断两个元素是否同属一个集合,只需判断二者根结点是否相同。合并先找到两个集合的根,然后将前者的父结点设为后者即可,反之亦然。...

2022-07-28 20:25:53 141

原创 第五章 神经网络

神经网络(neural networks) 中最基本的成分是神经元(neuron) 模型,在这个模型中,神经元接收到来自 nnn 个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection) 进行传递,神经元接收到的总输入值将于神经元的阈值进行比较,然后通过激活函数(activation function) 处理以产生神经元的输出。理想的激活函数是阶跃函数,常用的激活函数是 Sigmoid :把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。感知机(Perceptron

2022-07-28 11:38:41 421

《中 断》.xmind

中断系统的思维导图

2021-03-12

《操作系统》.xmind

操作系统思维导图

2021-03-11

《计算机组成原理》.xmind

计算机组成原理思维导图

2021-03-10

《 串 》.xmind

串 思维导图

2021-03-02

《线性表》.xmind

线性表思维导图

2021-03-02

《栈和队列》.xmind

栈和队列思维导图

2021-03-02

《线性表》.xmind

线性表思维导图

2021-03-02

《中值定理》.xmind

高等数学《中值定理》思维导图

2021-01-10

《一元函数微分学的几何与物理应用》.xmind

高等数学《一元函数微分学的几何与物理应用》思维导图

2021-01-10

《一元函数微分学的概念与计算》.xmind

高等数学《一元函数微分学的概念与计算》思维导图

2021-01-10

《一元函数积分学的计算》.xmind

高等数学《一元函数积分学的计算》思维导图

2021-01-10

《一元函数积分学的几何应用》.xmind

高等数学《一元函数积分学的几何应用》思维导图

2021-01-10

《一元函数积分学的概念与性质》.xmind

高等数学《一元函数积分学的概念与性质》思维导图

2021-01-10

《微分方程》.xmind

高等数学《微分方程》思维导图

2021-01-10

《数列极限》.xmind

高等数学《数列极限》思维导图

2021-01-10

《函数极限与连续性》.xmind

高等数学《函数极限与连续性》思维导图

2021-01-10

《高等数学预备知识》.xmind

《高等数学预备知识》思维导图

2021-01-10

《二重积分》.xmind

高等数学《二重积分》思维导图

2021-01-10

考研数学二.xmind

考研数学二思维导图

2021-01-10

《多元函数微分学》.xmind

高等数学《多元函数微分学》思维导图

2021-01-10

《特征值与特征向量》.xmind

线性代数《特征值与特征向量》思维导图

2021-01-10

《线性方程组》.xmind

线性代数《线性方程组》思维导图

2021-01-10

《矩阵》.xmind

线性代数《矩阵》思维导图

2021-01-10

《行列式》.xmind

线性代数《行列式》思维导图

2021-01-10

《N维向量》.xmind

线性代数《N维向量》思维导图

2021-01-10

《二次型》.xmind

线性代数《二次型》思维导图

2021-01-10

空空如也

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

TA关注的人

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