自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 测试的常见分类

从⽤⼾⻆度出发设计测试⽤例,很容易的知道⽤⼾会⽤到哪些功能,会遇到哪些问题,锻炼测试员的产品思维测试⽤例是基于软件需求开发⽂档,不容易遗漏软件需求⽂档中需要测试的功能。⽩盒测试的测试⽬的是,通过检查软件内部的逻辑结构,对软件中的逻辑路径进⾏覆盖测试;设计功能测试⽤例,参考产品规格说明书进⾏⽤例的编写,具体的测试⽤例需要使⽤⿊盒设计测试⽤例的⽅法,如等价类、边界值、判定表法、正交法、场景法、错误猜测法等。功能测试就是对产品的各功能进⾏验证,根据功能测试⽤例,逐项测试,检查产品是否达到⽤⼾要求的功能。

2025-02-14 15:21:25 982 2

原创 【测试报告】个人博客系统

登录即可查看自己与其他用户已发布的博客,也可以使用自己的账号发布博客,通过使用Selenium定位web元素、对获取到的元素进行操作等,对个人博客系统进行测试,测试的核心内容包括。在博客列表页界面,点击任意一篇当前账号所发布博客的“查看全文”按钮,跳转到博客详情页,在博客详情页中点击“删除”按钮,即可删除该篇博客且跳转到博客列表页且被删除的文章不存在。登录成功将跳转到博客列表页,博客列表页可以查看当前博客发布数量、当前用户的头像、用户名、查看已发布博客的有限博客信息(包括标题、时间、相关内容)等信息。

2025-02-10 15:55:10 629

原创 【linux网络(7)】数据链路层详解

如果说网络层解决的是数据从A主机发到B主机的问题, 那么数据链路层解决的就是数据从当前路由器转发给下一台路由器的问题.本章重点:本篇文章会讲解以太网协议, MTU对上层协议的影响, ARP协议, DNS技术等. 本篇文章结束, 标志着对整个Linux网络的认知学习就结束了.

2025-02-07 17:16:57 619

原创 【linux网络(6)】网络层IP协议详解

首先要清楚一点:IP协议提供了将数据从A主机送到B主机的能力.本章重点:本篇文章着重讲解IP协议的的格式, 以及格式字段所对应的细节. 会讲解网段划分和IP地址的一些特性. 最后会讲解路由过程.结合前面所学,我们可以知道, 其实传输层提供的是"策略",比如各种机制,网络层提供的是"能力”, 真正跑腿干活,执行操作的是网络层.

2025-02-04 17:27:27 1009

原创 【linux网络(5)】传输层协议详解(下)

强烈建议先看传输层协议详解(上)后再看这篇文章. 上一篇文章讲到TCP协议为了保证可靠性而做的一些策略, 这篇文章会深度解析剩下的策略.现在再来看, TCP是面向字节流的就大概能理解了. TCP只管迅速的给对端发包, 不管一个数据要分几次发, 一次性发多少, 总之它只管尽快将包发过去.换句话说,就是站在TCP的角度,没有报文的概念,所有的数据都是放在一个字符数组的缓冲区里,只是单纯的把数据推送过去,但是到底有没有推完一个,一个半…)都由网络决定.

2025-02-02 16:58:34 801

原创 【linux网络(4)】传输层协议详解(上)

上一篇文章介绍了应用层中最重要的http协议,本篇文章将讲解传输层的两个协议: TCP和UDP. 由于UDP是一种简洁的协议,所以本篇文章的核心放在TCP协议上!注: 如果对HTTP协议了解不深刻,建议先阅读这篇文章HTTP协议详解本章重点:本篇文章会讲解UDP协议的报文格式, 深度解析UDP协议是怎样进行解包/封装的. 之后会讲解TCP的报文格式, 以及TCP协议中的确认应答机制,以及最重要的三次握手和四次挥手问题.任务:对于如何协议都要解决的问题: 如何分离(封装的逆过程), 如何分用?

2025-02-01 09:56:09 1031

原创 【linux网络(3)】应用层HTTP协议详解

在理解了网络套接字编程后, 后续的文章会从应用层到链路层, 详解的讲解每一层的协议都做了些什么工作, 并且会拆分协议的格式内容, 深入的理解网络四层模型.本章重点:本篇文章会先带大家了解序列化和反序列化过程.然后会带大家进入到HTTP协议的学习, 包括URI, 协议格式, HTTP的方法以及常见的状态码和header. 当然,由于TCP协议是最常用的, 所以讲解的内容是基于TCP协议的.

2025-01-27 14:06:32 634

原创 【linux网络(2)】网络基础之套接字编程

本篇内容是基于上一篇的,如果还未学习上一篇文章的同学请移步初识网络本章重点:本篇文章会认识, 端口号, 网络字节序等网络编程中的基本概念. 会带大家初识TCP和UDP协议. 并且通过套接字编程, 带大家实现一个简单的TCP/UDP服务器.网络套接字编程是掌握网络至关重要的一步, 学会了这个网络编程的流程和底层逻辑, 下次遇见其他语言封装好的网络编程函数,你甚至能想象到它底层是如何实现的. 所以学技能不能只学接口,要学底层原理和系统调用, 这些你看所有封装好了的函数都是透明的.

2025-01-25 11:15:45 533

原创 【linux网络(1)】初识网络, 理解四层网络模型

本篇文章开始,会正式学习网络,网络编程的本质依然是使用系统调用,所以这里就不另外开辟专栏来讲解网络,而是直接将系统和网络放在一起.本章重点:本篇文章着重讲解网络的基本概念,和网络中的四层模型以及它们对应的协议,最后会带大家初步了解网络传输的基本流程,并且会给大家讲解IP地址和MAC地址的基本概念和区别,为后续学习打下基础.本篇文章着重讲解网络的基础知识,意在为后面的网络学习打下基础.

2025-01-23 20:28:44 513

原创 【linux线程(4)】初识线程池&手撕线程池

线程池在校招面试阶段经常被要求手撕,可见它的重要性如何.本章重点:本篇文章会先介绍什么是池化技术,然后详细讲解什么是线程池,以及如何手撕线程池,并且会给大家拓展如何将线程池设计为单例模式,以及读写锁的使用方法,最后会讲解如何在校招中遇见手撕线程池时,快速的写出代码.大家可能听说过线程池,进程池,对象池,甚至是内存池等概念,那么到底什么是池?它们有什么共同特质?池化技术:池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源 .

2025-01-21 10:06:36 551 1

原创 【linux线程(3)】生产者消费者模型详解

学习进程和线程也很久了,它们具体能解决什么问题?有什么实际的运用?本章重点:本篇文章着重讲解基于多线程下的生产者消费者模型的概念以及实现.不仅如此,文章还会拓展基于使用信号量实现的环形队列版的生产者消费者模型生产者消费者模型是我们学习线程中的一个很重要的模型,它的思想有助于帮我们解决后续的难题,并且校招时,有可能会让手撕一个生产者消费者模型,所以同学要学扎实了.

2025-01-20 09:22:42 797

原创 【linux线程(2)】线程互斥与线程同步

如果你不了解线程的基本概念,请你先移步上一篇文章线程的基本概念本章重点:本篇文章着重讲解线程互斥以及线程同步的相关概念,以及如何实现它们.周边概念包括临界资源,原子性,互斥量等也会在本文当中提及.总的来说,多线程场景下还是比较容易出现各种错误的,所以在编写多线程的代码时,一定要对底层足够熟悉,对互斥锁以及条件变量要有一定的理解才能解决问题.一定要注意条件变量是在加解锁之间使用的.

2025-01-18 09:23:00 681

原创 【linux线程(1)】什么是线程?怎样操作线程?

可能大家对多线程这三个字早有耳闻,那么到底什么是线程?为什么要有它?它和进程之间有什么联系?本章重点:本篇文章着重讲解线程的基本概率,以及进程和线程的对比,最后会讲解在Linux下如何创建,控制,终止,等待线程.程序中的一个执行路线就叫做线程。一个进程至少要有一个执行线程,单个进程本身就是一个执行流,所以单个进程某种意义上也是一个线程(是主线程).线程在进程内部运行,本质是在进程地址空间内运行.在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化.

2025-01-16 15:34:36 990 1

原创 【linux进程信号(2)】信号的保存,处理以及捕捉

大家下来可以去试试将所有的信号都设置为阻塞,或者忽略,会发生什么?一旦这样做,进程运行起来后使用CTRL+c或者CTRL+/都不能终止进程,并且使用kill命令也无法杀掉进程.即使如此,即使所有信号都被屏蔽或忽略,但第九号信号是无法被屏蔽和忽略的,所以任何情况下都可以使用kill -9 pid来杀掉一个进程.

2025-01-14 15:31:10 633 1

原创 【linux进程信号(1)】信号的概念以及产生信号的方式

在实际生活中有很多信号的例子,比如红灯停,绿灯行.我们是怎样知道这些信号的呢?首先要识别这个信号,并且要知道如何处理这个信号,在Linux系统中的信号也是如此,至少要做到两点: 识别信号,处理信号.本章重点:本篇文章着重讲解Linux下信号的基本概念以及产生信号的四种方式,本篇文章会带领大家入门信号这一篇章.1.方式一: 终端按键。

2025-01-12 17:15:46 797

原创 【linux进程间通信(2)】理解共享内存以及进程互斥概念

在学习Linux中的程序地址空间时,善于观察的同学可能会发现在栈区和堆区中间有一个共享区,这是用来干啥的?今天就来揭晓一下!本章重点:本篇文章着重介绍进程间通信的一种方式: 共享内存的概念,接口使用以及它的底层原理,最后会介绍进程间互斥的一些基本概念进程间通信的方式远不止管道和共享内存这两种,还有很经典的消息队列以及信号量等方式这里并没有过多讲述,因为我们只是学习重点,并不是全部都要学会,但是学有余力的同学还是很有必要区了解一下的.

2025-01-10 23:19:57 1014

原创 【linux进程间通信(1)】匿名管道和命名管道

众所周知,进程运行是具有独立性的,想要进程间进行通信就要打破这种独立性,而进程间通信的本质其实是让不同的进程看见同一份资源!本章重点:本篇文章会介绍进程间通信中常见的几种方式,并且着重讲解匿名管道和命名管道的这两种通信手段的原理和代码的实现.首先要回答什么是管道,在学习Linux指令时我们使用过竖划线 | 也就是管道,把从一个进程连接到另一个进程的数据流称为“管道”在管道通信中,管道的本质其实就是一个被系统打开的文件,然而用管道进行通信的本质就是让不同的进程看见相同的资源(文件).

2025-01-09 20:12:26 691

原创 【linux基础I/O(2)】理解文件系统|文件缓冲区|软硬链接|动静态库

对于文件来讲,有打开的在内存中的文件,也有没有打开的在磁盘上文件,上一篇文章讲解的是前者,本篇文章将带大家了解后者!本章重点:本篇文章着重讲解在磁盘中的文件的存储方式以及inode相关概念.在这之前会解释C语言缓冲区的概念以及作用,最后会带大家了解软硬链接如何创建,软硬链接的区别,理解动静态库.Linux的基础IO部分已经全部讲解完毕,下一章将进入进程信号的学习.掌握文件的inode相关知识可以更好的帮助我们理解文件在打开和关闭时分别是怎样运作的!

2025-01-06 21:10:30 831 1

原创 【linux基础I/O(1)】文件描述符的本质&重定向的本质

在Linux系统下,一切皆文件”,相信你也听过这句话,,那么怎样理解这句话呢?学会这篇文字,你就能理解了。本章重点:本篇文章着重讲解I/O的四个系统调用接口, 以及文件描述符fd的认识与fd的本质, 最后讲解应该怎样理解Linux下一切皆文件这一说法.在此之前,会先复习一下C语言的文件相关的库函数。文件描述符是学习Linux下I/O的关键,而基础IO的知识将会一直陪伴我们到学习Linux网络和高级IO,掌握文件描述符fd的本质对后续的学习至关重要!

2025-01-04 22:05:41 933 1

原创 【递归、搜索与回溯算法】二叉树中的深搜

本章内容是介绍关于二叉树中的dfs算法应用,它是续接上上一篇文章【递归、搜索与回溯算法】递归篇的。在⼆叉树中,常⻅的深度优先遍历为:前序遍历、中序遍历以及后序遍历。因为树的定义本⾝就是递归定义,因此采⽤递归的⽅法去实现树的三种遍历不仅容易理解⽽且代码很简洁。并且前中后序三种遍历的唯⼀区别就是访问根节点的时机不同,在做题的时候,选择⼀个适当的遍历顺序,对于算法的理解是⾮常有帮助的。

2025-01-01 17:34:12 866

原创 【linux进程(6)】进程替换&自定义简易shell

其实有六种以exec开头的函数,统称exec函数:函数解释:命名理解:这些函数原型看起来很容易混,但只要掌握了规律就很好记。下面将介绍其中4个函数的使用,其余两个也差不多:第一个:第二个:第三个:第四个:事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。这些函数之间的关系如下图所示。

2024-12-31 15:56:13 527

原创 【linux进程(5)】进程终止&进程等待

【代码】【linux进程】进程终止&进程等待。

2024-12-30 21:44:05 356

原创 【项目日记(9)】项目整体测试,优化以及缺陷分析

整个项目的代码和框架就已经介绍完毕了,现在要对项目进行测试了。本章重点:本篇文章着重讲解本项目是如何测试的,以及本代码的一些效率上限问题,最后会引入基数树来对项目整体做优化。

2024-12-30 21:43:24 856

原创 【项目日记(8)】第三层:页缓存的具体实现(下)

请先看完上一篇文章页缓存的具体实现(上)页缓存结构的讲解已经结束,现在回头来看前面设计的这三层缓存结构,可谓是非常之巧妙,第一层线程缓存是无锁的,申请/释放内存非常高效,而第二层中心缓存是用的桶锁,在大多数情况下也没有竞争锁的问题,效率也非常高,所以现在能理解为什么要设计三层而不是两层,甚至是一层,一方面是为了效率的考量,另一方面是为了可以方便合并相邻的空闲页。对代码的拓展:#else// sbrk unmmap等#endif。

2024-12-29 19:42:17 806

原创 【项目日记(7)】第三层:页缓存的具体实现(上)

在页缓存这一层中,负责给中心缓存分配大块儿的内存,以及合并前后空闲的内存,这一层为整体加锁!本章重点:本篇文章着重讲解内存池第三层:页缓存的基本成员变量和函数,以页缓存的具体结构是怎样的。了解完基础结构后,会详解讲解中心缓存层来申请内存时的具体步骤!页缓存分配内存的一环设计的是非常的巧妙,但是页缓存真正巧妙的地方是在合并空闲内存的一环!对代码的拓展:我们会发现页缓存结构中调用了好几次向系统申请内存的函数,这个地方只做了解,会用接口就行。

2024-12-29 19:41:56 1038

原创 【项目日记(6)】第二层:中心缓存的具体实现(下)

本篇文章在上一篇文章的基础上,对中心缓存的释放内存做补充。本章重点:本篇文章着重讲解中心缓存这一层释放内存的全部过程,包括如何在线程缓存中回收小块儿内存,以及如何将自己的大块span内存还给页缓存。中心缓存这一层的所有内容已经讲解完毕,很巧妙的是,中心缓存使用的是桶锁,只有两个不同的线程同时进入到同一个桶中才会有锁竞争问题,这也是这个项目比较快的原因之一。总的来说,中心缓存的作用是承上启下,负责给线程缓存分配切分好的小块儿内存,以及从线程缓存中回收内存。

2024-12-28 17:14:16 1094

原创 【项目日记(5)】第二层:中心缓存的具体实现(上)

中心缓存起到一个承上启下的作用,它负责给线程缓存分配小块儿的内存,并且负责从页缓存申请大块儿内存。本章重点:本篇文章着重讲解中心缓存的结构包括span类的具体成员.并且会讲解中心缓存是如何给线程缓存分配内存并且是如何向页缓存申请/内存的!

2024-12-28 17:13:54 855

原创 【项目日记(4)】第一层:线程缓存的具体实现

本项目涉及多个.h 和.cpp 文件,由于排版问题,在后面的每一部分代码实现中,我无法全部指明属于哪个文件。其中.h文件放类的结构和函数声明,.cpp文件放各个函数的定义。本章重点:本篇文章着重讲解ThreadCache线程缓存结构的具体实现,包含内存对齐的方法,慢启动算法,申请/释放内存的函数以及向中心缓存中索要/还回内存的函数!本篇文章大多数都是代码实现,请大家耐心学习。

2024-12-27 10:19:37 495

原创 【项目日记(3)】高并发内存池的整体框架设计

现代很多的开发环境都是多核多线程,在申请内存的场景下,必然存在激烈的锁竞争问题。malloc本身其实已经很优秀,那么我们项目的原型tcmalloc就是在多线程高并发的场景下更胜一筹,所以这次我们实现的内存池需要考虑以下几方面的问题。1.性能问题。2.多线程环境下,锁竞争问题。3.内存碎片问题。thread cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表,其实就是我们在定长池中实现的FreeList链表。

2024-12-27 10:19:12 1043

原创 【项目日记(2)】开胃菜--设计定长内存池

作为程序员(C/C++)我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们就先来设计一个定长内存池做个开胃菜,当然这个定长内存池在我们后面的高并发内存池中也是有价值的,所以学习他目的有两层,先熟悉一下简单内存池是如何控制的,第二他会作为我们后面内存池的一个基础组件。

2024-12-26 15:19:00 883

原创 【项目日记(1)】高并发内存池的项目介绍

这篇文章主要是对这个项目进行大致介绍,没有代码,大部分都是文字性的内容,大家可以当成看故事一般轻松愉悦的阅读。所谓"池化技术",就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。通俗点说,这完全类似于父母给我们生活费的情景,你是感觉你每次需要花钱的时候每次向父母要更方便,还是希望父母一次给多一点,等过一段时间花完后再向父母要更方便?答案显然是后者!

2024-12-26 15:18:07 864

原创 【linux进程(4)】进程地址空间&进程调度队列

先来一个小小的回顾。我们在讲C/C++语言的时候,老师给大家画过这样的空间布局图:可是我们对它并不理解,并且实际上这张图在语言层是不存在的,它是操作系统里才有的东西!我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:所以之前说"程序的地址空间"是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?看图:1. 每个进程都要有自己的地址空间和页表,当有多个进程时,0S是如何管理地址空间的?先描述,再组织!2. 地址空间的本质就是内核中的一个结构体对象。3. 子进程的地址

2024-12-25 15:11:00 1076

原创 【递归、搜索与回溯算法】递归篇

递归、搜索与回溯算法这三种是相互依存,不可分割的。如果递归是一个大集合,那么搜索就是递归的一个分支,而回溯又是搜索集合的分支,它就是在搜索的基础上多了一步。因此递归是基础!

2024-12-10 13:53:01 1018 2

原创 【基础算法总结】优先级队列(堆)篇

优先级队列(堆)是一个非常重要的数据结构,它的本质是二叉树的数组形式存储,它主要包含有大根堆/小根堆,它的核心之一是"向下调整算法"。它在解决topk问题等多种问题上都有作用。下面将通过几道题目来进一步理解这个数据结构。在上面的几个题目中,求TopK问题和数据流的中位数问题是堆最经典的两种应用,在以后的接触中只要出现了这两类问题,兄弟们应该能立马想到堆,这应该是刻在骨子里的记忆。

2024-12-09 16:45:07 698

原创 【基础算法总结】队列+宽搜篇

与栈类似,队列也是一种基础的,并且常用的存储数据的容器,它有先进先出的特性。纯队列的算法题比较少,队列这种数据结构一般用于服务宽搜算法(宽度优先遍历/层序遍历/bfs算法)。bfs算法的应用十分广泛,比如树结构中的应用,图论中的应用,最短路问题,迷宫问题,拓扑排序问题等都可用bfs解决。本篇文章选取的题目都是bfs算法在树结构中的应用。通过上面若干道题目可知,使用队列实现宽搜算法的代码是有大致模版的,其核心代码基本一样。

2024-12-09 16:44:39 960

原创 【基础算法总结】栈篇

栈是一种常用的数据结构,它具有后进先出的特点。使用栈时可以使用STL库里的satck容器,也可以用数组模拟。解决与栈相关的算法题难点在于:能否通过分析题目,想到用栈解决。一般这类题目的本质还是模拟,借助栈这个数据结构模拟操作。下面通过若干道题来探索一下题目中使用栈解决问题的一些特性。通过上面的几道题目不难发现,使用栈解决的相关题型基本都是模拟题,可以根据题目选择用stack容器还是数组模拟栈,并且重点依然要画图模拟过程,再将过程转化成代码。

2024-12-07 10:06:51 1086 2

原创 【基础算法总结】哈希表/set/map篇

哈希思想是算法中一个十分重要的思想,体现的是一种映射关系,而哈希表就是基于哈希思想实现的存储数据的容器。哈希表的作用是快速查找某个元素,时间复杂度为O(1),时间复杂度为O(n)。使用哈希一般有两种方式:(1)STL中的 unordered系列容器。(2)用数组模拟简易哈希表。这种情况一般用于处理字符串中的"字符"或是当数据范围很小的时候使用。下面将通过若干道题目进一步体会哈希表的使用。

2024-12-07 10:05:59 3421 58

原创 【基础算法总结】字符串篇

字符串 string 是一种数据结构,它一般和其他的算法结合在一起操作,比如和模拟,高精度加减,双指针,动态规划等算法结合,所以有关字符串类的题型是多种多样的。通过本篇文章挑选的一些题目来熟悉有关字符串接口的使用。字符串类型的算法题型是多种多样的,并且也可以使用多种字符串函数接口了解决问题。

2024-10-08 19:16:10 1306 102

原创 【基础算法总结】链表篇

有关链表的算法题也是一类常见并且经典的题型,这些题要使用数据结构中我们手搓的链表结构,也要使用STL中的 list 容器。下面是几点常用操作的总结(1)善于画图。(2)引入虚拟头结点。方便处理边界情况,就是当没节点第一次头插或尾插的时候的那个判断,引入虚拟头结点就可以避免这个判断(写成 ptail = newHead)。(3) 不要吝啬空间,大胆定义变量。(4)快慢双指针的使用。主要应用是判环,找链表中环的入口,找链表中倒数第 n 个节点。(5)

2024-10-04 13:26:35 3089 89

原创 【linux进程(3)】进程优先级&命令行参数&环境变量

本篇文章详细介绍了什么是进程优先级以及优先级的特征,什么是命令行参数,什么是环境变量和它的使用修改。内附图文,一看就懂。

2024-10-02 08:58:27 971 64

空空如也

空空如也

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

TA关注的人

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