- 博客(365)
- 收藏
- 关注
原创 罗剑锋的C++实战笔记学习(二):容器、算法库、多线程
只不过这个函数通常是默认的less,表示小于关系,不用特意写出来C++里的int、string等基本类型都支持比较排序,但很多自定义类型没有默认的比较函数,需要。
2024-07-06 14:02:58
1223
1
原创 罗剑锋的C++实战笔记学习(一):const、智能指针、lambda表达式
weak_ptr是专门为打破循环引用而设计,它实际上不会托管对象,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。为了实现这个目的,unique_ptr应用了C++的转移(move)语义,同时禁止了拷贝赋值,所以,在向另一个unique_ptr赋值的时候,要特别留意,必须用。上面的代码其实会生成两个独立的shared_ptr,他们的控制块是独立的,所以导致Resource被释放了两次。
2024-07-06 14:00:57
1052
原创 Go协程池gopool源码解析
gopool的用法非常简单,将曾经我们经常使用的替换为即可此时gopool将会使用默认的配置来管理你启动的协程,也可以选择针对业务场景配置池子大小以及扩容上限}()})
2024-04-05 09:49:05
1736
原创 2024LeetCode分类刷题
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~ 2h个节点。
2024-02-14 13:19:14
1307
2
原创 Kubernetes复习总结(三):核心组件原理及源码:client-go、controller-runtime、Scheduler、API Server、kubelet
Controller中主要使用到Informer和WorkQueue两个核心组件Controller可以有一个或多个Informer来跟踪某一个或多个resource。Informer跟Kubernetes API Server保持通讯获取资源的最新状态并更新到本地的cache中,一旦跟踪的资源有变化,Informer就会调用callback把关心的变更的Object放到WorkQueue里面。
2024-01-17 20:21:20
1434
2
原创 Kubernetes复习总结(二):Kubernetes容器网络
这条规则的意思是:凡是发往10.244.2.0/24网段的IP包,都需要经过flannel.1设备发出,并且,它最后被发往的网关地址是:10.244.2.0,也就是Node2上的VTEP设备(也就是flannel.1设备)的IP地址。所以,flanneld进程在处理由flannel0传入的IP包时,就可以根据目的IP的地址(比如10.244.2.3),匹配到对应的子网(10.244.2.0/24),从Etcd中找到这个子网对应的宿主机的IP地址是172.19.216.115。也就是说,来到了隧道的入口。
2024-01-06 16:32:07
1181
原创 Kubernetes复习总结(一):Kubernetes内置资源、Device Plugin机制
控制器对象本身,负责定义被管理对象的期望状态。比如,Deployment里的replicas=2这个字段而被控制对象的定义,则来自于一个模板。比如,Deployment里的template字段。可以看到,Deployment这个template字段里的内容,跟一个标准的Pod对象的API定义丝毫不差。而所有被这个Deployment管理的Pod实例,其实都是根据这个template字段的内容创建出来的。
2024-01-06 16:23:58
1280
原创 深入理解Go语言GC机制
那么黑色对象就是我们程序逻辑可达(需要的)对象,这些数据是目前支撑程序正常业务运行的,是合法的有用数据,不可删除,白色的对象是全部不可达对象,目前程序逻辑并不依赖它们,那么白色对象就是内存中目前的垃圾数据,需要被清除。这里要注意的是,本次遍历是一次遍历,非递归形式,是从程序抽出可抵达的对象遍历一层,如上图所示,当前可抵达的对象是对象1和对象4,那么自然本轮遍历结束,对象1和对象4就会被标记为灰色,灰色标记表就会多出这两个对象。所以Go 1.3做了简单的优化,将STW的步骤提前,减少STW暂停的时间范围。
2023-12-04 07:43:40
674
原创 深入理解GMP模型
实现了线程M1的复用。G2在创建G7的时候,发现P1的本地队列已满,把P1中本地队列中前一半的G,还有新创建G转移到全局队列(实现中并不一定是新的G,如果G是G2之后就执行的,会被保存在本地队列,利用某个老的G替换新G加入全局队列)假定当前除了M3和M4为自旋线程,还有M5和M6为空闲线程(没有得到P的绑定,注意这里最多就只能存在4个P,所以P的数量应该永远是M>=P,大部分都是M在抢占需要运行的P),G8创建了G9,G8进行了。2)M创建的时机是在当没有足够的M来关联P并运行其中可运行的G的时候。
2023-12-04 06:52:42
2149
原创 深入理解Linux网络笔记(七):异常TCP连接建立情况、如何查看是否有连接队列溢出发生
如果端口不充足,会导致connect系统调用的时候过多地执行自旋锁等待与哈希查找,会引起CPU开销上涨。严重情况下会耗光CPU,影响用户业务逻辑的执行。通过调整ip_local_port_range来尽量加大端口范围尽量复用连接,使用长连接来削减频繁的握手处理第三个有用,但是不太推荐的方法是开启tcp_tw_reuse和tcp_tw_recycle半连接队列满,且tcp_syncookies为0全连接队列满,且有未完成的半连接请求。
2023-11-18 13:58:20
654
原创 深入理解Linux网络笔记(六):深度理解TCP连接建立过程
icsk->icsk_accept_queue定义在inet_connection_sock下,是一个request_sock_queue类型的对象,是内核用来接收客户端请求的主要数据结构。...// 全连接队列...// 半连接队列...对于全连接队列来说,在它上面不需要进行复杂的查找工作,accept处理的时候只是先进先出地接受就好了。所以全连接队列通过rskq_accept_head和rskq_accept_tail以链表的形式来管理。
2023-11-18 11:25:07
484
原创 深入理解Linux网络笔记(五):深度理解本机网络IO
1)127.0.0.1本机网络IO需要经过网卡吗?不需要经过网卡。即使把网卡拔了,本机网络还是可以正常使用的2)数据包在内核中是什么走向,和外网发送相比流程上有什么差别?总的来说,本机网络IO和跨机网络IO比较起来,确实是节约了驱动上的一些开销。发送数据不需要进RingBuffer的驱动队列,直接把skb传给接收协议栈(经过软中断)。但是在内核其他组件上,可是一点儿都没少,系统调用、协议栈(传输层、网络层等)、设备子系统整个走了一遍。连驱动程序都走了(虽然对于回环设备来说只是一个纯软件的虚拟出来的东西)。
2023-10-29 09:54:47
394
2
原创 深入理解Linux网络笔记(四):内核是如何发送网络包的
1)我们在监控内核发送数据消耗的CPU时,应该看sy还是si?在网络包的发送过程中,用户进程(在内核态)完成了绝大部分的工作,甚至连调用驱动的工作都干了。只当内核态进程被切走前才会发起软中断。发送过程中,绝大部分(90%)以上的开销都是用户进程内核态消耗掉的只有一少部分情况下才会触发软中断(NET_TX类型),由软中断ksoftirqd内核线程来发送所以,在监控网络IO对服务器造成的CPU开销的时候,不能仅看si,而是应该把si、sy都考虑进来。
2023-10-24 08:00:53
398
原创 深入理解Linux网络笔记(三):内核和用户进程协作之epoll
1)阻塞到底是怎么一回事?阻塞其实说的是进程因为等待某个事件而主动让出CPU挂起的操作。在网络IO中,当进程等待socket上的数据时,如果数据还没有到来,那就把当前进程状态从TASK_RUNNING修改为TASK_INTERRUPTIBLE,然后主动让出CPU。由调度器来调度下一个就绪状态的进程来执行所以,在分析某个技术方案是不是阻塞的时候,关键要看进程有没有放弃CPU。如果放弃了,那就是阻塞。如果没放弃,那就是非阻塞。事实上,recvfrom也可以设置成非阻塞。
2023-10-07 07:32:25
572
2
原创 深入理解Linux网络笔记(二):内核和用户进程协作之阻塞方式
第一部分是我们自己的代码所在的进程,我们调用的socket()函数会进入内核态创建必要内核对象。recv()函数在进入内核态以后负责查看接收队列,以及在没有数据可处理的时候把当前进程阻塞掉,让出CPU第二部分是硬中断、软中断(系统线程ksoftirqd)。在这些组件中,将包处理完后会放到socket的接收队列中。
2023-10-01 08:59:06
482
原创 深入理解Linux网络笔记(一):内核是如何接收网络包的
本文为《深入理解Linux网络》学习笔记,使用的Linux源码版本是3.10,网卡驱动是Intel的igb网卡驱动Linux源码在线阅读:https://elixir.bootlin.com/linux/v3.10/source。
2023-09-16 08:59:12
1405
1
原创 Istio Pilot源码学习(一):Pilot-Discovery启动流程、ConfigController配置规则发现
本文基于Istio 1.18.0版本进行源码学习。
2023-07-23 10:18:37
1035
原创 Kubernetes API Server源码学习(四):Admission机制的实现、HttpReq的处理过程、Authentication与Authorization
Admission Controller在HTTP请求经过登录和鉴权之后并且在Request真正被处理并且存储到Etcd之前去执行,可以修改请求对象(Mutation)或校验请求(Validation):登录和鉴权,校验Request发送者是否合法:Request以JSON格式发过来,转换为Go结构体类型,将外部版本转换为API Server内部APIObject版本:拿到Request对内容进行调整:通过Webhook调用Kubernetes使用者扩展的Mutation逻辑。
2023-06-22 15:28:02
691
4
原创 Kubernetes API Server源码学习(三):KubeAPIServer、APIExtensionsServer、AggregatorServer
本文基于Kubernetes v1.22.4版本进行源码学习。
2023-06-22 15:17:18
1296
原创 Kubernetes API Server源码学习(二):OpenAPI、API Resource的装载、HTTP Server具体是怎么跑起来的?
本文基于Kubernetes v1.22.4版本进行源码学习。
2023-06-22 15:11:07
1416
原创 Kubernetes API Server源码学习(一):API Server架构设计、API Server启动过程、APIObject的装载、Scheme详解、GenericAPIServer
本文基于Kubernetes v1.22.4版本进行源码学习。
2023-06-22 14:53:56
1110
原创 Kubernetes调度器源码学习(三):Preempt抢占机制、调度失败与重试处理
本文基于Kubernetes v1.22.4版本进行源码学习。
2023-04-09 16:22:13
993
2
原创 Kubernetes调度器源码学习(一):调度器工作原理、调度器启动流程、调度队列
本文基于Kubernetes v1.22.4版本进行源码学习。
2023-04-05 13:56:21
1479
原创 controller-runtime源码学习
首先Controller会先向Informer注册特定资源的eventHandler;然后Cache会启动Informer,Informer向APIServer发出请求,建立连接;当Informer检测到有资源变动后,使用Controller注册进来的eventHandler判断是否推入队列中;当队列中有元素被推入时,Controller会将元素取出,并执行用户侧的Reconciler2022年最新k8s编程operator篇kubebuilder 进阶: 源码分析。
2023-02-11 16:39:53
1589
原创 client-go源码学习(四):自定义Controller的工作原理、WorkQueue
Controller中主要使用到Informer和WorkQueue两个核心组件Controller可以有一个或多个Informer来跟踪某一个resource。Informer跟Kubernetes API Server保持通讯获取资源的最新状态并更新到本地的cache中,一旦跟踪的资源有变化,Informer就会调用callback把关心的变更的Object放到WorkQueue里面。
2023-01-17 20:17:25
993
原创 client-go源码学习(三):Indexer、SharedInformer
Indexer接口继承了一个Store接口(实现本地缓存),以及包含几个index索引相关的方法声明(实现索引功能)Store接口中定义了Add、Update、Delete、List、Get等一些资源对象增删改查的方法声明,用于操作Informer的本地缓存cache struct是Indexer接口的一个实现,所以自然也是Store接口的一个实现,cache struct包含一个ThreadSafeStore接口的实现,以及一个计算object key的函数KeyFunc。
2023-01-07 15:26:58
1409
原创 client-go源码学习(二):Reflector、DeltaFIFO
本文基于Kubernetes v1.22.4版本进行源码学习,对应的client-go版本为v0.22.4。
2022-12-31 15:42:53
1530
2
原创 client-go源码学习(一):client-go源码结构、Client客户端对象
本文基于Kubernetes v1.22.4版本进行源码学习,对应的client-go版本为v0.22.4。
2022-12-26 14:55:43
1706
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊(四):The DAO、反思、美链、总结
理论上,没有什么是绝对不可篡改的,比如分叉攻击可以回滚交易。The DAO事件中,以太坊开发团队通过软件升级方式强行改变了某些账户的状态,所以不能迷信不可篡改的特性。毕竟代码是死的人是活的,没有什么是绝对改不了的,连宪法都可以修宪,比如美国的宪法修正案,修宪是很难的,但是有必要的时候还是可以改的。区块链上是一样的,想要篡改是比较难的,但是遇到重大事件,要是想改还是改的了的。
2022-09-03 10:03:13
3349
2
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(三):智能合约
智能合约的本质是运行在区块链上的一段代码,代码的逻辑定义了智能合约的内容智能合约的账户保存了合约当前的运行状态balance:当前余额nonce:交易次数code:合约代码storage:存储,数据结构是一棵MPTSolidity是智能合约最常用的语言,语法上与JavaScript很接近。...
2022-08-28 16:16:27
3866
3
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(二):GHOST、难度调整、权益证明
以太坊把出块时间降到了十几秒,这对于提高系统的throughput(吞吐量)和降低反应时间来说都是很有帮助的,跟比特币的10分钟的出块时间相比,以太坊的出块速度相当于提高到了40倍但是这样大幅度降低出块时间之后也带来一些新的问题,比特币和以太坊都是运行在应用层的共识协议,底层是一个P2P的Overlay Network,这个Overlay Network本身传输的时间是比较长的,因为它的拓扑协议做flooding的时候没有考虑实际的拓扑结构,就带来一个问题,发布一个区块的时候,这个区块在网络上传到其他节
2022-08-27 17:04:15
2094
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(一):以太坊概述、账户、状态树、交易树和收据树
比特币和以太坊是两种最主要的加密货币,比特币被称为区块链1.0,以太坊被称为区块链2.0出块时间,比特币的区块时间是10分钟,以太坊的出块时间大幅度降低到了十几秒,而且为了适应这种新的出块时间,以太坊还设计了一套基于GHOST的共识机制以太坊的另一个改进就是挖矿使用的mining puzzle。.........
2022-08-22 07:22:09
7508
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:BTC原理(三):分叉、匿名性
分叉指的是,原来的系统中是一条链,现在分成了两条链。分叉可能是多种原因造成的,例如:在protocol fork中,根据对协议修改的内容的不同,又可以分为硬分叉和软分叉如果对比特币协议增加一些新的特性,扩展一些新的功能,这时候没有升级协议的那些节点是不认可这些特性的,认为它们是非法的硬分叉的一个例子就是比特币中的区块大小限制,比特币规定每个区块不超过1M,可以包含的交易最大数量为4000笔左右。而平均10分钟产生一个区块,算下来大约平均每秒只能写入7个交易。所以有的人就认为区块太小了,限制了交易上链的速度假
2022-08-06 18:46:06
1922
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人