自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HTTP2.0如何优化HTTP1.1

同一连接只能在完成一个 HTTP 事务(请求和响应)后,才能处理下一个事务;(对于应用层http)由于 HTTP 协议是无状态的,每一个请求都得携带 HTTP 头部,特别是对于有携带 Cookie 的部,而 Cookie 的大小通常很大;当客户端需要获取通知时,只能通过定时器不断地拉取消息,这无疑浪费大量了带宽和服务器资源HTTP/1.1 报文中 Header 部分存在的问题:含很多,比如 Cookie、User Agent、Accept 等,这些字段加起来也高达几百字节甚至上千字节,所以有必要;

2024-07-02 17:50:17 1022

原创 Redis如何实现分布式锁

在并发场景中,为了保证临界资源的数据一致性,我们会经常使用到“锁”这个工具对临界资源进行保护,让混乱的并发访问行为退化为秩序的串行访问行为.在本地环境中,由于多线程之间能够共享进程的数据,因此可以比较简单地实现进程内的互斥锁;

2024-06-17 10:27:07 685

原创 Golang中读写锁的底层实现

mtu.RLock() //读锁 加锁mtu.RUnlock() //读锁 解锁mtu.Lock() //写锁 加锁mtu.Unlock() //写锁 解锁。

2024-07-15 22:34:25 653

原创 K8s的基本使用和认识

官⽅定义kube-controller-manager。

2024-06-30 17:22:34 667

原创 Golang中的defer

目录Golang中的Defer必掌握的7知识点知识点1:defer的执行顺序知识点2:defer与return谁先谁后知识点3:函数的返回值初始化知识点4:有名函数返回值遇见defer情况知识点5:defer遇见panic知识点6:defer中包含panic知识点7:defer下的函数参数包含子函数 defer底层如何实现多个defer出现的时候,它是一个“栈”的关系,也就是先进后出。一个函数中,写在前面的defer会比写在后面的defer调用的晚。测试代码:执行结果: 知识点3:函数的返

2024-06-25 15:31:05 824 1

原创 Docker基本使用和认识

网络命名空间是 Linux 提供的一种机制,用于隔离网络资源。每个网络命名空间拥有自己的网络设备、IP 地址、路由表、/proc/net 目录等。这意味着不同的容器可以有各自独立的网络环境。

2024-06-21 16:47:30 1330

原创 MySQL如何实现事务特性

磁盘的「顺序写 」比「随机写」 高效的多,因此 redo log 写入磁盘的开销更小。每条记录都拥有着隐藏字段,包含事务id 和 undo 指针 (相当于版本链表) 如下。如上,我创建一张表,表中含有 id 和 name 字段 在 数据存储中如下。原子性是通过 undo log(回滚日志) 来保证的,那么什么是回滚日志。事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。事务操作前和操作后,数据满足完整性的约束,数据库保持一致的状态。所以 当我们对数据操作成功时,在当前的undo指针 ,

2024-06-19 11:26:23 560

原创 Golang的Gin框架

从 pool 中获取 Context,倘若池子已空,通过 pool.New 方法构造新的 Context 补上空缺。,拼接上 RouterGroup 中的 basePath 作为前缀后才能拿到完整的路由 path。RouterGroup 是路由组的概念,其中的配置将被从属于该路由组的所有路由复用。组成的字符串,子节点顺序会按照途径的路由数量 priority进行排序。从根节点到某一节点,路径上经过的字符串联起来,即为该节点对应的字符串。并不是真正意义上的缓存,将其称为回收站或许更加合适,放入其中的数据。

2024-06-15 15:21:56 891

原创 Golang的channel

1.当写时存在阻塞读协程,我们直接用2.当写时不存在阻塞读协程,且缓冲区不满仍有空间时,我们直接加入环形缓冲区中3.当写时不存在阻塞读协程,且缓冲区满了没用空间时,加入阻塞写协程队列中。

2024-06-12 11:08:30 1165

原创 Golang的context

cancelCtx 未实现该方法,仅是 embed 了一个带有 Deadline 方法的 Context interface,因此倘若直接调用会报错.• 在 propagateCancel 方法内启动一个守护协程,以保证父 context 终止时,该 cancelCtx 也会被终止;如果我们使用 context 时,当父类的context关闭,子类也会一起关闭以此类推,类似Qt中的对象树。倘若已存在,则直接返回;• 注入父 context 后,返回一个新的 cancelCtx.

2024-06-11 11:47:02 932 1

原创 Golang的GC

全局变量:编译器就能确定存在于程序整个生命周期的变量执行栈:每个 goroutine 都有自己的执行栈,执行栈上包含栈上的变量及指向分配的堆内存指针寄存器: 寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存块三色标记法Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的所谓三色标记法实际上就是通过三个阶段的标记来确定清楚的对象都有哪些?我们来看一下具体的过程。第一步。

2024-06-10 16:47:42 803

原创 Golang的协程调度器GMP

在新的调度器中依然有全局G队列,当P的本地队列为空时,优先从全局队列获取,如果全局队列为空时则通过work stealing机制从其他P的本地队列偷取G。,如果线程想运行协程,必须先获取P,P中还包含了可运行的G队列。拿的话至少从全局队列取1个g,但每次不要从全局队列移动太多的g到p本地队列,给其他p留点。P2从P1的本地队列尾部取一半的G,本例中一半则只有1个G4,放到P2的本地队列并执行。新建G 时,G优先加入到P的本地队列,如果队列满了,会把。P的本地队列:同全局队列类似,存放的也是等待运行的G,

2024-06-10 14:51:56 665

原创 Golang的内存关系

Golang的Page,在操作系统对虚拟内存管理的MMU定义的物理页有相似的定义,

2024-05-27 19:59:08 389

原创 Golang的基本使用

上面的程序中后台Goroutine向管道输入自然数序列,main函数中输出序列。使用 valgrind 运行 程序,发现 协程内存并没有回收。这样就避免了Goroutine的泄漏。当main函数在break跳出循环时,那么协程用什么与主协程通信呢?动态数组(array)

2024-05-21 20:33:10 577 1

原创 HTTP 1.1 与 HTTP 1.0

双方 约定 发送的数据虽然是在 A 和 B 之间传输,但允许中间有。图片、视频、压缩包,在HTTP里都是文本。

2024-05-10 18:42:06 480

原创 Top K 问题

Top K 问题常见形式:给10万个单词,找第K大词频的单词给10玩个数,找第K大的数。

2024-05-10 17:26:07 211

原创 C++ 如何实现原子性

在单处理器,单核,运行多线程的情况下,我们不使用线程同步工具,我们会出现,线程之间会互相抢夺,临界区的资源,造成数据不符合我们预期的结果,后面再说解决办法,那么我们怎么帮助实现原子性在多处理器,多核,运行多线程的情况下,除了上面两点,我们该如何保持原子性呢?让我们先了解一下 多核 cpu 之间是如何通信的:如图,通过CPU总线 进行数据交换当 我们 使用缓存时,数据在缓存 与 磁盘上不一致时,CPU 该如何保持呢?一致性协议,就是解决这种问题,所以 当我们 想使用 具有 原子性 的变量时,使用。

2024-04-29 20:46:02 327

原创 C++ future

: 异步执行任务后,future 获取结果:: 异步运行一个函数 可以通过获取结果::可以封装一个函数,把它放进线程池里,如何异步执行通过 future 获取结果:: 1,可以在异步线程之间 设定值 2,在函数内设定值后 可以使用 future 获取future。

2024-04-29 19:52:03 305

原创 进程调度算法

就像队列一样,先进先出,这似乎很公平但是当一个长作业先运行了,那么后面的短作业等待的时间就会很长,不利于短作业。先来先服务: 对长作业有利,:是指那些需要大量的CPU时间进行计算,而很少请求I/O操作的作业。而先来先服务,对长作业有利,也就是利于大量CPU时间进行计算:是指那些在执行过程中需要频繁进行I/O操作的作业,那么进行IO的话,肯定等待I/O操作完成,那么CPU只能干等,白白浪费CPU的资源。

2024-04-23 20:03:49 430

原创 内存满了如何处理?

我们为一个进程分配内存时,分配的是一个虚拟内存,如果我们分配的是物理内存那么,当这个进程大部分东西没有被使用时,就造成了内存的浪费,所以当我们真正使用时才分配真实的物理内存。,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题。会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的。

2024-04-22 19:53:26 888

原创 MySQL如何改进LRU算法

操作系统出于空间局部性原理(靠近当前被访问数据的数据,在未来很大概率会被访问到)所以当我们,读取一部分内容时,它旁边的内容也会被加载到内存中,同时如果文件读取内容小,那么预读机制也可以充分利用空间,将这一部分缺少的内存补充,为未来访问作准备什么是预读失效如果这些被提前加载进来的页并没有被访问,相当于这个预读工作是白做了,这就是预读失效。传统的 LRU 算法,就会把「预读页」放到 LRU 链表头部,而当内存空间不够的时候,淘汰掉末尾。

2024-04-20 18:24:19 758

原创 MySQL如何优化索引

由于每次插入主键的索引值都是随机的,因此每次插入新的数据时,就可能会插入到现有数据页中间的某个位置,这将不得不移动其它数据来满足新数据的插入,甚至需要从一个页面复制数据到另外一个页面,我们通常将这种情况称为页分裂。索引是由索引值从左到右建立的 比如 "MySQL"是索引值,那么不可能索引值是"SQL",那么每次插入的新数据就会按顺序添加到当前索引节点的位置,不需要移动已有的数据,当页面写满,就会。你经常查询某个产品的价格,并且只想从索引中获取数据,而不是访问实际的表数据(全部数据)。

2024-04-15 20:02:54 656

原创 Effective C++ 笔记 条款(31,36)

为什么我们绝不重新定义继承而来的non-virtual(非虚函数)函数呢?因为从父类继承来非虚函数我们想要的功能一定是和父类一样的,但是当我们想像虚函数一样重新实现时,实际发生了隐藏,导致调用不符合预期,容易导致未知错误class Basepublic:public:int main()s->test();// 调用Basereturn 0;原本我们是想调用基类的,却调用派生类。

2024-04-14 16:22:03 142

原创 c++程序运行流程

总的来说就是编译器首先。

2024-04-08 16:53:45 630

原创 c++策略模式

策略模式的组成部份。

2024-04-01 17:33:07 138

原创 C++为什么需要右值引用

移动语义允许我们将一个对象的资源(如动态分配的内存、文件句柄等)从一个对象“移动”到另一个对象,而不是复制这些资源。当这些函数被调用时,它们会接管源对象的资源,并将源对象置于有效但未定义的状态(通常是清空状态)。我们可以发现 str1和str2 的赋值完成后 ,在输出s1的地址,我们可以发现地址和之前的不一样了。我们可以发现 str3=str4之后,str3的地址和str4的地址相同,说明。结论:有了右值引用之后,可以利用右值引用就行安全的资源转移,减少资源的创建。我们并没有创建一个新对象,而是。

2024-03-24 17:27:59 350

原创 c++中shared_ptr的循环引用问题如何解决

我们知道当shared_ptr 的引用计数为零时,shared_ptr所指向的对象就会被释放那么两个shared_ptr互相指向对方会发生什么呢?循环引用简单例子class A;B b;//A类的//B类的return 0;结果呢,shared_ptr 对象一直没被释放,因为引用计数一直不为零。

2024-03-24 15:25:43 419

原创 c++观察者模式

实现:1.通知订阅者2.增加订阅者3.删除订阅者// 被观察者public://增加观察者//删除指定观察者it!it++)break;//通知所有观察者protected:// 观察者列表实现:1.数据更新或者发出信息// 具体观察者public:std::cout << name << "收到通知: " << message << std::endl;

2024-03-18 16:22:35 322

原创 c++单例模式

所谓单例模式,就是独生子女,确保有只一个实例,那么什么会影响你不是独生子女呢?

2024-03-17 17:41:49 316 1

原创 STL:push_back和emplace_back

那么这样有什么用呢?如图所示使用emplace_backemplace_back效率要比push_back高。

2024-03-17 16:28:13 1139 1

原创 Git 版本控制

这些被忽略的文件或文件夹不会被提交到代码仓库中,从而避免了不必要的文件冲突和代码冗余。这是开发者日常进行项目开发和代码编写的区域。所有未提交的更改都保存在这里。本地版本库是Git用来存储项目历史记录的地方,也被称为本地仓库。当我们的提交记录多了以后,为了方便我们查看各个分支的日志,我们。它用于指定哪些文件或文件夹应该被忽略,不纳入版本控制中。它包含了项目的所有文件、提交历史、分支以及标签等信息。位于网络服务器上的版本库, 可以让工作人员协同开发。新文件未提交:没有git add。

2024-03-06 16:23:41 942 1

原创 QT常用控件

返回结果是⼀个 QRect, 包含了 x, y, 控件大小(width, height) 其 中 x, y 是左上⻆的坐标.设置 toolTip 提⽰的时间. 单位 ms. 时间到后 toolTip ⾃动消失.设置控件的位置和尺⼨. 可以直接设置⼀个 QRect, 也可以分四个属性单独设置.设置 toolTip. ⿏标悬停在该 widget 上时会有提⽰说明.获取到控件的窗⼝图标. 返回 QIcon 对象.获取到控件的可⽤状态.获取到控件的位置和尺⼨.获取到控件的窗⼝标题.设置控件的窗⼝标题.

2024-02-25 10:51:52 374 1

原创 Qt信号槽

•Qt::AutoConnection: 默认值使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用类型。如果接收者和发送者不在一个线程,则自动使用类型。•槽函数会在信号发送的时候直接被调用,槽函数和信号发送者在同一线程。效果看上去就像是直接在信号发送位置调用了槽函数,效果上看起来像函数调用,同步执行。•信号发出后,信号会暂时被放到一个消息队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,然后执行和信号关联的槽函数,这种方式。

2024-02-25 09:58:29 905 1

原创 Linux复习之IO

DMA传输将数据从一个地址空间拷贝到另一个地址空间,无需cpu的干涉,提供在 外设 和 存储器,或者 存储器 与 存储器 之间的高速缓存数据传输。DMA技术就是基于以上的设想设计的,它的作用是解决了大量数据转移过度消耗cpu资源的问题,有了DMA技术能够cpu去做更为复杂的任务。select函数是IO多路复用的函数,它主要的功能是用来等文件描述符中的事件是否就绪,select可以使我们在同时等待多个文件缓冲区 ,减少IO等待的时间,能够提高进程的IO效率。

2023-03-23 11:50:46 168

原创 网络复习之TCP三次握手和四次挥手

答:服务器会收到第一次SYN,就会处于SYN_RECV状态(接受到了SYN报文),由于双方还没有完全建立好连接,服务器会把这些连接放在一个队列中,这个队列就叫做半连接队列。还有一个是全连接队列,也就是已经完成三次握手的连接放在一个队列中,该队列就叫做全连接队列,如果队列满了,那么就有可能出现连接失败的问题。

2023-03-21 18:41:07 172

原创 网络复习之TCP报文段的详细解析

举个例子:当主机B中的接收缓冲区只剩下1000字节大小的时候,那么主机B会将回应过去的Tcp协议中的窗口大小是1000,当主机A收到主机B的响应后,通过响应的窗口大小判断出主机B的接收缓冲区剩余的大小,因此下一次主机A给主机B发送数据的时候是不会超过1000个字节的数据,这样就可以防止主机B接收缓冲区满了之后出现丢包的情况。假设主机A收到主机B的1~1000的所有字节,同时假设它要发送一个报文段给主机B,主机A等待主机B中1001即其以后的字节,那么主机A会在报文段的确认序号字段填充上1001.

2023-03-20 17:58:02 2554

原创 Linux复习之线程管理

线程是进程里面单一的执行控制序列(执行流),也是cpu调度的基本单位(分配给cpu执行最小单位),假如进程的运行是为了完成某个任务,线程是该任务的许多子任务之一,线程的创建,操作系统并不会给它分配内存资源,进程中所有线程共享所属进程地址空间上的资源。如果进程里只有一个线程,也就是只有一个线程在cpu中执行该进程的代码和数据。如果有多个线程,那么这些线程轮流在cpu中执行该进程的代码和数据。在linux中,线程是在进程的基础改的。

2023-03-19 17:19:28 368

原创 Linux复习之socket

然后将ip地址和端口号填充进struct sockaddr_in变量中,最后在传参的时候将struct sockaddr_in*变量。

2023-03-17 21:10:57 399

原创 Linux复习之进程控制

操作系统需要释放掉进程的pcb,mm_struct,想对应的页表,代码和数据申请的空间也被释放掉,回收资源,各种队列中移除该进程的数据结构,其中,要释放掉进程pcb之前,需要先等待父进程的来读取退出信息,才能够被释放掉。当父进程创建子进程的时候,系统不会立马给子进程创建一块空间,而是让子进程中的数据先指向父进程的数据。也就是说在fork中return的前面,子进程就已经创建完成了,所以到return那里,子进程和父进程分别返回不同的pid(因为父进程跟子进程的代码是共享的,所以它们会执行相同的代码)。

2023-03-15 18:21:05 115

原创 C++复习之智能指针

下面是智能指针的基本框架,所有的智能指针类模板中都需要包含一个指针对象构造函数和析构函数。当程序结束时,此时ptr1和ptr2指针被销毁时,对象ptr1和ptr2会自动调用析构函数去释放所指向的资源,这是智能指针特点。由于我的类中没有定义拷贝构造函数和赋值重载函数,那么我们只能调用类中原生的拷贝构造函数和赋值重载函数。那么就会程序就会出现崩溃的问题,如下:ptr2和ptr1指向的同一块空间。

2023-03-12 19:38:05 146

空空如也

空空如也

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

TA关注的人

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