- 博客(233)
- 收藏
- 关注
原创 InheritableThreadLocal与阿里的TransmittableThreadLocal设计思路解析
前言参考文章:《全链路跟踪(压测)必备基础组件之线程上下文“三剑客”》-- 原创: 丁威 中间件兴趣圈https://mp.weixin.qq.com/s/a6IGrOtn1mi0r05355L5Ng《阿里巴巴Transmittable ThreadLocal(TTL) github》https://github.com/alibaba/transmittable-thread-loc...
2019-08-15 17:48:48 8039 3
原创 模拟电路学习笔记 - 概念与结论
概念备注晶体管(Bipolar Junction Transistor)、场效应管的结构伏安特性曲线结型管与绝缘栅的介绍了解【设计、分析到应用 】与【应用、分析到设计】的区别多子激发与少子负荷了解参杂提高导电性代替加热的历史故事了解二极管的二级击穿特性二极管对电压不敏感,压价固定的特性了解等效电路学习静态等效与动态等效分析法的学习模块简化分析学习简化H值的等效电路耦合电路类型的学习、阻容耦合与直接耦合放大电路的特性学习共射、共集、共基动态电路的0点分析思路。
2023-05-06 17:13:15 1244
原创 单片机通讯协议的归纳总结
| 无协议通讯&无时钟(可靠性存在大同小异) | 总线协议&有时钟(总线交互存在差异) | 有完整协议栈工业协议 || UART \ RS232 \ RS485 \ RS483 \ RS487 | IIC \ SPI | CAN \ USB |
2023-05-06 17:04:56 1367 2
原创 ChatGPT 探讨内存屏障的意内存
也就说, asm volatile (“mfence” ::: “memory”);这条内存读写屏障,之所以难以理解,是因为他把两种场景用到的两条指令合并成一条指令,从而导致晦涩难懂。单独理解或就简单很多了。首先,我们知道对于共享变量,线程用的内存包括,本地内存,主内存。如果,希望数据马上写穿 write through 到主内存,则写完之后执行如果,希望数据重新到主内存读取最新值,则读之前执行如果又是读,又是写即,等价于。
2023-05-06 17:02:30 2069
原创 从目录文件inode角度,理解软连接的由来
目录文件的inode 存放的是 entry,entry 的key 是文件名词, value是 inode 的磁盘Inode数组物理编号(数字下标)。硬连接就是 不同绝对路径下的 目录文件 inode 的 entry 指向同一个 inode 编号的技术。这个时候单单通过 inode 编号,系统会认为是当前文件系统的Inode 编号,无法实现跨文件系统。有时候需要 “跨文件系统” 指向 inode (注意,不同文件系统的 inode 编号允许相同),然后 inode 文件内容存放 “绝对路径的字符串”,
2022-11-26 15:15:02 517
原创 通过 filesystem 的 inode 设计,理解数组与链表
inode 是存用户数据的地方。inode 用链表存放用户的数据。磁盘是存放inode 的地方。磁盘用数组存放 inode。inode 喜欢链表的灵活性。磁盘喜欢数组的简单性。
2022-11-26 14:52:02 533
原创 位于kernel的文件系统大管家--Virtual File System
包含对持久化的文件内容权限标记方法 inode_operation、以及读写文件内容的IO接口 file_operation。值得一提的是: inode里的 file_operation 涉及很多文件缓存技术以及 IO 缓存等驱动技术,这是技术热点。维护着与底层文件系统相关的 superblock与 替位的新子文件系统入口 dentry。记录无入口的原父文件系统 dentry 与 替位的新子文件系统 dentry 关联关系。维护全局的被打开文件的对象,他是VFS的核心对象。维护进程打开的文件描述符列表。
2022-11-19 16:41:44 475
原创 一图了解原码、反码、补码的演进历史
我们可以理解反码的问题是“编码重复性”引起的(即存在多个 编码对应 1个值,类似人们身份证的重名。)补码通过移动(反码+1)解决了这个问题,补码的设计思路,个人理解,类似我们写算法处理边界问题时采用“哨兵模式”。当然我觉得解决“编码重复性”问题的方法,还是有很多种的,比如 “ case by case ” 就是一种粗暴的手段。......
2022-08-06 15:57:57 909
原创 Netty线程池中的位运算
位运算取余数要求 ** 除数最好是 2的n次方 ** ( 9 % 4 = 1, 4 就是除数, 1是余数)具体可以参考: https://blog.csdn.net/lonyw/article/details/80519652。位运算取余数公式为 val & (n - 1) 等于 val % n (n是被除数,val是被除数)调度器从任务队列拿到任务后,就会从线程组中选择执行任务的线程。Netty线程池由 3 部分组成,任务队列和线程组、调度器。调度器分配任务的最常用的算法是。.
2022-08-06 14:12:25 130
原创 一图看懂Spring事务传播的本质
可能有点标题党,当可以作为一种思路。总所周知,Spring事务传播有7种方式,我们经常会苦于记忆和理解。这是因为我们不理解他的本质,如下图:同一个线程里关于事务的上下文会记录着当前线程拥有的MySQL Client socket,每一个Socket只存在一个当前事务(后面会提到为什么)事务的传播行为本质上是,当前service方法根据当先线程上下文是否存在事务,以此决定后续针对事务后续操作的行为。最常见的行为,就是根据当前线程事务上下文决定是否创建新事务(如果有则,不做任务操作,等于跟当前线程的父方
2022-08-06 13:56:21 281
原创 《wireshark网络分析就是这么简单》知识点与技巧
理论抽象的话,找个工具和工具教学的书可以帮我们快速获得实用的知识。掩码是为本机服务的,理解这个很重要。offload网卡技术有时候也是个坑,不用就关掉配置。RST是危险信号。MSL调小点,服务器启用SO_REUSEADDR。拥堵的话,调好两个窗口,临时窗口ssthresh,接收窗口win,和一个重传rto+sack。udp不能传大包。注意nat影响抓包和ip黑白名单。tshark用起来。...
2022-07-21 00:29:40 873
原创 2小时1000人吃饭,要多少台座椅?
并发数: 指在确保延迟最低(服务质量最好)的情况下,系统能够同时服务的请求数(或者服务的用户数)这个值通常等于线程数,这个值需要根据系统的同时在线用户峰值计算出来(就好比餐厅有多少用餐座位)。最低平均延迟(没有明说,“延迟”都指这个):指在确保延迟最低(服务质量最好)的情况下,平均的延迟(就好比餐厅中食客平均用餐时间)。QPS : 这个是为了系统之间横向对比而造的概念, QPS = 并发数 / 最低平均延时(我们常说的吞吐量,可以理解就是用于横向对比的QPS)。(了解了这些概念你就会开餐厅了)知道并发数,
2022-07-14 09:50:20 277
原创 【读书笔记《凤凰架构》- 构架可靠的大型分布式系统.周志明】(一)
整部书分为5部分,除了第一章讲分布式架构的历史,其他四章都偏技术。书本的作者提也到,再看书前最好先理解本书的排版的逻辑(尽管每一章都被设计为可以单独阅读)但除第1部分, 剩下的4个部分的排版逻辑是有的,但不够清晰,所以针对目录进行了一轮整理。经过分析后,可以发现本书从 第2部分到 第 5 部分的排版都是有逻辑性的, 即从 架构知识 到 分布式技术点,再到微服务技术和实践 。甚至在具体部分里的章节也是有一定的逻辑性。由于本人喜欢 周志明的《深入理解Java虚拟机》的作品,加上这是他难得的新作, 从书本的目录
2022-06-22 19:35:20 1061
原创 LSM-tree(Log Structured-Merge Tree)的理解
0.术语:WAL (write ahead log) 是一个追加写日志,用来做简单的流水记录和备份。LSM-tree (Log Structured-Merge Tree), 被称为谷歌三驾马车之一,也是一种追加写的日志文件,但是相比粗暴的 WAL, 他将日志分割成本多段,并且每一段都做了查询索引(每一段的查询性能是 Ologn )。SStables (Sorted Strings Table) 可以看成是一张map表,但是他的查询依赖树形索引,查询的复杂度是 Ologn, 他把 key-value.
2022-04-11 18:05:20 400
原创 重新认识的docker
前言容器是内核特效的集合,比如:namespace(chroot)、 cgroup 或者 unionFS 等隔离技术。由于这种内核特效普通人难以运用,故docker对齐做了封装,并提供成套的便利工具程序。docker的架构容器技术的本质提供了程序运行资源的隔离能力,所以容器进程的本质是进程,只不过具备了资源隔离能力。而作为特殊的程序,故意需要有一套特殊的管理工具,比如:特殊的构建工具 docker build特殊的程序管理工具 docker image特殊的程序下载仓库 docker rep
2021-11-03 20:40:49 130
原创 如何解决if语句太多
如何解决if语句太多【用策略模式】定一个策略基类,然后针对每个if实现一个策略子类,然后利用传入进来的参数,去匹配采用的策略,有点类似分治思想。【用哨兵伪节点】我们一般习惯用if去判断边界问题,对于非边界的问题不需要用if,那么我只需要给当前边界问题加上前继和后继的哨兵伪节点,就可以做到不需要用if语句了。【用驱动表模式】,创建一个actionmap,key就是我们的条件case, value就是针对这个case所对应的处理函数handle. 这样也可以避免写很多if 。【使用责任链
2021-07-16 10:26:10 3796
原创 以go语言为例类比侦探推理来讲解【性能分析】
pprof 对go语言进行性能分析pprof 提供一个探针包,需要引入到被【检测程序 Main】 中,然后探针生成的文件,可以被pprof提供的分析工具读取分析。注意:探针监控的指标越多,对 Main 的资源的占用会变多。流程简要:【探针包】"runtime/pprof"然后就是创建【剖析文件】profile, _ := os.Create("cpu_profile")cpu_profile 是剖析文件的自定义名称启动 pprof 【剖析程序】,并产生文档到指定【剖析文件】_ =
2021-07-15 10:09:46 195
原创 第一类错误离我们有多远
太久没发博客了,想发又不知道发哪个好。那就随便吧。引用 【数据分析必备技能|正确解读你的AB实验】https://cloud.tencent.com/developer/article/1618910数据分析的思维:当你想分析一个事物并得出结论,就得寻找指标。当这不算数据分析思维,数据分析思维应该是思考怎么证明指标可靠性,比如说,我想证明吃巧克力影响人的心情,就得针对巧克力做ab测试,但我还得证明巧克力跟实验结果构成相关性,即【怎样衡量一个指标是否有显著变化】下一步我就得分析人们心.
2021-07-02 23:32:11 356
原创 直白理解一文搞定http协议缓存
直白理解一文搞定http协议缓存来源声明本文来源如下文章,一些实验数据和结论也是基于该文章:https://mp.weixin.qq.com/s/GkQNZRWIq6MxVE1PeASZkg作者:vajoy来源:https://www.cnblogs.com/vajoy/p/5341664.html前言由于http协议在缓存机制这一块做了很多次迭代。并且每次迭代都做了向下兼容(因为如果你不向下兼容,一些顽固的古董的浏览器厂商不愿意升级就会没有支持http协议了。为了迁就他们所以做了向下兼容)
2021-03-14 12:16:29 147
原创 简洁描述raft与paxos在设计上的共同点和不同点
1.raft与mutil-Paxos一样采用了CAP模型中的CP模型2.raft也是用广播来同步信息,利用多备来实现高可用,利用主从来实现高效读写模型,利用“过半数规则”来实现一致性(这一点理解为降燥容错更好,因为多人同步容易有噪音)。唯一不同的是: raft采用时间差形成的时序先后来确定谁是Master,而paxos采用的是数值和版本号来确定谁是Master.从优缺点来说,raft可以减少消息通讯次数,从而减少选举延迟,性能比paxos高,而最终效果跟paxos一样。你也可以通过修改mast
2021-01-06 10:47:23 349
原创 zookeeper的zab协议解决的问题与设计方案
故事的开始如果从 Lamport 的 basic paxos算法开始捡起来还是有点复杂。我建议从单机开始讲起,对产品不停地迭代。最简单的场景假如,现在我们有一套5个人,需要修改一个变量的值,那就存在竞争问题了。每个人修改值都会做3件事情,那就是读\计算\写。那么就存在一个问题,如果5个人同时对这个变量读写该以谁为准呢?。(我们为了不复杂化我们的系统设计,所以第一个版本,我们【把变量寄放在一块共享内存】)第一个游戏规则如果5个人同时对这个变量读写该以谁为准呢?为了简单粗暴,我们会以最大的为准
2020-12-22 18:15:26 232 2
原创 htpasswd作用
htpasswd是apache的一个工具,该工具主要用于建立和更新存储用户名、密码的文本文件。随apache的安装而生成。这点与ab工具是一样的。htpasswd可以与nagios、SVN、nginx、apache、docker仓库 等进行集成使用。他可以用在支持 Basic Auth的服务器和浏览器中,由于他是集成在HTTP里面的,所以所有的浏览器和http组件都支持。可以认为他是一种大众化的随用随开的Http权限机制。...
2020-12-17 11:41:10 756
原创 Openssl自行签证流程概述
.csr 是请求生成公钥的凭证。.cnf 是请求生成公钥的配置,与.csr共同组合成生成公钥的参数。.key 是私钥,只属于一个人。.crt 是证书链中的一个证书,他的可靠性依赖于根证书roo_ca.crt。自己签证的步骤:1.生成ca.key2.生成ca.csr3.配置ca.cnf4.生成ca.crt开始自签:1.生成 foo.key2.仅利用foo.key 生成 foo.csr3.配置foo.cnf4.让CA 利用 ca.key, ca.crt 根 foo.csr 与 foo.
2020-12-17 11:39:12 208
原创 记一次日志文件IO系统的设计心得
记一次日志文件IO系统的设计心得bytebuffer的使用心得。bytebuffer 的本质上还是缓存,我们可以认为他是比较物理层的概念,比如我们如果没有做好映射访问的规划,或者文件索引没有设计好,就容易导致创建很多文件句柄,最终容易引发操作系统的inode耗光。所以想要学会bytebuffer的重点在于掌握好Position和capacity的使用技巧。其次,就是做好文件索引和映射范围控制,常见的手法就是将文件分段segment,然后对段做索引管理。当然你可以通过控制业务范围和文件回收策略以及后
2020-12-03 14:22:24 193
原创 强一致性和弱一致性的分析思路以及分布式场景的并发技巧
强一致性和弱一致性分区引发的分布式一致性问题当数据出现分区(分区不一定等于分片,分片是指数据划分多个域,分区多指复制,分区包含分片的概念)根据CAP原理(CAP原理来源于 FLP不可能原理),数据出现分区P,那么一致性C和有效性A就得二选一。我们如果强调一致性,即CP,那么就会出现,数据会一段时间不可读,也就意味着系统长时间不可用。如果我们强调系统可用性,即AP,那么就会出现,数据会有一段时间读取旧数据,也就意味着系统对外提供的数据和实时数据不一致。FLP 不可能原理:在网络可靠,存在节点失效
2020-12-01 17:31:13 704 1
原创 用树形算法思想去使用思维导图\树形图\鱼骨图
用树形算法思想去使用思维导图\树形图\鱼骨图在过去,我很不喜欢思维导图这种深度很高的图示。因为一旦深度提高了,那么根部和叶子部位之间或者是祖孙关系比较长的节点就会变得晦涩,就好比,虽然你很尊重你的祖先,但是可能连他怎么称呼都忘记了,但是却可以轻易记住你父亲脸上是否有颗痣。为什么会有这种不公平的对待呢?万恶之源正是关系树太深了。正因此,很多时候我是不喜欢去用这种形如鸡肋的图来归纳我的知识库。但我并不打算放弃他,因为他充满美感,因为他随处可见,我试图用各种方式解读他使用它。然而我找到了我认为最佳的理解方式
2020-11-30 20:44:09 911 1
原创 围棋能力概念与软件开发能力概念的对应
围棋几个有用的概念:死活题:这个就类似于面试题,或者是算法题手筋定式:这个就类似于一些计算机基础知识原理,比如iptables的表链形成的过滤拓扑图,以及SSL或者SSH的加密通讯方案。数据库存储引擎的文件缓存管理原理,reactor原理,以及动态代理技术。布局:这个就是架构图设计,以及一些系统设计理论,又或者是代码框架选型使用理论。围棋术语和收官技巧:计算机基础知识,操作系统原理和计算机原理,编程语言特性。主流新手筋和新布局:新技术和研究和发展。子效判断:实战经验和理解。...
2020-11-28 11:22:00 136
原创 iptables研究
#iptables研究iptables是基于内核模块netfilter的hook函数实现的一个用户态接口程序。iptables有5个表,其中最常用的有3个分别是 (就像netty,表就好比有5个channel,链就好比每个channel都有读写handler方法够成的Pipeline, 规则就好handler. 也是一样可以交织成一个路由过滤网络)filter过滤, nat地址转换, mangle修改每个表都表示一个namespace,它所关注的链都不一样,就好比他们侧重的领域不一样filter只
2020-11-28 10:46:57 178
原创 当一会设计SSL/TLS通讯协议的产品经理
当一会设计SSL/TLS通讯协议的产品经理1.需求背景防止ETP, Eavesdropping窃听, Tempering篡改,Pretending冒充,三个危害程度由轻到重。有了这个需求背景,我们自然就会想到加密通讯。加密的方式是,首先我们想到最好的加密方式是,非对称加密,因为他做到了只在加密或者只在解密的时候需要用到私钥,就足够了。相比加解密都要暴露一次私钥的对称加密的做法显得更安全,唯独一个缺点就是性能低下。对称加密虽然性能高,但是我们暴露时间长了容易泄漏。那究竟要怎么合理的设计加密方案呢?
2020-11-25 20:56:00 127 1
原创 找众数算法-摩尔投票法
背景假设有N个选票需要统计。当候选人数固定为K人,可以进行K轮统计,每轮需要N个票。所以复杂度是O(n)当候选人数不固定,那么最坏的情况就是O(n^2)。即 候选人有n位,每位都要读n票。当选票号码是有序时。那么候选人的票号就会聚合,这个时候只需要O(n)即可统计每位候选人的票数。如果给定一组数组,我们只针对该数字的某一个范围做一次求解,那么摩尔算法显然是比较合适的,毕竟只需要O(n)即可求解候选人未知且无序的选票中找到众数。但如果我们需要多次再给定数组中做查询,那么先用复杂度高的索引算法建立索
2020-11-10 11:50:37 617
原创 count(*) 和 count(1)和count(列名)区别
count(*) 和 count(1)和count(列名)区别区别count(*) 所有记录count(1) 1表示主键,统计主键列(主键肯定非空的)count(列名) 统计非空列指标: 是否统计非空 (是否用索引,用了索引肯定是包含null列的)。总结起来,不统计null,肯定是性能差的count(列名),统计null肯定是count(1),count(*)也会被优化为count(1).这一点体现了【行数据库】对索引的重要性,以及对行约束是否Null的重要性。所以总的来说,行
2020-11-10 10:44:50 174
原创 【获取shell脚本文件的全路径】涉及的知识点
【获取shell脚本文件的全路径】涉及的知识点$0是当前执行脚本的名称。dirname $0 是当前执行脚本的父目录(相对路径,仍然不是全路径)真正读取全路径的方法:base_dir=(cd"(cd "(cd"(dirname “$0”)";pwd) 则是 切换工作目录到脚本父目录下,然后pwd,返回当前脚本父目录。如果不cd,按照fork的特性,就会继承父进程的work directory.这里有个好处就是我们在 $()里面执行shell script,也就是在子进程里改变了work-dir。因
2020-11-10 10:35:22 939
原创 innodb_flush_log_at_trx_commit参数的直白理解
innodb_flush_log_at_trx_commit 可以定义mysql的事务提交方式mysql写文件有2块缓存。一块是自己定义在内存的log buffer, 另一个是磁盘映射到内存的os cache。mysql可以 调用 flush 主动将log buffer 刷新到磁盘内存映射,也可以调用 fsync 强制操作系同步磁盘映射文件到磁盘。还可以同时调用 flush + fsync, 将缓存直接落盘。innodb_flush_log_at_trx_commit = 0 就是每秒调用.
2020-10-26 16:52:53 7057
原创 列式存储Clickhouse的学习总结
clickhouse学习先说性能根据网上提供的压测报告在机器性能最好的情况下(报告没有给配置)http://www.dbarun.com/clickhouse/clickhouse-distributed-table-performance-pdf/写入时25万每秒(算是副本同步时间,这里时按照3个分片2个副本来做压测)而查询则以列式存储的优势达到了PB级别的秒级查询。说说特点系统两个特点:第一,自动平衡分片。分片的目的是提高吞吐量。第二,自动副本高可用。副本的目的是为了高可用。总得
2020-10-26 15:20:55 438
原创 lua为什么喜欢和nginx一起做鉴权等业务呢?
lua为什么喜欢和nginx一起做鉴权等业务呢?因为nginx本身高性能,而且nginx worker采用c语言编写,可以高性能的执行小部分业务逻辑(主要是对本地缓存做业务逻辑)。但是nginx基于c的插件拓展口不大友好。而lua作为一种语法糖,恰好可以弥补这个缺点。我们可以利用Lua语法编写nginx插件,让部分业务在nginx运行(反正nginx运行那么快,找点小业务拖一拖它的性能一点都不过分,据说Nginx单机压测能到3万tps。)lua可以做一些针对request请求包的安全检测,甚至可以通过
2020-10-16 17:51:38 393 1
原创 线程池实践经验总结
线程池的使用技巧线程池常用的两种场景:【分治】可以将任务利用分治的思想分割成多个任务,然后再利用线程池控制CPU并发的线程数量。【限制任务执行时间】线程池的超时机制的妙用,可以利用Future超时机制,帮我们实现超时的功能。什么是callable,什么是runnable,什么是ForkJoin,什么是Future,什么是FutureTaskcallable是一个接口,它允许我们传递返回值给线程执行的上下文。通俗的说,就是给了我们一个读取线程的结果。这个结果通过Future进行封装,Futur
2020-10-16 11:13:27 215
原创 【翻文+导读】《Writing a C Compiler》从0开始写C编译器
【翻文+导读】《Writing a C Compiler》从0开始写C编译器前言据说,这是学习做编译器必读优秀文章,所以就做一下翻译以及导读,顺便自己也学习一下。作者Nora Sandler 也很用心,涉及一些如何从0开发编译器的实施计划和方法论 (Abdulaziz Ghuloum 的 增量开发的方式)。转载请留言申请即可翻译《Writing a C Compiler, Part 1》https://norasandler.com/2017/11/29/Write-a-Compiler.html
2020-09-15 17:27:44 2633
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人