自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【测试】测试分类

动态测试(dynamic testing),指的是实际运⾏被测程序,输⼊相应的测试数据,检查实际输出结果和预期结果是否相符的过程,所以判断⼀个测试属于动态测试还是静态的,唯⼀的标准就是看是否运⾏程序。来 实现重复的和⼀致的回归测试。但是,灰盒测试没有⽩盒测试详细和完整,⿊盒测试是覆盖产品范围最⼴的测试,因此灰盒测试基本是不能够替代⿊盒测试,否则需要很⼤的代价,设计⾮常多的⽤例。集成测试也称联合测试(联调)、组装测试,将程序模块采⽤适当的集成策略组装起来,对系统的⼝ 及集成后的功能进⾏正确性检测的测试⼯作。

2025-05-15 20:07:12 1027

原创 【测试】用例篇

笔试的时候编写测试用例,需要按照excel表格的方式来答题。(会涉及到测试用例的要素)面试的时候回答测试用例题,按照思维导图的方式一一道来即可(不会涉及到测试用例的要素)

2025-05-15 18:17:18 882

原创 【测试】BUG

什么是BUG???程序与规格说明之间的不匹配才是错误问题出现的版本、问题出现的环境、问题出现的步骤、预期结果、实际结果。

2025-05-14 20:45:29 330

原创 【测试】测试基础概念

用户需求:就是一句话,但是能不能真的实现,不一定软件需求:或者叫功能需求,该需求会详细描述开发⼈员必须实现的软件功能。软件需求是测试⼈员进⾏测试⼯作的基本依据。

2025-05-14 19:04:55 578

原创 【智能指针】

当资源对应的引用计数减为0时对应的资源才会被释放,因此资源1的释放取决于资源2当中的prev成员,而资源2的释放取决于资源1当中的next成员。而资源1当中的next成员的释放又取决于资源1,资源2当中的prev成员的释放又取决于资源2,于是这就变成了一个死循环,最终导致资源无法释放。1、现在main函数刚开始,node1和node2分别有一个shared_ptr指向,所有node1和node2的引用计数都是1.// 编译错误,拷贝构造被禁用。->next 也持有 node1,node1的引用计数+1。

2025-05-10 18:08:40 671

原创 数据结构---【二叉搜索树】

数据大于根 往右走 小于根往左走//1、判断树是否为空 为空创建节点 把数据放入//2、树不为空 首先判断 这个要插入的数据是否重复 重复直接返回,cur指向要插入数据的位置 perv指向要插入数据的父亲节点//3、找到位置//4、将父亲的左/右指向插入的数据节点(看num的值大于prev->data还是小于,大于就是right指向node,小于就是left。

2025-04-30 16:48:22 667

原创 数据结构--【堆】

放到最后一个 + 向上调整删除:顶部挪到最后一个 + 向下调整。

2025-04-26 17:35:42 467

原创 数据结构--【二叉树】

一个结构体就是一个树节点。

2025-04-25 18:07:12 791

原创 数据结构--【栈和队列】

特殊情况:判断队列是否为空 为空时要将头尾指针都指向newnode。eg:top=2,ps[0] ps[1] 刚好等于top的值。因为top初始化的时候是0,所以直接返回top即可。链式结构只要插入数据,就要重新向内存申请空间。使用指针指向队头,从头往后走,计数器++使用while循环 top--直接对top--操作即可。

2025-04-23 21:40:02 477 1

原创 【项目日记(三)】

SERVER服务器模块实现:1、Buffer模块:缓冲区模块提供的功能:存储数据,取出数据实现思想:1、实现缓冲区得有一块内存空间,采取vector<char>vector底层其实使用的就是一个线性的内存空间2、要素:a、默认的空间大小b、当前的读取数据数据位置c、当前的写入数据位置3、操作a、写入数据:当前写入位置指向哪里,就从哪里开始写如果后面剩余空间不够了1、考虑整体缓冲区空闲空间是否足够(因为读位置也会向后偏移,前面有可能会有空闲空间)

2025-04-21 14:23:20 1045

原创 【项目日记(二)】

我们的这个高并发服务器是可以支持各种不同的协议,我们进行协议支持的时候,socket有数据到来了,我们去接收数据的时候,缓冲区中的数据不足一条完整的请求,或者比一条完整的请求多。我们就得考虑将socket缓冲区中的数据进行处理,那么数据处理到一半的时候,就得考虑在下次数据到来的时候继续处理,因此,我们就需要给服务器中的每一个连接都设置一个协议处理的上下文,专门用来控制请求数据接收和处理的节奏的。2、上下文的类型不能固定,因为服务器支持的协议可能会不断增多,不同的协议,可能会有不同的上下文结构。

2025-04-16 14:50:54 748

原创 【项目日记(一)】-仿mudou库one thread oneloop式并发服务器实现

客户端处理思想:事件驱动模式事件驱动处理模式:谁触发了我就去处理谁。( 如何知道触发了)技术支撑点:I/O的多路复用 (多路转接技术)1、对所有客户端进行IO事件监控、哪个客户端触发了事件,就去处理谁处理:接收它的请求,进行业务处理,进行响应。优点:单线程操作,操作都是串行化的,思想简单,(不需要考虑进程或者线程间的通信问题,以及安全问题)缺点:所有的事件监控和业务处理都是在一个线程中完成的,因此很容易造成性能瓶颈适用场景:客户端数量较少,且业务处理快速简单的场景2、

2025-04-15 13:52:35 665

原创 【Linux高级IO(三)】Reactor

这种方式避免了服务器一直阻塞在等待新连接的操作上,服务器可以在等待新连接的同时处理其他任务,提高了资源利用率和程序的响应速度。函数可以被多个不同的监听套接字复用,只要这些套接字需要处理新的客户端连接。函数主要负责将套接字添加到事件监听机制中,并为不同的事件类型注册相应的回调函数,它专注于事件的管理和调度。回调函数,服务器可以高效地处理这些连接请求,而不会因为某个连接请求的处理而阻塞其他连接的接受。函数则专注于处理新的客户端连接,包括接受连接、创建新的套接字、设置新连接的属性等操作。

2025-04-08 21:32:11 635

原创 【Linux高级IO(二)】初识epoll

1、向上交付 2、将数据交付给tcp的接收缓冲区 3、查找rb_tree, 看fd,并且看有没有关心EPOLLIN或者EPOLLOUT 4、如果有,构建就绪节点,插入到就绪队列中。返回值是一个文件描述符,创建一个struct file结构体,指向epoll模型,返回的是在进程文件描述符表中的一个fd,通过这个fd就能找到epoll模型。这意味着tcp会向对方通告一个更大的窗口,从而从概率上让对方一次给我发送更多的数据!2、就绪队列(双链表)某个节点的事件就绪了,就将他链入就绪对列中。

2025-04-07 21:04:19 813

原创 【Linux高级IO(一)】理解五种IO模型

1、应用层read&write的时候,本质把数据从用户写给OS ---- 本质就是拷贝2、IO = 等待 + 拷贝(大部分时间在等待,等到有数据了才进行拷贝)要进行拷贝,必须先判断条件成立。这个条件就是读事件就绪,就是读缓冲区有足够的数据可以读 写事件就绪就是发送缓冲区中要有足够的空间什么叫做高效IO呢?单位时间内,IO过程中,等的比重越小,IO效率就越高!其实几乎所有提高IO效率的策略,本质就是让等的比重变小。

2025-04-01 19:22:33 923

原创 【Linux网络(七)】数据链路层

5、NAT技术。1、认识MAC地址Mac地址用来在同一个局域网中,区分特定的主机。1、MAC地址用来识别数据链路层中相连的节点;2、长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)3、, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突;也有些网卡支持用户配置mac地址).MAC地址 像身份证号(唯一标识设备硬件),IP地址 像邮寄地址(逻辑定位网络位置)

2025-03-27 20:09:50 957

原创 【Linux网络(六)】网络层协议 IP协议

目录1、IP报头2、网段划分3、IP地址数量限制4、私有IP和公有IP5、路由IP协议的本质工作:提供一种能力,将数据跨网络从A主机送到B主机! 可是有能力不一定能确保每次都能成功。这就需要传输层提供策略和网络层提供能力,两者相结合,确保成功!8位服务类型:3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于

2025-03-27 10:57:56 1015

原创 【Linux网络(五)】传输层协议

客户端在三次握手中,认为只要把三次握手中第三次报文发出,就认为连接建立好了。万一第三次报文c已经发出了,可是s并没有收到,这时c就认为连接已经建立成功了,可是s却认为连接,没有建立成功。这时c向s发送一次数据,s就会向c发送携带RST字段的报文,告诉c连接建立失败,要重新建立连接。

2025-03-26 09:45:42 833

原创 【Linux网络(四)】HTTP协议详解

URL中的问号是特殊符号,它代表问号后的所有信息都是某些参数。

2025-03-24 14:18:01 849

原创 【Linux网络(三)】网络基础套接字

socketTCP是面向连接的 ,服务器一般是比较”被动“的,服务器要一直处于一种,一直等待连接到来的状态。就需要进行监听socketr第一个参数: socket 刚刚打开的,并且已经设置为listen状态的套接字文件描述符建立连接(TCP,客户端)

2025-03-18 18:01:46 471

原创 【Linux网络(二)】网络基础套接字

意思就是TCP协议在发送数据时, 不管一次性发送多少数据, 也不管数据一共要发送几次,它只关心能尽快的将数据从客户端发送到服务器. 所以说TCP在发送数据时, 完整的数据可能是: “abcdefg123456"但是第一次可能发送了"abcdefg1”,第二次再发送"234",再发送"56". 这都是不定的. 而UDP是面向数据报的, 它每次发送数据时, 会将完整的数据全部保存在一个报文中, 然后将这个数据报整体发送过去。1、网络协议中的下三层,主要决定的是,数据安全可靠的送到远端机器。

2025-03-16 17:16:13 960

原创 【Linux网络(一)】初识网络

网络其实就是进程间通信的一种,跨网络通信是在不同主机上进行的(比如在西安要访问qq,而qq的服务器进程可能在深圳),而通信的复杂程度是和距离成正比的。在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突;交换机---划分碰撞域 任何主机都可以向局域网中发数据,但是任何时刻只允许一台主机向局域网中发数据,避免碰撞。长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)

2025-03-10 21:00:15 630

原创 【Linux】多线程---线程池(3)

池化技术是指提前准备一些资源,在需要时可以重复使用这些预先准备的资源。其实就是线程池在线程池启动时就创建多个线程来备用,同理,对象池和内存池也就是创建多个对象/空间备用。提高性能。通过重用资源,减少了创建和销毁资源的时间,从而提高了资源的使用效率降低系统开销, 避免了频繁地向操作系统申请和释放资源的开销简化代码。通过封装资源管理逻辑,使得应用程序代码更简洁易。

2025-03-10 08:53:54 627

原创 【Linux】多线程---生产者消费者模型(2)

生产者消费者模型的本质就是通过一个阻塞队列来将生产者和消费者解耦合的模型.可以将这个模型比作一个超时,生产者生产了数据(商品)后,不会直接拿给消费者使用,而是将数据(商品)先加入到超市,让超市帮我们卖数据(商品).同理,对于消费者来说它并不会直接去生产者的厂家直接拿数据(商品),而是去超市中购买数据(商品).这样生产者和消费者两个对象就解耦合了。

2025-03-06 21:08:58 860

原创 【Linux】多线程(1)

什么是线程?线程是操作系统调度的基本单位。什么是进程?内核观点:进程是承担分配资源的基本实体如何理解我们以前的进程?操作系统以进程为单位,给我们分配资源,我们当前的进程内部,只有一个执行流!!复用数据结构和管理算法,struct task_struct ---------Linux没有“真正”(只是没有像Windows一样设置struct tcb)意义上的线程,而是用“进程”(进程的内核数据结构)模拟线程。

2025-03-05 15:28:23 766

原创 【Linux】进程信号

当捕捉到信号之后,将默认动作变为了自定义动作。(ctrl+c就不会退出了)键盘数据是如何输入给内核的,ctrl+c又是如何变成信号的键盘被按下,肯定是OS先知道的!OS怎么知道键盘上有数据了??linux下一切皆文件,因此键盘也是文件。读取键盘数据就是将键盘数据读取到键盘文件的缓冲区中。那么OS如何知道键盘中有数据了??数据层面上,CPU是不和硬件打交道的。但是在控制层面,CPU是要能读取外设的。

2025-02-27 13:48:38 856

原创 【每日一题】

假如要将奇数放在数组前面,偶数放在数组后面,就可以最左边放一个指针(left)最右边放一个指针(right) 如果是不满足前后条件的,就交换left与right。因此,如果我们将每一类的元素全部异或起来,那么其中一类会得到 x1​,另一类会得到 x2​这样我们就找出了这两个只出现一次的元素。** 归并排序(Merge Sort)** 是建立在归并操作上的一种有效、稳定的排序算法。,表示空字符串可以通过任何字典拆分(即没有字母是需要拆分的)。,并确保合并后的数组仍然按非递减顺序排列,我们可以利用。

2025-01-07 16:25:07 894

原创 【Linux】进程间通信

去掉进程和共享内存的关联。

2024-11-19 23:53:34 1092 1

原创 【Linux】动静态库

1、制作静态库之前对动静态库的认识:libXXX.a-----静态库静态链接:将库当中的代码拷贝到最终的可执行程序里,也就是,自己的源代码会变成.o,将我用过的代码考到我的可执行程序里,从此我就不用再依赖这个静态库了。libYYY.so------动态库动态链接:是产生关系,调用这个库函数的地址填进去就好了gcc默认是动态链接 库的名称是去掉前缀去掉后缀把我们提供的方法给别人用:1、把源代码直接给他 2、把我们的源代码打包成库 就相当与头文件+库 给他库里面的文件

2024-11-11 11:40:34 768

原创 【Linux】文件系统

删一个文件的时候,拿到文件编号,到inode Bitmap里找到文件的inode编号,看它的位图是1说明他是有效的,然后再去inode Table读取它的属性,获得对应的块的块号,在Block Bitmap中将所有块号全部清零,然后再去inode Bitmap里将对应的清0,就完成了文件的删除。每一个inode都有自己的inode编号(inode的设置,是以分区为单位的,不能跨分区) inode表示文件的所有属性,文件名,并不属于inode内的属性。那么,我们怎么知道一个文件的inode编号?

2024-10-30 21:14:40 864

原创 【Linux】基础IO-下

目前我们认为,只要将数据刷新到内核,数据就可以到硬件了。操作系统会自动帮我们把数据写到磁盘/显示器。

2024-10-28 18:56:42 1090

原创 【Linux】基础IO-上

1、文件 = 内容 + 属性2、文件分为打开的文件和没打开的文件3、打开的文件是谁打开的?答案是:进程!---本质是研究进程和文件的关系文件被打开必须先被加载到内存,一个进程可以打开多个文件。因此,在OS内部一定存在大量被打开的文件。OS要管理这些被打开的文件--先组织,再描述---再内核中,一个被打开的文件必须有自己的文件打开对象,包含文件的很多属性。struct XXX{文件属性;对打开文件的管理就是对链表的增删查改。4、没打开的文件:在哪里放着?我们最关注什么问题?

2024-10-24 21:49:28 752

原创 【Linux】进程控制

当我们要想自己对代码区进行写入时,OS会对我们的行为进行拦截,但是现在我们调用的是系统函数,对代码区进行写时拷贝的工作是由OS来完成的,因此,是可以的。c语言调用库函数不成功的时候,返回值告诉我们这个函数的情况,结果对不对,至于结果不对的原因,比如当库函数调用失败了,C语言就会将我们的errno全局变量设置成对应的数字,这个数字表示我们。上面代码的现象:前5s子进程运行,运行5s,子进程变为僵尸状态,父进程运行5s子进程此时还是僵尸进程,之后,父进程回收子进程,然后僵尸进程没有了,父进程单独运行5s。

2024-10-22 19:13:21 711

原创 【Linux】进程--详细解释进程

1、运行:进程是pcb+对应的代码和数据有一个运行队列。

2024-10-14 23:08:21 1072

原创 c++进阶----map和set

更新后parent平衡因子 ==1 or -1,说明parent所在的子树高度变化,会影响祖先,需要沿着root的路径往上更新---------(继续执行1、2)更新后parent平衡因子 ==2 or -2,说明parent所在的子树高度变化且不平衡,对parent所在子树进行旋转,让它平衡 -----(插入结束)更新后parent平衡因子 ==0,说明parent所在的子树高度不变,不会再影响祖先,不用再继续沿着root的路径往上更新------(插入结束)同上两个指针,小的就是差集,小的++;

2024-09-29 20:08:14 1161

原创 C++进阶--异常

class Exception //基类public:,_id(id){}protected:int _id;class SqlException : public Exception //sql类public:{}return str;private:class CacheException : public Exception //cache模块public:{}return str;

2024-09-23 14:24:30 818

原创 C++进阶--二叉树进阶

请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。4、InOrder不需要返回值的原因:只需要在原树上对指针的指向进行改变,就好了,而且不需要在此函数中拿到头节点。在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。、最多查找高度次,走到到空,还没找到,这个值不存在。,统计成功后,给定单词就可快速找到其出现的次数,,通过英文可以快速找到与其对应的中文,英。,或者是具有以下性质的二叉树。

2024-09-19 15:48:36 723

原创 C++进阶--多态

多态的构成条件:1、必须通过基类的指针或者引用调用虚函数。2、调用的函数必须时虚函数,且派生类必须对虚函数进行重写(三同:函数名,返回值类型,参数类型)public:virtual void BuyTicket() const {cout

2024-09-06 13:09:39 744

原创 C++进阶--继承

以前我们接触的复用都是函数复用,继承是类设计层次的复用。继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许在保持原有类特性的基础上及逆行扩展,增加功能,这样可以产生新的类,称为派生类。1.1定义格式派生类 继承方式 基类1.2继承基类尘缘访问方式的变化1、基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,只是语法上限制派生类对象不管在类里面还是在类外面都不能去访问它。

2024-09-04 18:09:37 972

原创 C++模板进阶

优点:模板复用了代码,节省资源,更快的迭代开发,c++的标准模板库(STL)因此而产生增强了代码的灵活性缺点:1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-09-03 20:58:04 898

空空如也

空空如也

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

TA关注的人

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