自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【笔试训练】day24-day48合集

设原来字符串长度为n,所以我们只需要维护一个区间为n的子串,从中间分开,看分开的两个区间中1的数量是否相等。由于非0即1,1的数量确定,0的数量也就确定。值得注意的是,求树的高度时不能自顶向下,这样总的时间复杂度就是N^2.为了避免重复计算一些节点的高度,可以采用自底向上的方式。于是我们枚举长度为n子串的左端点,右端点也就确定了,在用前缀和O(1)的时间复杂度内求出这个区间左右两半1的数量。这题的要求又是一个谜。空间复杂度为1,这意味着都不能递归,因为递归开栈的空间复杂度就不止O(1)了。

2024-05-10 23:34:46 392 5

原创 【多态】初次遇见我就爱上了多态

表面上来看,虚函数就是被关键字virtual修饰的函数。而一旦被声明成了虚函数,将来通过父类指针或者引用就能区分出应该调用父类的函数还子类的函数。虚函数不能被static修饰,也通常不能同时是内联函数。要想区分两个函数是重写,重载还是重定义,首先观察其函数名是否一样。如果不一样,那就直接拜拜。再观察两个函数是否在不同的域中。如果在同一个域中且返回值类型不同,那就构成重载。如果一个在子类,一个在父类,那么再观察这俩函数是否是虚函数。

2024-04-23 21:52:59 2057 2

原创 【第三章】内核对象

本文章以及后面的所有文章的出处都是来自《windows核心编程》这本书,且只是对一些重点且基本的概念做一些笔记。想要更为深入的了解这windows可以自己去看这本书。,提取码为:kkkk。

2024-10-24 21:40:38 786

原创 【IO模型】select、poll、epoll的区别

不同的I/O模型在处理I/O操作时,资源利用效率和响应速度各有不同。更具体的,每当使用 epoll_ctl 添加或修改一个文件描述符时,epoll 内部会将该文件描述符的各种信息创建一个结构体。在阻塞I/O模型中,系统调用(如read或recv)在等待I/O操作完成时,整个进程会被阻塞,直到数据被成功读入或写入。select函数通过将所有的文件描述符集合传递给内核,然后内核检查这些描述符的状态,如果有描述符就绪,select返回。返回就绪的文件描述符的数量,如果超时返回0,出错返回-1。

2024-08-08 19:45:33 1119 1

原创 NAT、服务代理、内网穿透

主机A先访问服务器C,于是服务器就拿到了主机A的出入口路由器的地址加端口号的映射,主机B也是一样。然后服务器把A的出入口入口器的地址交给B,把B的出入口路由器的地址交给A.此后,主机AB就能直接进行连接了而不需要服务器中介。具体的,在不用局域网中的两台主机,其私有IP可以是一样的,这样就有效的解决了IP地址不够的问题。简单来说,主机A和主机B处于不同的内网中,主机A想要和主机B进行通信,可以先让主机B和服务器C建立连接,主机A再和服务器C建立连接,这样就能通过服务器来实现主机A和主机B的通信了。

2024-08-08 17:06:04 1242

原创 【数据链路层】ARP协议

以太网" 不是一种具体的网络, 而是一种技术标准;既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

2024-08-08 15:50:11 1015

原创 【网络层】IP报文解析和网段划分

如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet (公网)上, 理论上 使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址。(WAN)的连接与通信。注意,局域网和广域网的概念是相对的,我们认为一个路由器的子网可以是称为一个局域网,路由器“外面”的网络可以称为广域网,但路由器又可能处于运营商路由器的子网构建的局域网中。的设备之间的通信,WAN口地址,即广域网接口地址,是路由器从互联网服务提供商(ISP)处获得的公网IP地址。

2024-08-04 15:35:44 1212 1

原创 【传输层协议】UDP和TCP协议

换个问题,为什么三次握手就能保证建立可靠的连接呢?确认对方主机状态及收发能力的最小次数。三次握手保证了双方网络的连通性,也保证了双方连接的意愿,还保证了双方拥有接收和发送数据的能力。如果只有一次握手,意味着只要发送方发送连接请求,连接就会被建立。那这样服务端容易收到SYN洪流攻击,即服务端建立大量的连接对象消耗太多资源从而导致奔溃。两次握手也是类似,服务端收到一次连接,只要服务端发出一次ACK,就说明连接就建立起来了(发送方可以不要这个ACK,而是只发SYN)。

2024-07-31 13:46:16 1283

原创 【Socket编程】了解应用层协议HTTP

HTTP又叫超文本传输协议。它定义了客户端和服务端之间该如何通信,以交换或者传输超文本(如HTML文档)。HTTP协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。其实,在之前的自定义网络版计算器中我们就已经知道,,也可以称为某种结构体。HTTP协议也同样如此,只不过这种约定会比我们之前自定义的要严谨一些。下面我们来看看HTTP协议请求与响应的格式。

2024-07-26 15:03:21 1139

原创 进程关系和守护进程

会话是一个或者多个进程组的集合,一个会话可以包含多个进程组。每一个会话也有一个会话ID。会话的主要作用是提供一种机制,以便将相关的进程组织在一起,并对它们进行统一的控制。我们在上面的例子中就可以看到会话ID从上面结果来看,sleep 100 、sleep 200、sleep 300用管道连接之后组成了一个进程组,而且还同属于一个会话ID。作业是针对用户来讲,用户完成某项任务而启动的进程,一个作业既可以只包含一个进程,也可以包含多个进程,进程之间互相协作完成任务, 通常是一个进程管道。

2024-07-25 13:01:52 1106

原创 【Socket 编程】应用层自定义协议与序列化

根据前面的学习,我们可以自己简单模式一个用户层的协议,来实现网络版的计算器。创建套接字进入监听状态获取连接获取请求,将其反序列化,得到一个包含客户端数据的结构体处理业务将应答消息序列化,得到一个字符串,发送给客户端上述步骤重复执行关闭连接,关闭套接字创建套接字连接服务端将序列化后的数据打包成一个请求发送给服务端获取服务端的应答,将应答反序列化获取结果关闭连接,关闭套接字。

2024-07-24 00:17:24 930 1

原创 【智能指针】智能指针的使用及其原理

构造时传递给SmartPtr一个指向资源的指针,之后我们就不用再显式的释放资源了,因为SmartPtr会自动帮我们释放。前两种智能指针实际上没有很好的解决智能指针之间的拷贝问题,于是C++11又设计了另一种可以支持拷贝且不会造成指针悬空的智能指针,即。为了专门解决shared_ptr的循环引用问题,C++11又提供了一种weak_ptr的智能指针。支持拷贝构造和赋值构造,从管理角度来说,拷贝一个智能指针其实就是将资源管理权交给另一个。对象来说,它的内置资源指针就悬空了。,就像指向资源的指针一样。

2024-07-22 17:30:36 1118

原创 【C++异常】异常的使用及其原理

如果Division发出的异常Func函数没有捕捉到,此时会马上退回到main函数的栈中,

2024-07-22 14:56:47 971

原创 【Socket编程】基于TCP协议实现客户端与服务端的通信

由于TCP是面向连接的,所以在创建套接字之后还需要进入监听状态,监听状态下可以获取客户端的请求。获得请求之后,服务器需要接受连接,之后再处理事务。

2024-07-21 09:26:18 591 1

原创 【Socket 编程】基于UDP协议建立多人聊天室

对于服务端来说,除了要接收消息之外,还要实现一个路由转发模块,该路由转发模块可以将相应发送给所有连接的客户端。而对于客户端来说,除了要发送消息给聊天室,还要能实时看到其它所有客户端的消息。下面来看看具体实现的代码,代码只给出核心模块,其余代码模块代码可以借鉴我之前的博客。具体来说,服务器类实现的功能只有收消息。

2024-07-19 16:09:28 603

原创 【Socket 编程 】基于UDP协议实现通信并添加简单业务

在了解了Socket编程的相关接口之后,我们来尝试通过代码实现简单场景来理解UDP协议通信。

2024-07-18 16:37:16 1112

原创 【网络】Socket编程

我们知道通过IP地址我们能在网络中唯一标识一台主机,这也就意味着,只要我知道你的IP地址,就能向你的主机发送数据。所以我们需要有端口号。端口号就是主机唯一标识进程的一个16字节整数,综上所述,网络中的两个进程要想相互通信,通信的数据得明确四个属性:源主机的IP+Port,目标主机的IP+Port。我们知道,数据在内存中的存储方式有大小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大小端之分,如果传输数据双方的主机一个是大端存储,一个是小端存储,假设我们不做任何处理就将数据发送能够给对方,那。

2024-07-18 11:04:26 1184

原创 【网络】掌握网络基础概念

TCP/IP是一组协议的代名词,它还包含了许多协议,组成了TCP/IP协议簇。具体的TCP/IP协议套件是一个分层模型,相比于OSI七层模型,TCP/IP模型更加简洁和实用。意思就是假如主机A发送一个数据帧给主机B,假设在A的传输层中得到的数据是XXX,那么在B接收到数据帧后解包,在B的传输层中得到的数据也是XXX。值得注意的是:即使在网络的角度上来看,七层模型设计的非常完善,但是在实际的操作过程中,会话层和表示层一般是不能接入到操作系统中的,所以在工程实践中,最终实现的大多都是5层协议。

2024-07-17 16:24:44 1285

原创 【多线程】线程安全的单例模式

单例模式是一个设计模式,其目的是确保一个类只有一个实例,并提供一个全局的访问点来访问该实例。单例模式常用于需要控制资源数量的场景,比如数据库连接池、日志管理器等。下面介绍常见的单例模式的实现方式。

2024-07-17 12:56:43 771

原创 【第四章】测试分类

白盒测试适合需要深入了解代码和内部逻辑的场景,主要用于单元测试和代码审查黑盒测试适合功能测试和用户视角的测试,主要用于功能测试,系统测试灰盒测试适合需要结合内部知识和外部功能的综合测试,主要用于回归测试和集成测试。

2024-07-17 10:55:19 841

原创 【第三章】Bug篇

这是一个很常见的问题,作为测试人员,我们既要保证产品上线后的质量,也要保持与开发人员的积极沟通。有些时候,开发人员可能会不认可测试人员提出的bug,认为bug分级太高了,或者认为一些小bug不算bug从而拒绝改bug。软件测试贯穿于软件的整个生命周期,具体的软件开发到维护的每一个阶段都需要有测试步骤去保证产品质量。通过定义bug的级别,开发人员可以根据优先级来处理bug,除此之外,bug级别也能检测开发人员的开发质量。次要:没有功能缺失,但是出现界面缺陷,性能缺陷。严重:部分主要功能散失,数据部分丢失。

2024-07-17 08:33:49 1045

原创 【线程安全】关于死锁问题

如果允许有外部干预,比如把其中某个人的资源强行释放给对方,比如强行把A的苹果拿给B,B收到苹果就把梨释放了,A也就拿到了梨。这样就AB就脱离了死锁状态。死锁检测算法用于在系统允许死锁发生的情况下,定期或在特定情况下检测系统是否处于死锁状态,并采取措施恢复。通过上面的例子,首先苹果和梨同一时间只能时是A或者B拥有,这就满足了。,对于B也是这样,如果没有外部干预,AB就进入了一直等待的情况即。A有一个苹果,B有一个梨,但是A想要的是梨,B想要苹果。A等梨,但是又不释放苹果,这就是。,这里就不做介绍了。

2024-07-15 15:04:13 520

原创 【C++11常见新特性(三)】线程库

在构造(或移动(move)赋值)时,unique_lock 对象需要传递一个 Mutex 对象作为它的参数,新创建的 unique_lock 对象负责传入的 Mutex 对象的上锁和解锁操作。比如:一个线程对变量number进行加一100次,另外一个减一100次,每次操作加一或者减一之后,输出number的结果,要求:number最后的值为1。注意:原子类型通常属于"资源型"数据,多个线程只能访问单个原子类型的拷贝,因此在C++11中,原子类型只能从其模板参数中进行构造,,从而产生编译错误或运行时错误。

2024-07-14 23:27:57 1036

原创 【常见的C++11新特性(二)】可变模板参数、lambda表达式、包装器、bind

(即没有名字的函数)。

2024-07-14 00:20:37 646 1

原创 【测试实例】登录界面的测试

下面对各个测试模块进行简单的测试,注意我这里只是简单给出一些用例。对于一个登录界面,我们可以进行以下方面的测试。

2024-07-13 20:07:30 430

原创 【多线程】线程池的原理及其实现

在有任务时就将其分配给某个线程执行,当线程执行完自己的任务之后并不会销毁而是等待下一个任务。,特别是在处理大量短时间任务时。简单来说,线程池就是。

2024-07-12 17:10:59 444

原创 【POSIX信号量】基于环形队列的生产消费模型

同样的,整个模型有1个数据缓冲区即环形队列,2个角色即生产者和消费者,3种关系即生产者和生产者、生产者和消费者、消费者和消费者之间得到关系。如果缓冲区已满,生产者将释放互斥锁并继续检查缓冲区状态,直到有空闲空间。POSIX和System V一样,都是unix下的一套管理方法,下面介绍POSIX标准下的信号量。之前的生产者消费者模型是基于阻塞队列queue来实现的,其空间可以动态分配,依靠互斥锁和条件变量来实现同步机制。V信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源的目的。

2024-07-12 13:38:00 790

原创 【第二章】开发模型和测试模型

对于迭代模型,如果需求发生变化,比如用户又觉得之前的版本比较好,那该模型直接回退到对应的版本就行。以⼈为例,⼈类的⽣命周期是从⽣命孕育的开始,中间会经历幼年,童年,少年,⻘年,⽼年,最终直⾄死亡。增量开发模型,⿎励⽤⼾反馈,在每个迭代过程中,促使开发⼩组以⼀种循环的、可预测的⽅式驱动产品的开发。增量模型是将总需求切分成不同的模块,这些不同的模块组合起来才能达要求,而迭代模型是在一个完整的版本进行不断地更新。W模型(W-Model)是对V模型的扩展,它强调在每个开发阶段都进行并行的测试活动,

2024-07-11 23:55:33 903

原创 【多线程】生产者消费者模型(代码实现)

生产者消费模型是一种常见的多线程编程模式,广泛应用于解决并发编程中的数据共享和任务调度问题。在该模型中,我们将生产数据并放入缓冲区的线程称为生产者线程,反之,从缓冲区中获取数据的线程就称为消费者线程。生产者和消费者通过共享的缓冲区进行通信,并且使用同步机制(如互斥锁和条件变量)来协调操作,防止数据竞争和资源浪费。缓冲区是指一个用来存放数据的数据结构,通常是一个队列。为了便于记忆,可以将生产者消费模型看成是由。

2024-07-10 21:36:10 620

原创 【多线程】线程同步--条件变量的原理及其使用

线程同步意味着在多线程并发执行中,协调线程之间的执行顺序,以确保共享资源被正确访问和修改。线程同步的维护本质就是在安排线程之间的执行顺序。那么在linux中是如何维护线程同步的呢?本篇文章将围绕这个为题展开叙述。动态初始化cond:要初始化的条件变量attr:条件变量的属性,通常是NULL静态初始化。

2024-07-10 19:37:03 858

原创 【线程安全】线程互斥的原理

即使是多处理器平台,访问内存的 总线周期也有先后,一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期。线程互斥(Mutual Exclusion)是多线程编程中的一个重要概念,用于解决。要想做到一个线程访问临界区时阻止其它线程访问,我们就需要使用到。:指向互斥锁属性对象的指针。对某个互斥量进行加锁或者解锁,成功返回0,失败返回错误码。为了方便阐述,后面出现的锁和互斥量不做过多区分。表示上锁(),上锁之后其他线程不能访问临界区,上图中表示使用互斥锁实现线程互斥的示意图,

2024-07-09 14:06:15 1927

原创 【第一章】初识测试开发

软件测试就是验证软件产品特性是否满⾜⽤⼾的需求。

2024-07-08 14:08:16 749

原创 【高阶数据结构】跳表

所以,我们需要一种方案,使得有序链表中的层数不是固定的,且高层数的节点不能太多。越高层的指针指向的数据更远也更大,这样一来,查找某一个数据时就不用遍历整个链表了,而是通过指针(也称为索引)当然,由于是随机产生层数,最坏情况就是每个节点只有一层或者每个节点的层数都是节点的总数,这样查找等操作时间复杂度就退化到了O(N).,假设每个节点的层数是2,这样的跳表的时间复杂度查找、删除、添加的时间复杂度都是O(N)的。:每个节点的多个指针指向的值从大到小竖直排列,有效指针的数量就是节点的层数。整个有序链表的效率。

2024-07-05 09:57:49 754

原创 【高阶数据结构】B-数、B+树、B*树的原理

B树:有序数组+平衡多叉树B+树:有序数组链表+平衡多叉树B*树:一棵更丰满的,空间利用率更高的B+树。

2024-07-04 15:52:39 983

原创 【MySQL】用户管理

刚创建的用户是没有任何权限的,我们可以使用以下sql基于某个用户指定权限。mysql5.7或者更早的版本可以使用以下sql修改密码。这样就给了tsx用户所有数据库的所有表的所有操作权限。mysql8.0以后可以用以下sql修改密码。可以使用以下sql来回收某个用户的某些权限。可以使用以下sql查看某个用户具有的权限。本质上就是在user表中添加了一行记录。修改权限有时会不能马上生效,可以使用。MySQL中的用户,都存储在系统。可以使用以下sql删除用户。下面给出数据库权限的列表。

2024-06-28 14:22:21 490 2

原创 【MySQL】视图

它是基于一个SQL查询结果的表。视图本身不存数据,数据依然存在基础表中,视图存的是一个查询结果集。看上去和真实的表一样,视图包含一系列带有名称的列和行数据。使用以下sql可以删除视图。修改基表,同样会影响视图。MySQL的视图是一个。修改视图数据会影响基表。

2024-06-28 13:17:00 356

原创 【MySQL事务】深刻理解事务隔离以及MVCC

只要使用begin或者start transaction开启事务,就必须要通过commit提交,否则即使设置了autocommit也不会自动提交。事务可以手动回滚,同时,当操作异常时,MySQL会自动回滚对于InnoDB每一条SQL语句都默认封装成一个事务,自动提交。(除select外)隔离级别越高,安全性越高,并发性能越低不可重复读的重点在于修改,幻读的重点在于新增和删除mysql的默认隔离级别是RR综上,我们可以从readview的角度来思考RR和RC级别的不同之处在RC级别下,

2024-06-26 21:37:47 1474 13

原创 【MySQL】索引的原理及其使用

16KB的页大小是一个经过多年实践验证的设置,MySQL和InnoDB开发团队已经对其进行了大量优化,确保其在各种应用场景下都能提供良好的性能和稳定性。下面来看一个page的内容:不同的page在mysql中都是16kb,其内部有prev和next两个指针构成双向链表。一个表文件可能需要诺干个page来存储数据,于是,对数据库中表的管理就变成了对page的管理了。值得注意的是,

2024-06-21 15:10:12 1178 1

原创 【MySQL】表的内连和外连

左外连接返回左表的所有行,包括右表中与左表条件匹配地行。如果左表的某一些行在右表没有与之匹配的行不,则右表的列会显示null。内连接是SQL中常用的连接类型之一,用于将两个表中满足条件的行合并成一个结果集。含义和左外连接类似,只不过是以右表为主,如果左表没有与之条件匹配的行,合并后该行的左表信息显示NULL。笛卡尔积的大小:例如表A有n行,表B有m行,那表AB的笛卡尔积的结果集为n*m行。其中如果两个内连的表是同一张表,我们称之为自连接。在mysql中,笛卡尔积是指两个表没有指定任何连接条件的连接结果。

2024-06-13 20:33:33 922 1

原创 【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

md5()是一种常见的哈希函数,接收一个字符串然后返回一个128位的哈希值,通常32位的十六进制表示。注意:length函数返回字符串的长度是。(现代的密码加密已经不再用md5了)。,有点类似c语言中的三目运算符。查询在2小时内发布的贴子。password()函数。md5函数的常见用途是。

2024-06-13 17:19:45 511

空空如也

空空如也

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

TA关注的人

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