- 博客(50)
- 收藏
- 关注
原创 【二叉树,树,森林相互转换】和中缀表达式转后缀
对式子中每个算术表达式都加上括号,然后,从内到外,把里面的运算符移到当前层括号右侧外,最后去掉括号即可。二叉树,树,森林相互转换见上方链接。
2025-03-25 17:14:13
208
原创 白盒测试,黑盒测试,统一过程模型,PERT图/Gant图
统一过程模型(Unified Process,简称UP)是一种软件开发过程模型,它将软件开发视为一个迭代和增量的过程。每个阶段都可能包含一个或多个迭代,允许团队基于反馈和学习调整其方法和产品。统一过程模型鼓励频繁的客户参与和早期暴露风险,以提高项目的成功率。在实际项目中,这两种测试方法会结合使用,以确保软件质量和用户体验。
2025-03-20 22:33:07
234
原创 STL中的哈希表(unordered_map和unordered_set内部使用的数据结构)
在unordered_map和unordered_set中,数据的存储与管理主要依赖于哈希表这种数据结构。
2025-03-14 14:35:20
605
原创 数据流图中父图和子图的平衡
首先,父图中某加工的输入输出数据流必须与他的子图的输入输出数据流在数量和名字上相同。如果父图中的一个输入(或输出)数据流对应于子图中几个输入(或输出)数据流,而子图中组成这些数据流的数据项全体正好是父图中这样一个数据流,那么他们仍然算是平衡的。父图中某加工的输入输出数据流必须与他的子图的输入输出数据流在数量和名字上相同。
2025-03-13 20:47:36
133
原创 static_cast/dynamic_cast/reinterpret_cast/const_cast
主要用于在具有继承关系的类之间进行安全的指针或引用转换,特别是当涉及到向上、向下或侧向转换时。其他三种类型转换各有其特定场景:适用于基本类型的转换及可预见安全性的类间转换。提供了更为激进的类型转换,适用于底层编程需求。const_cast专门用于添加或移除const和volatile属性。
2025-03-04 16:35:35
332
原创 格密码(一)
可以简单地把“格”想象成一个用多个点组成的网格,这个网格可以存在于二维、三维甚至更高维的空间中。每个格点都是由一组基向量(比如二维空间中的两个基向量)通过整数倍的线性组合得到的。二维格的例子这些点构成了格。格:可以看作多维空间中的网格,网格点是基向量的整数倍线性组合。格密码学的难点:在高维空间中,找到这个网格中最短的向量是非常困难的问题。应用:这种难度被用作构建安全的加密算法,尤其是在量子计算环境下的抗攻击加密方案。
2024-09-23 09:34:18
349
原创 字符编码检测
将一串字符或数据与0x80进行按位与操作,通常是为了检查该字符或数据的最高位是否为 1。这在字符编码、标志位检测以及某些数据处理场景中非常常见。
2024-09-09 21:59:43
423
原创 高性能技术之SPDK和DPDK(一)
DPDK(Data Plane Development Kit)和SPDK(Storage Performance Development Kit)都是由英特尔开源的项目,它们都旨在提高特定领域的性能,但是它们的关注点和应用场景有所不同。总的来说,DPDK和SPDK的核心思想大致相同,都涉及到用户空间的直接资源访问和减少操作系统内核的介入,但是DPDK主要针对网络性能,而SPDK主要针对存储性能。SPDK则专注于存储性能的提升,特别是针对NVMe SSD等新一代存储介质的优化。
2024-05-21 13:31:42
1707
原创 分布式存储(一)
在整个流程中,GFS主节点(Master)起到了协调作用,负责管理文件元数据,包括文件的位置信息等。客户端通过与GFS主节点的交互,获取文件的位置信息,并直接与存储文件块副本的存储节点通信进行文件读取操作。在整个流程中,GFS主节点(Master)负责管理文件元数据,包括文件的位置信息等。客户端通过与GFS主节点的交互,获取文件的位置信息,并将文件块发送给存储节点进行写入操作。在GFS中,文件被划分成固定大小的块(chunk),并在多个存储节点上进行复制,以提供高可靠性和高性能的数据访问。
2024-05-18 23:50:20
930
原创 一些数学概念
在数学中,是由变量(比如x)和系数(通常是整数或有理数)组成的表达式。一个多项式可以看作是一系列的项的和,其中每个项由一个系数和一个变量的幂组成。例如,就是一个多项式,其中35和7是系数,x是变量,而x^2x和1(通常省略)是x的幂。是一个数学结构,它由所有以某个变量为未知数的多项式组成,并且在这个集合上定义了加法和乘法两种运算,满足环的数学性质。在密码学中,经常使用的是模q的多项式环,记作R_q或Z_q[X],其中q是一个正整数。
2024-05-17 12:33:53
440
原创 Docker(一)
Docker 通过容器化技术,确保了应用及其依赖可以在任何支持 Docker 的环境中一致地运行,提高了环境的一致性和可移植性。开发者可以将应用及其依赖打包成 Docker 镜像,然后在任何安装有 Docker 的平台上运行这个镜像,实现应用的快速部署和扩展。Docker 利用容器对应用进行隔离,每个容器都有自己的文件系统、网络配置、进程空间等,保证了应用之间的隔离性。:相比传统的虚拟机技术,Docker 容器启动速度快、资源消耗少,因为它不需要启动完整的操作系统,而是共享宿主机的操作系统内核。
2024-05-16 10:01:44
277
原创 格密码学(一)
基于格的密码学是涉及格的密码原语构造的通用术语,无论是在构造本身还是在安全证明中。基于格的结构支持后量子密码学的重要标准。[1] 与更广泛使用和已知的公钥方案(例如RSA、Diffie-Hellman或椭圆曲线密码系统)不同(理论上可以在量子计算机上使用Shor 算法来击败这些方案),一些基于格的结构似乎是抵抗经典计算机和量子计算机的攻击。此外,在某些经过充分研究的计算格问题无法有效解决的 假设下,许多基于格的构造被认为是安全的。
2024-05-12 08:50:21
653
原创 不可重复读,幻读和脏读
幻读一般在读未提交,读已提交,可重复读出现,原因是第一个事务执行时,第二个事务完成了提交,在第一个事务读取的数据中间插入或删除了一些数据,进而造成的第一个事务第二次读取时数据中间多了或者少了一部分数据。而脏读只能在读未提交的隔离级别下发生,事务1修改了一些数据,但是在他提交之前,另外一个事务读取了事务1修改的数据,但是事务1产生了回滚,那么就发生了脏读。不可重复读一般在读未提交,读已提交这两种隔离级别出现,第一次读和第二次读的数据不一致。mysql的四种隔离级别。
2024-04-27 15:59:27
258
原创 undo log和redo log区分
Redo Log(重做日志)和 Undo Log(撤销日志)是数据库系统中用于确保数据完整性和事务一致性的两种不同类型的日志。它们在处理事务、尤其是事务回滚和系统恢复时起着关键作用。
2024-04-27 15:31:11
808
原创 Redis淘汰策略,持久化和集群
Redis 的OBJECT命令提供了多个子命令,用于检查有关键的内部详细信息。:返回用于存储与键关联的值的内部表示类型。FREQ <key>:返回键的访问频率索引。返回的整数与键的最近访问频率的对数成比例。您可以使用这些子命令来深入了解 Redis 如何存储和管理键,包括它们的编码、访问频率、空闲时间和引用计数。例如,您可以使用来检查特定键的编码。类似地,您可以使用相应的子命令来检索特定键的访问频率、空闲时间和引用计数。如果您有特定的键想要查询,可以在使用这些子命令时将<key>
2024-03-17 13:17:19
1107
原创 Redis为什么快?
在迁移过程中,Redis会将新哈希表中的所有键值对插入到原哈希表中对应的位置上,并将原哈希表中被迁移的键值对删除。在渐进式rehash阶段,Redis会创建一个新的哈希表,将新的哈希表的大小设置为原来的两倍,并将原来的键值对逐个地迁移到新的哈希表中。这个阶段中,Redis只会访问新的哈希表,以保证所有的键值对都能够被正确地访问和操作。在渐进式rehash开始时,Redis会创建一个新的哈希表,将新哈希表的大小设置为原来的两倍,并将新哈希表的状态设置为"rehashing",表示正在进行rehash操作。
2024-02-20 10:29:13
4393
4
原创 MySQL事务原理的分析
脏读:脏读只会在read uncommitted隔离级别下发生。在这个隔离级别下,一个事务可以读取到另一个未提交的事务所修改的数据,因此可能会读取到无效的数据。不可重复读:不可重复读可能在read committed、repeatable read和serializable隔离级别下发生。
2024-02-03 19:48:14
728
原创 MySQL索引的原理和SQL优化策略
在InnoDB存储引擎中,索引分为聚簇索引和辅助索引两种类型。聚簇索引是指基于表的主键构建的索引,它决定了表中数据的物理存储顺序。也就是说,聚簇索引中的键值按照主键的顺序来排序,并且每个叶子节点存储的是整个表行的数据。因此,通过聚簇索引可以快速地定位到特定主键的行数据,而且相邻的行数据在物理上也是相邻存储的。如果表没有主键,则InnoDB会选择一个唯一的非空索引作为聚簇索引,如果没有这样的索引,则会隐式地创建一个隐藏的主键。
2024-02-01 22:24:57
986
原创 实现分布式锁
分布式锁是一种用于协调分布式系统中多个节点之间并发访问共享资源的机制。在分布式系统中,由于存在多个节点同时访问共享资源的可能性,需要使用分布式锁来保证数据的一致性和正确性。今天要实现的是分布式场景中的互斥类型的锁。下面时分布式锁的实现重点。
2024-01-20 17:48:57
829
原创 C语言实现读写锁和try...catch逻辑
代码示例创建了多个读者线程和一个写者线程来访问共享资源(这里是一个文件)。在读者线程中,使用了文件I/O函数打开文件、映射文件到内存,并对文件内容进行了读取。在写者线程中,也使用了文件I/O函数打开文件、映射文件到内存,并对文件内容进行了写入。完整代码如下,简洁易懂。
2024-01-13 19:41:02
821
2
原创 内存池的实现场景分析
本文中所介绍的内存池主要是先判断需要的内存是多大,然后,大于指定的最大值的话,那么需要重新给分配一大块,存储这一大块的结构体所占用的内存是从内存池中分配的,就是便利遍历的池子看是否有满足要求的;然后如果需要的内存小于指定值,那么就是去内存池中,遍历链表,然后找到满足需要内存要求的块,分配内存给他即可。总的来说,个人觉得这个内存池的实现就是使得每次申请者需要的内存不多时,直接去内存池拿,不需要再去进行系统调用。如果实际开发需要的话,也可以去使用一些开源的内存池组件tcmalloc/jemalloc等。
2024-01-09 20:54:14
444
原创 如何打开ubuntu的某个端口
检查防火墙工具ufw是否已安装。UFW是Ubuntu上的一个简化的防火墙配置工具,可以轻松管理端口和防火墙规则。如果显示版本信息,则表示ufw已经安装。:如果连接的是腾讯云/阿里云服务器,需要在对应网页上进行安全策略的加入才能真正打开该端口。验证端口是否已经开放。可以执行以下命令来查看ufw的状态和已开放的端口:`如果要放开其他端口,请将80替换为相应的端口号。
2024-01-07 11:28:56
2396
原创 密码学基础
MD5 可以用来生成一个 128 位的消息摘要,它是目前应用比较普遍的散列算法,具体的应用场景你可以自行参阅。虽然,因为算法的缺陷,它的唯一性已经被破解了,但是大部分场景下,这并不会构成安全问题。但是,如果不是长度受限(32 个字符),不推荐继续使用 MD5。密码学是一门深奥的学科,在使用的时候,你要记住下面这些内容:对称加密具备较高的安全性和性能,要优先考虑。在一对多的场景中(如多人登录服务器),存在密钥分发难题的时候,我们要使用非对称加密;不需要可逆计算的时候(如存储密码),我们就使用散列算法。
2023-12-23 14:39:44
850
原创 基础组件:手写一个线程池(C语言版)
线程池(消费者)线程池中的线程取出任务,执行任务,线程调度(mutex+condition)队列(任务:任务的上下文,任务执行函数)那么怎样确定线程池中的线程数量?构成:生产者线程(发布任务)
2023-12-04 21:14:30
489
原创 服务端定时器方案(红黑树,时间轮,最小堆)
其中find_nearest_timer()接口是针对于网络事件和定时事件在同一线程中的处理的专用接口,其他接口是都用。1. --》通常用usleep(time) 去触发定时器,time要小于最小时间精度。expire是多长时间后执行此定时事件,进而会回调cb。让用户使用定时器的接口,通常为下面几个。定时任务会在单独的线程中进行检测。2. --》 通常采用时间轮,通常用于大量定时任务的情况。
2023-12-04 17:21:02
466
原创 reactor模式的一些总结
必须使用非阻塞IO,边缘触发的话,在一次事件循环要把readbuffer读空,如果不读空,只有在下次事件触发才能读取剩下的。如果此时readbuffer已经为空了,但是我们使用的是阻塞IO的话,此时程序就会被阻塞。:当某个socket的接收缓冲区有新数据分节到达,然后select 会报告这个socket描述符可读,但是,协议栈检验时,将数据丢弃了,那么此时调用read将无数据可读,如果此时socket设置为阻塞,则会阻塞线程。检测IO就是检测IO的就绪状态,也就是 IO多路复用(检测多个连接的就绪状态)
2023-12-02 20:06:51
974
1
原创 C/C++协程
协程(Coroutine),又称为微线程或者轻量级线程,是一种用户态的、可在单个线程中并发执行的程序组件。协程可以看作是一个更轻量级的线程,由程序员主动控制调度。它们拥有自己的寄存器上下文和栈,可以在多个入口点间自由切换,而不是像传统的函数调用那样在一个入口点开始、另一个入口点结束。协程的概念最早可以追溯到1963年,由Melvin Conway提出。经过多年的发展,协程已经成为了现代编程语言和框架中的一种重要编程范式。
2023-12-01 18:52:20
1334
1
原创 百万并发的reactor网络模型
并发量是指系统在同一时间内能够处理的请求数量,它主要关注的是系统能够同时处理多少个请求。而吞吐量则是指在一定时间内,系统能够处理的请求总数,它更关注的是系统整体的处理能力。下面是百万并发reactor网络模型的代码实现,实测连接的并发量可达100W以上,可以基于此模型构建对应的应用。很多朋友在网络编程时,在对代码测试时,分不清并发量和吞吐量的关系。把对网络IO的处理装换为对事件的处理,进行封装。
2023-11-27 10:42:19
416
原创 练手:实现一个C++线程池
之前学习了:可变参数;bind等C++11特性,下面用这些重点知识等实现一个C++线程池。这部分代码如果无法理解,可以参考往期的博文。下面是使用该线程池的测试代码。
2023-10-15 16:11:36
126
1
原创 TCP三次握手解读
tcp连接的双方要确保各自的收发消息的能力都是正常的。连接发起方发送最后一个ACK,对方如果没收到会再次发FIN,所以要守着等待一段时间。只有发起连接终止的一方会进入 TIME_WAIT 状态。ACK:响应PSH:有DATA数据传输。TIME_WAIT等待。
2023-10-03 19:59:50
112
原创 C++11多线程thread
下面以 std::mutex 为例介绍 C++11 中的互斥量用法。std::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。std::mutex 的成员函数构造函数,std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于unlocked 状态的。lock(),调用线程将锁住该互斥量。
2023-09-25 15:55:56
211
1
原创 C++新特性复习四:STL标准库
STL容器,可将其分为四类:序列容器、有序关联容器、无序关联容器、容器适配器序列容器:** 无序关联容器**容器适配器:序列容器描述了线性的数据结构(也就是说,其中的元素在概念上” 排成一行"), 例如数组、向量和 链表。关联容器描述非线性的容器,它们通常可以快速锁定其中的元素。这种容器可以存储值的集合或 者键-值对。栈和队列都是在序列容器的基础上加以约束条件得到的,因此STL把stack和queue作为容器适配器来实现,这样就可以使程序以一种约束方式来处理线性容器。
2023-09-23 13:53:51
72
1
原创 C++新特性复习三:lambda表达式
如果捕获列表为[&],则表示所有的外部变量都按引用传递给lambda使用;如果捕获列表为[=],则表示所有的外部变量都按值传递给lambda使用;匿名函数构建的时候对于按值传递的捕获列表,会立即将当前可以取到的值拷贝一份作为常数,然后将该常数作为参数传递。
2023-09-20 07:41:51
95
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人