- 博客(190)
- 收藏
- 关注
原创 给你代码加个“颜值”吧!
每个程序员只要不犯错,都能写出机器能看得懂的代码,程序能正常跑起来,自然就意味着机器正常识别了程序。但是,真正牛逼的程序员是写出能让人看得懂的代码。不要小看这个,虽说我们写的代码确实是跑给机器的,但是代码是人写的,而通常一个项目的开发,需要多个程序员一同协助开发,这时能写出 human readble 的代码就显得至关重要,因为不仅可以减少后期维护的时间成本,而且还能让后面加入的新同事能更快的上手项目。要能写出干净、整洁并让人易懂的代码,必然离不开一些规则,只要自觉遵守、合理运用这些规则,代码通常都.
2021-02-10 13:18:23
3485
1
原创 为了搞懂 HTTPS,我把大学的数学书拿了出来。。。
HTTPS 常用的密钥交换算法有两种,分别是 RSA 和 ECDHE 算法。其中,RSA 是比较传统的密钥交换算法,它不具备前向安全的性质,因此现在很少服务器使用的。而 ECDHE 算法具有前向安全,所以被广泛使用。我在上一篇已经介绍了 RSA 握手的过程,今天这一篇就「从理论再到实战抓包」介绍 ECDHE 算法。离散对数ECDHE 密钥协商算法是 DH 算法演进过来的,所以我们先从 DH 算法说起。DH 算法是非对称加密算法, 因此它可以用于密钥交换,该算法的核心数学思想是离散对数。是不是
2021-01-23 17:33:49
3661
1
原创 几幅图,拿下 HTTPS
我很早之前写过一篇关于 HTTP 和 HTTPS 的文章,但对于 HTTPS 介绍还不够详细,只讲了比较基础的部分,所以这次我们再来深入一下 HTTPS,用实战抓包的方式,带大家再来窥探一次 HTTPS。对于还不知道对称加密和非对称加密的同学,你先复习我以前的这篇文章「硬核!30 张图解 HTTP 常见的面试题」,本篇文章默认大家已经具备了这些知识。TLS 握手过程HTTP 由于是明文传输,所谓的明文,就是说客户端与服务端通信的信息都是肉眼可见的,随意使用一个抓包工具都可以截获通信的内容。所以安
2021-01-13 20:38:34
4119
2
原创 带宽、延时、吞吐率、PPS 这些都是啥?
Linux 网络协议栈是根据 TCP/IP 模型来实现的,TCP/IP 模型由应用层、传输层、网络层和网络接口层,共四层组成,每一层都有各自的职责。应用程序要发送数据包时,通常是通过 socket 接口,于是就会发生系统调用,把应用层的数据拷贝到内核里的 socket 层,接着由网络协议栈从上到下逐层处理后,最后才会送到网卡发送出去。而对于接收网络包时,同样也要经过网络协议逐层处理,不过处理的方向与发送数据时是相反的,也就是从下到上的逐层处理,最后才送到应用程序。网络的速度往往跟用户体验是挂钩的,那
2020-12-15 15:05:36
9311
6
原创 到现在还搞不懂,索引为什么能提供查询性能?
前言昨天,有个女孩子问我提高数据库查询性能有什么立竿见影的好方法?这简直是一道送分题,我自豪且略带鄙夷的说,当然是加「索引」了。她又不紧不慢的问,索引为什么就能提高查询性能。这还用问,索引就像一本书的目录,用目录查当然很快。她失望地摇了摇头,你说的只是一个类比,可为什么通过目录就能提高查询速度呢。唉,对啊,通过书目可以快速查询,这只是一个现象,真正原因到底是什么呢。那女孩看着诧异且表情僵硬的我,满意而又意味深长的笑笑:原来你这个男程序员也不会,看来我还得靠自己研究了。哎,熬夜又要憔悴了我这该
2020-11-27 15:13:19
3260
2
原创 你不好奇 CPU 是如何执行任务的吗?
前言你清楚下面这几个问题吗?有了内存,为什么还需要 CPU Cache?CPU 是怎么读写数据的?如何让 CPU 能读取数据更快一些?CPU 伪共享是如何发生的?又该如何避免?CPU 是如何调度任务的?如果你的任务对响应要求很高,你希望它总是能被先调度,这该怎么办?…这篇,我们就来回答这些问题。正文CPU 如何读写数据的?先来认识 CPU 的架构,只有理解了 CPU 的 架构,才能更好地理解 CPU 是如何读写数据的,对于现代 CPU 的架构图如下:可以看到,一个 CP..
2020-11-06 17:43:44
5472
原创 学完计组后,我马上在「我的世界」造了台显示器,你敢信?
前言今天的主题十分有趣,我们将在我的世界(Minecraft)这个游戏里,靠一个个逻辑门来组合实现一个简单的七段显示器,可以实现将选择的数字输出在显示器上。我会从最基础的与或非实现开始,亲自画出电路原理图,并且用我的世界来带领大家领略数字电子技术的精妙之处。本文所涉及的数电知识包括电路编码、基本逻辑门、组合电路。当然,由于电路的精密性以及游戏里实现的复杂性,实现完整的电路是非常困难的,也会让人难以看懂,一下子就劝退了,这也就违背了我们学习知识的初衷。所以,我会适当的对电路进行化简,让人看起来简单易
2020-10-30 16:34:34
5206
6
原创 10 张图打开 CPU 缓存一致性的大门
前言直接上,不多 BB 了。正文CPU Cache 的数据写入随着时间的推移,CPU 和内存的访问性能相差越来越大,于是就在 CPU 内部嵌入了 CPU Cache(高速缓存),CPU Cache 离 CPU 核心相当近,因此它的访问速度是很快的,于是它充当了 CPU 与内存之间的缓存角色。CPU Cache 通常分为三级缓存:L1 Cache、L2 Cache、L3 Cache,级别越低的离 CPU 核心越近,访问速度也快,但是存储容量相对就会越小。其中,在多核心的 CPU 里,每个核心..
2020-10-27 18:35:42
6344
5
原创 作为技术人,我们如何画出精美的技术配图?我把我画上百张图片的经验,分享给你们
小林写这么多篇图解文章,你们猜我收到的最多的读者问题是什么?没错,就是问我是使用什么画图工具,看来对这一点大家都相当好奇,那干脆不如写一篇介绍下我是怎么画图的。如果我的文章缺少了自己画的图片,相当于失去了灵魂,技术文章本身就很枯燥,如果文章中没有几张图片,读者被劝退的概率飙飙升,剩下没被劝退的估计看着看着就睡着了。所以,精美的图片可以说是必不可少的一部分,不仅在阅读时能带来视觉的冲击,而且图片相比文字能涵盖更多的信息,不然怎会有一图胜千言的说法呢?这时,可能有的读者会说自己不写文章呀,是不是没有必要了解
2020-10-24 13:08:29
6523
6
原创 如何写出让 CPU 跑得更快的代码
前言代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能。CPU 内部嵌入了 CPU Cache(高速缓存),它的存储容量很小,但是离 CPU 核心很近,所以缓存的读写速度是极快的,那么如果 CPU 运算时,直接从 CPU Cache 读取数据,而不是从内存的话,运算速度就会很快。但是,大多数人不知道 CPU Cache 的运行机制,以至于不知道如何才能够写出能够配合 CPU Cache ..
2020-10-18 17:12:57
17167
27
原创 天啦噜!知道硬盘很慢,但没想到比 CPU L1 Cache 慢 10000000 倍
前言大家如果想自己组装电脑的话,肯定需要购买一个 CPU,但是存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬盘。相信大家都知道内存和硬盘都属于计算机的存储设备,断电后内存的数据是会丢失的,而硬盘则不会,因为硬盘是持久化存储设备,同时也是一个 I/O 设备。但其实 CPU 内部也有存储数据的组件,这个应该比较少人注意到,比如寄存器、CPU L1/L2/L3 Cache 也都是属于存储设备,只不过它们能存储的数据非常
2020-10-14 09:39:31
6913
4
原创 CPU 执行程序的秘密,藏在了这 15 张图里
前言代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗?软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电脑上吗?64 位的操作系统可以运行在 32 位的电脑上吗?如果不行,原因是什么?CPU 看了那么多,我们都知道 CPU 通常分为 32 位和 64 位,你知道 64 位相比 32 位 CPU 的优势在哪吗?64 位 CPU 的计算性能一定比 32 位 CPU 高很多吗?不知道也不用慌张,接下来就循序渐进..
2020-10-10 23:29:52
12209
15
原创 掏心掏肺分享,大学四年我是怎么学操作系统和计算机网络的?
最近收到不少读者留言,关于怎么学「操作系统」和「计算机网络」的留言,小林写这一块的内容也有半年多了,啃非常多的书,也看了很多视频,有好的有差的,今天就掏心掏肺地分享给大家。
2020-09-28 19:34:14
23230
32
原创 原来 8 张图,就可以搞懂「零拷贝」了
前言磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。这次,我们就以「文件传输」作为切入点,来分析 I/O 工作方式,以及如何优化传输文件的性能。正文为什么要有 DMA 技术?在没有 DMA 技术前,I/O 的过程是这样的:CPU 发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到..
2020-09-23 17:07:44
23529
36
原创 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同种类的锁自然适用于不同的场景。如果选择了错误的锁,那么在一些高并发的场景下,可能会降低系统的性能,这样用户体验就会非常差了。所以,为了选择合适的锁,我们不仅需要清楚知道加锁的成本开销有多大,还需要分析业务场景中访问的共享资源的方式,再来还要考虑并发访问共享资源时的冲突概率。
2020-09-15 20:22:07
20520
14
原创 进程调度算法/页面置换算法/磁盘调度算法,20 张图一举拿下
前言最近,我偷偷潜伏在各大技术群,因为秋招在即,看到不少小伙伴分享的大厂面经。然后发现,操作系统的知识点考察还是比较多的,大厂就是大厂就爱问基础知识。其中,关于操作系统的「调度算法」考察也算比较频繁。所以,我这边总结了操作系统的三大调度机制,分别是「进程调度/页面置换/磁盘调度算法」,供大家复习,希望大家在秋招能斩获自己心意的 offer。正文进程调度算法进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,..
2020-09-08 10:59:05
14908
5
原创 键盘敲入A 字母时,期间发生了什么?
前言键盘可以说是我们最常使用的输入硬件设备了,但身为程序员的你,你知道「键盘敲入A 字母时,操作系统期间发生了什么吗」?那要想知道这个发生的过程,我们得先了解了解「操作系统是如何管理多种多样的的输入输出设备」的,等了解完这个后,我们再来看看这个问题,你就会发现问题已经被迎刃而解了。正文设备控制器我们的电脑设备可以接非常多的输入输出设备,比如键盘、鼠标、显示器、网卡、硬盘、打印机、音响等等,每个设备的用法和功能都不同,那操作系统是如何把这些输入输出设备统一管理的呢?为了屏蔽设备之间的差异,..
2020-08-23 20:34:53
11846
9
原创 一口气搞懂「文件系统」,就靠这 25 张图了
前言不多 BB,直接上「硬菜」。正文文件系统的基本组成文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。Linux 最经典的一句话是:「一切皆文件」,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。Linux 文件系统会为每个..
2020-08-13 21:48:43
56887
72
原创 凉了!张三同学没答好「进程间通信」,被面试官挂了....
前言开场小故事炎炎夏日,张三骑着单车去面试花了 1 小时,一路上汗流浃背。结果面试过程只花了 5 分钟就结束了,面完的时候,天还是依然是亮的,还得在烈日下奔波 1 小时回去。面试五分钟,骑车两小时。你看,张三因面试没准备好,吹空调的时间只有 5 分钟,来回路上花了 2 小时晒太阳,你说惨不惨?所以啊,炎炎夏日,为了能延长吹空调的时间,我们应该在面试前准备得更充分些,吹空调时间是要自己争取的。很明显,在这一场面试中, 张三在进程间通信这一块没复习好,虽然列出了进程间通信的方式,但这只是..
2020-07-29 23:33:12
16090
27
原创 看我稳住「多线程」翻车的现场!
前言先来看看虚构的小故事已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕。没办法这段时间公司业绩增长中,需求自然也多了起来,加班自然也少不了。天气变化莫测,这时窗外下起了蓬勃大雨,同时闪电轰鸣。但这一丝都没有影响到小明,始料未及,突然一道巨大的雷一闪而过,办公楼就这么停电了,随后整栋楼都在回荡着的小明那一声撕心裂肺的「卧槽」。此时,求小明的心里面积有多大?等小明心里平复后,突然肚子非常的痛,想上厕所,小明心想肯定是晚上吃的某堡王有问题。整栋楼都停了电,..
2020-07-20 18:34:17
16567
19
原创 进程、线程基础知识全家桶,30 张图一套带走
前言先来看看一则小故事我们写好的一行行代码,为了让其工作起来,我们还得把它送进城(进程)里,那既然进了城里,那肯定不能胡作非为了。城里人有城里人的规矩,城中有个专门管辖你们的城管(操作系统),人家让你休息就休息,让你工作就工作,毕竟摊位不多,每个人都要占这个摊位来工作,城里要工作的人多着去了。所以城管为了公平起见,它使用一种策略(调度)方式,给每个人一个固定的工作时间(时间片),时间到了就会通知你去休息而换另外一个人上场工作。另外,在休息时候你也不能偷懒,要记住工作到哪了,不然下次到你工作..
2020-07-12 21:27:32
7794
16
原创 20 张图揭开「内存管理」的迷雾,瞬间豁然开朗
每日英语,每天进步一点点前言之前有不少读者跟我反馈,能不能写图解操作系统?既然那么多读者想看,我最近就在疯狂的复习操作系统的知识。操作系统确实是比较难啃的一门课,至少我认为比计算机网络难太多了,但它的重要性就不用我多说了。学操作系统的时候,主要痛苦的地方,有太多的抽象难以理解的词语或概念,非常容易被劝退。即使怀着满腔热血的心情开始学操作系统,不过 3 分钟睡意就突然袭来。。。该啃的还是得啃的,该图解的还是得图解的,万众期待的「图解操作系统」的系列来了。本篇跟大家说说内存管理,内存管理还是
2020-06-30 14:40:44
33650
49
原创 你知道跟 TCP三次握手息息相关的半连接队列和全连接队列吗?
前言网上许多博客针对增大 TCP 半连接队列和全连接队列的方式如下:增大 TCP 半连接队列的方式是增大 /proc/sys/net/ipv4/tcp_max_syn_backlog;增大 TCP 全连接队列的方式是增大 listen() 函数中的 backlog;这里先跟大家说下,上面的方式都是不准确的。“你怎么知道不准确?”很简单呀,因为我做了实验和看了 TCP 协议栈的内核源码,发现要增大这两个队列长度,不是简简单单增大某一个参数就可以的。接下来,就会以实战 + 源码分析,带大家
2020-05-30 22:27:39
4474
5
原创 实战!我用 Wireshark 让你「看得见」 TCP
每日一句英语学习,每天进步一点点:前言为了让大家更容易「看得见」 TCP,我搭建不少测试环境,并且数据包抓很多次,花费了不少时间,才抓到比较容易分析的数据包。接下来丢包、乱序、超时重传、快速重传、选择性确认、流量控制等等 TCP 的特性,都能「一览无云」。没错,我把 TCP 的"衣服扒光"了,就为了给大家看的清楚,嘻嘻。正文显形“不可见”的网络包网络世界中的数据包交互我们肉眼是看不见的,它们就好像隐形了一样,我们对着课本学习计算机网络的时候就会觉得非常的抽象,加大了学习的难度。还别说,
2020-05-20 20:51:19
4980
5
原创 IP 基础知识全家桶,45 张图一套带走
前言前段时间,有读者希望我写一篇关于 IP 分类地址、子网划分等的文章,他反馈常常混淆,摸不着头脑。那么,说来就来!而且要盘就盘全一点,顺便挑战下小林的图解功力,所以就来个 IP 基础知识全家桶。吃完这个 IP 基础知识全家桶全家桶,包你撑着肚子喊出:“真香!”不多说,直接上菜,共分为三道菜:首先是前菜 「 IP 基本认识 」其次是主菜 「IP 地址的基础知识」最后是点心 「IP ...
2020-05-05 12:42:41
7269
9
原创 写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?
每日英语,每天进步一点点(偷笑):前言临近五一节,想到有 5 天假期,小林开始飘了。写个简单的 Bash 脚本都不上心了,写完连检查都不检查,直接拖到到实体服务器跑。结果一跑起来,发生不对劲,怎么一个简单脚本跑了 10 秒还没结束,于是立马直接 ctrl + c 一顿操作停掉了运行中脚本。接着,习惯性的输入了 ls,结果 what? 找不到 ls 命令?瞬间背后一凉,慌慌张张打开...
2020-04-30 16:55:43
3187
7
原创 当键入网址后,到网页显示,其间发生了什么?
你知道「当键入网址后,到网页显示,其间发生了什么」吗?这常见的问题,我用 25 张图给你说明白!
2020-03-16 21:57:43
8905
19
原创 硬核!30 张图解 HTTP 常见的面试题,给你整明白
小林我搜集了 5 大类 HTTP 面试常问的题目,同时这 5 大类题跟 HTTP 的发展和演变关联性是比较大的,通过问答 + 图解的形式由浅入深的方式帮助大家进一步的学习和理解 HTTP 。
2020-03-08 14:38:50
5737
7
原创 让类/进程/脚本「单身」的方法
每日一句英语学习,每天进步一点点:"Better not to ignore the past but learn from it instead. Otherwise, his...
2020-02-22 12:04:00
1535
原创 学过 C++ 的你,不得不知的这 10 条细节!(附思维导图)
前言我在阅读 《Effective C++ (第三版本)》 书时做了不少笔记,从中收获了非常多,也明白为什么会书中前言的第一句话会说:对于书中的「条款」这一词,我更喜欢以「细节」替换,毕竟年轻的我们在打 LOL 或 王者的时,总会说注意细节!细节!细节~ —— 细节也算伴随我们的青春的字眼针对书中的前两个章节,我筛选了 10 个 细节(条款)作为了本文的内容,这些细节也相对基础且重要。针...
2020-02-12 21:03:11
2596
原创 算法:计算十进制数字在二进制表示1的个数
题目:程序读入一个整数 n,假设 n 不会大于 1000,请输出 1 到 n 每个数字的二进制表示 1 的个数。
2020-01-21 00:10:00
3410
1
原创 C++ 模板常见特性(函数模板、类模板)
背景C++ 是很强大,有各种特性来提高代码的可重用性,有助于减少开发的代码量和工作量。C++ 提高代码的可重用性主要有两方面:继承模板继承的特性我已在前面篇章写过了,本篇主要是说明「模板」的特性。使用「模板」的特性设计,实际上也就是「泛型」程序设计。函数模板01 变量交换函数模板假设我们设计一个交换两个整型变量的值的函数,代码如下:// 交换两个整型变量的值的Swap函数:...
2020-01-09 09:50:00
2141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人