自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 使用三个线程交替打印ABC

【代码】使用三个线程交替打印ABC。

2024-03-29 11:57:06 157

原创 C++11新特性

*4、空指针:**空指针从指向NULL变为指向nullptr;通过将指针初始化为 nullptr(nullptr直接代表指针空值类型),可以很好地解决 NULL 遗留(NULL可以代表一个整型)的问题。**2、auto关键字:**用于定义变量,编译器可以自动判断的类型(前提:定义一个变量时对其进行初始化);**6、右值引用和移动语义:**这两个功能都是为了让程序员有意识减少进行深拷贝操作。**1、成员变量默认初始化:**构建一个类的对象不需要用构造函数初始化成员变量。

2024-03-22 15:27:55 444

原创 快速次幂题

拿到一个数组,每次操作会将除了第x个元素之外的元素都翻倍,一共操作q次,求操作结束后所有元素之和。

2024-03-18 15:09:00 130

原创 快速次幂

题目:拿到一个数组,每次操作会将除了第x个元素之外的元素都翻倍,一共操作q次,求操作结束后所有元素之和int main() { int n, q, xi; const long long mod = 1e9 + 7; cin >> n >> q; vector<long long> a(n); vector<l...

2024-03-18 15:08:00 126

原创 合并 K 个升序链表

【代码】合并 K 个升序链表。

2024-03-13 15:44:11 127

原创 K 个一组翻转链表

【代码】K 个一组翻转链表。

2024-03-12 22:38:29 113

原创 排序链表(自底向上归并排序)

时间复杂度:O(nlogn),空间复杂度:O(1)

2024-03-11 21:24:09 121

原创 DMA和零拷贝

(1)mmap+write(两次系统调用,三次拷贝):调用mmap()系统函数会直接把内核缓冲区的数据映射到用户空间,应用进程和操作系统内核共享这些数据;(3)真正的零拷贝技术(一次系统调用,两次拷贝):支持SG-DMA的话,DMA将磁盘数据拷贝到内核缓冲区,再用DMA将数据从内核缓冲区拷贝到网卡缓冲区。“零”指的是没有在内存层面拷贝数据,全程没有CPU只有DMA在搬运数据。数据拷贝过程:磁盘缓冲区-(DMA)内核缓冲区-(CPU)用户缓冲区-(CPU)socket缓冲区-(DMA)网卡缓冲区。

2024-03-11 16:35:42 450

原创 数组中的第K个最大元素

【代码】数组中的第K个最大元素。

2024-03-11 12:19:03 215

原创 MySQL实现事务隔离的原理

3.如果min_trx_id<trx_id<max_trx_id:在m_ids中,说明未提交,不可见;2.如果trx_id>max_trx_id,说明该版本在创建read view后才生成的,所以该版本对该事务不可见。1.如果trx_id<min_trx_id,说明已经提交了,该版本对该事务可见。create_trx_id:创建该read view的事务的事务id。max_trx_id:创建read view后,下一个事务的id。min_trx_id:m_ids的最小值。一、read view四个字段。

2024-03-11 11:51:20 367

原创 判断链表回文

【代码】判断链表回文。

2024-03-10 21:02:02 187

原创 键入网址到网页显示,期间发生了什么?

6.服务器处理请求并返回响应。3.DNS解析(域名解析)2.生成http请求信息。7.接收响应并显示网页。5.发送http请求。

2024-03-10 17:18:31 116

原创 MySQL三种日志

2.WAL(write-ahead logging)先写日志技术:MySQL的写操作不是立即写到磁盘上的,而是先写到buffer pool里的缓存页生成脏页,再将脏页产生的变化写入到redo log buffer中,事务提交的时候将redo log buffer中内容循环写到磁盘中的redo log file中。2.在事物提交前,记录更新前的数据到undo log里,回滚的时候读取undo log来进行回滚。1.作用:用于备份(记录全量日志,不小心整个数据库的数据被删除了)、主从复制。

2024-03-10 16:59:46 720

原创 协程简单介绍

协程(Coroutine)是一种用户态的轻量级线程,它可以在单线程内实现多个执行线程的切换和调度,而无需依赖操作系统的线程管理机制。协程可以简化并发编程,因为它们可以在同一线程内执行多个任务,并且可以通过显式的切换来控制任务的执行顺序和并发度。总的来说,协程是一种轻量级的并发编程模型,具有低成本、高性能和简化编程等优点,适用于需要高并发性能和简洁代码的场景。由于协程是在单线程内执行的,因此可以避免多线程并发时的锁竞争和资源争夺问题,从而提高了并发程序的性能。,并在其中实现了一个简单的协程函数。

2024-03-09 15:38:26 442

原创 协程介绍

协程(Coroutine)是一种用户态的轻量级线程,它可以在单线程内实现多个执行线程的切换和调度,而无需依赖操作系统的线程管理机制(简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换)。协程通常被称为“轻量级线程”或“用户级线程”。协程的主要特点和优点包括:轻量级: 协程的创建和切换成本很低,因为它们不需要像操作系统线程那样依赖内核态的线程切换。相比之下,创建和切换操作...

2024-03-09 15:35:00 237

原创 C++ 17新特性

除了上述特性外,C++17 还引入了其他一些有用的特性,如类模板参数推导、内联变量、constexpr if、标准库的增强等。这些新特性可以提高代码的清晰度、可读性和性能,并且是 C++ 编程中不可或缺的一部分。C++17 是 C++ 语言的一个重要版本,引入了许多新特性和改进,以提高开发效率和代码质量。

2024-03-09 14:22:38 836

原创 redis中zset的原理

一、zset有序集合的原理如果有序集合元素个数少于128个且元素值小于64字节,使用压缩列表(新版本已经废弃压缩列表改用listpack数据结构了)如果不满足上述条件,采用跳表作为redis的底层数据结构二、压缩列表1.由连续内存块组成的顺序性数据结构2.根据数据大小和类型的不同进行数据内存的分配3.缺点:插入过大或过多的数据会导致“连锁更新”,影响访问性能三、跳表1.在链表的基...

2024-03-08 17:11:00 332

原创 redis中的zset的原理

如果有序集合元素个数少于128个且元素值小于64字节,使用压缩列表(新版本已经废弃压缩列表改用listpack数据结构了)头结点直接创建最大层数(64),其他节点生成小于0.25的随机数就一直创建层,一旦随机数超过0.25就确定该节点层数。1.在链表的基础上改进而来的,是一种多层的有序链表。2.实现层级靠的是节点结构体中的zskiplistLevel结构体类型的level数组。(2)比较SDS类型数据大小,小的话访问该层下一个节点。(3)以上两种都不满足的情况下,跳到当前节点的下一层。

2024-03-08 17:10:35 785 1

原创 C++中的static关键字

关键字的用法使得它在不同的上下文中具有不同的含义,但总体来说,它用于实现具有静态特性的变量和函数,例如在函数内部保持状态、在类中实现共享成员等。是一个关键字,用于声明静态变量、静态函数、静态类成员以及静态局部变量。关键字的作用取决于它所修饰的上下文,以下是。

2024-03-08 11:46:29 346

原创 C++中的volatile关键字

是一个关键字,用于告诉编译器,该变量的值可能会在未知的时刻被意外地改变,因此编译器对于该修饰的变量的操作时应该保持对该变量。关键字只能保证变量的内存可见性,并不能保证变量的原子性。关键字来告诉编译器不要对该变量进行优化,以确保中断服务程序可以正确地访问和修改变量的值。关键字来告诉编译器不要对该变量进行优化,以确保可以正确地读取和写入硬件设备的状态。关键字来告诉编译器不要对该变量进行优化,以确保每次访问都能获取变量的最新值。关键字的主要作用是告诉编译器不要对该变量进行优化,以防止出现意外的行为。

2024-03-08 11:25:54 393

原创 和为K的子数组

那么对于任意的两个下标i和j(i < j),如果prefixSum[j] - prefixSum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。在遍历的过程中,我们检查是否存在prefixSum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k,我们将对应的次数累加到结果中。这样,通过遍历一次数组,我们可以统计出和为k的连续子数组的个数,并且时间复杂度为O(n),其中n为数组的长度。

2024-03-07 22:17:10 431

原创 C++ LRU缓存

【代码】C++ LRU缓存。

2024-03-06 21:31:24 604

原创 C++的4种强制类型

是用于在没有二义性的前提下进行基本数据类型转换的一种转换方式。它只能用于具有相关性的数据类型之间的转换,如将int类型转换为double类型。如果进行无关的数据类型之间的转换,编译器将报错。是一种低级的重新解释型的强制类型转换操作。它仅仅是一种逻辑上的转换,不会改变对象的二进制低级表现形式。用途:通常用于底层的编程,将指针或引用转换为一个足够长度的整型、将整型转换为指针或引用类型。用途:通常用于在没有丢失信息的情况下进行基本数据类型之间的转换。用途:通常用于将基类指针或引用安全地转换为派生类的指针或引用。

2024-03-06 15:26:57 523

原创 进程和线程的创建过程

进程和线程既有区别,也存在一定的联系,合理利用它们可以最大限度发挥系统资源,提升操作系统性能。进程的创建过程涉及到写时复制(Copy-on-Write,COW)机制。线程的创建相比进程要简单一些,因为线程是在进程内部创建的,它们共享进程的地址空间,包括代码段、数据段和堆等。线程创建时,虽然不需要进行写时复制,但线程之间需要同步机制(如互斥锁、信号量等)来控制对共享资源的并发访问。通过写时复制这种延迟拷贝策略,新进程的创建更加高效,避免了对整个进程地址空间的全拷贝操作。

2024-03-06 15:19:07 267

原创 Redis基本知识

1.AOF日志:Redis在执行完一条写操作命令后,把该命令以追加的方式写入到一个文件里面(先执行后写入),重启Redis时会读取该文件里的命令逐一操作来进行数据恢复。2.Redis采用的近似LRU算法:在Redis对象结构体中添加一个额外字段来记录此数据的最后一次访问时间,使用随机采样的方式淘汰数据。Redis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,用于存储键值对、缓存、消息队列、分布式锁等。2.缓存击穿:频繁被访问的热点数据过期了,也会导致大量请求直接访问数据库。

2024-03-02 11:19:21 890 1

原创 Nginx基本知识

3.IP哈希算法:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。Nginx是高性能的HTTP和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。4.按权轮询算法:给每台服务器分配权重(硬件好的服务器权重设置大一些)

2024-03-01 21:21:02 343

原创 linux下搭建boost、muduo、mysql、nginx

要在root权限下执行。

2024-02-23 14:57:13 369

原创 字符串、向量和数组

【代码】字符串、向量和数组。

2024-02-17 13:23:40 104

原创 C++左值引用、右值引用、移动语义、完美转发、深浅拷贝

移动构造函数的实现通常会“窃取”源对象的资源,并将源对象的资源指针(或其他表示资源的成员)置为空,从而确保源对象不再拥有这些资源。1.浅拷贝只复制指针或引用,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的,因此复制后的对象共享相同的资源。2.拷贝的时候先开辟出和源对象大小一样的空间,然后将源对象里的内容拷贝到目标对象中去,这样两个指针就指向了不同的内存位置,并且里面的内容是一样的。2.右值:不可以取地址、临时要销毁的对象。

2024-02-17 12:40:54 442

原创 CMakeLists常用指令

【代码】CMakeLists常用指令。

2024-02-08 12:00:00 464

原创 C++实现memcpy和memmove(含调试程序)

【代码】C++实现memcpy和memmove。

2024-02-07 13:05:14 142

原创 MySQL-进阶

1.主键索引(关键字primary,自动创建,只能有一个)、唯一索引(unique)、常规索引、全文索引(fulltext)(4)意向共享锁(IS):与表锁共享锁兼容,与表锁排他锁互斥;无索引会执行全表扫描,表太大时性能会很低。(1)聚集索引的选取:默认为主键索引,否则为第一个唯一索引,都没有的话会自动生成一个rowid座位隐藏的聚集索引。(2)B+Tree:叶子结点形成单项链表,非叶子节点仅起到索引作用,具体数据都是在叶子节点存放的。3.行级锁:每次锁住对应的行数据,锁定粒度小,锁冲突概率低,并发度高。

2024-02-06 11:42:06 476

原创 常用GDB调试命令

set var 变量名=变量值(循环用的比较多)list 行号/函数名(不加则从默认位置显示)16.向下单步调试(遇到函数体进入函数体)display/undisplay 变量名。11.设置条件断点(一般用在循环的位置)14.向下执行一行代码(不会进入函数体)enable/disable 断点编号。until 66:直接运行到第66行。3.给程序设置参数/获取设置参数。list 文件名:行号/函数名。print 变量名:打印变量值。break 行号/函数名。finish:跳出函数体。

2024-02-05 22:33:42 370

原创 静态库和动态库

库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。静态库在程序的链接阶段被复制到程序中;动态库在程序运行时被系统动态地加载到内存中使用。2.使用ar(archive)进行打包。1.通过gcc获得.o文件。1.通过gcc获得.o文件。三、静态库和动态库的区别。

2024-02-05 21:52:10 219

原创 虚函数工作原理

1.当调用一个对象对应的函数时,通过对象内存中的vptr(虚函数表指针)找到。2.从虚函数表中找到调用的虚函数的指针(地址),记录着该类各个虚函数的首地址。虚函数表vtbl:虚函数。的vtbl(虚函数表)

2024-02-01 15:15:10 251

原创 常用git指令

4.拉出远程仓库项目: git pull origin +main(分支名称)8.推回远程仓库项目:git push origin +main(分支名称)(1)切换到main分支:git checkout main。4.提交到仓库:git commit -m ‘注释’(2)合并分支a到main:git merge a。6.切换分支:git checkout 分支名称。8.删除分支:git branch -d 分支名。3.添加文件到仓库(缓冲区):git add。1.查看仓库状态:git status。

2024-01-31 10:38:14 557

原创 C++实现直接插入排序、冒泡排序、快速排序、选择排序(含调试程序)

【代码】C++实现直接插入排序、冒泡排序、快速排序、选择排序(含调试程序)

2024-01-29 23:36:24 255

原创 MySQL-基础

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。(3)幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。实现:在多的一方建立外键,指向一的一方的主键。实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

2024-01-29 19:17:29 1580

原创 了解云原生

云原生是一种构建和运行程序的方法。云原生(Cloud Native)是一个组合词,Cloud + Native。Native表示应用程序从设计之初即考虑到云的环境。K8s是容器的编排系统,用于容器的管理和内部的负载均衡(意思就是分摊到多个操作单元上进行执行)和微服务相对的就是单体应用。微服务的理论基础为康威定律,指导微服务该怎么切分。微服务架构具有服务解耦、内聚更强、变更更容易的特点。使用docker技术来提供实时保障和应用隔离的功能。开发和运维的合体,为云原生提供可持续交付的能力。

2024-01-28 12:52:59 534

原创 shell常见语法

【代码】Shell常用命令。

2024-01-26 21:56:38 122

空空如也

空空如也

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

TA关注的人

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