《后端技术面试 38 讲》学习笔记 Day 01
学习目标
在2022年春节将至(半个月),适合在这个冬天里,温故知新。通过学习一门覆盖面较广的课程,来夯实基础,完善自己的知识体系,是一个很棒的选择。
总结性的学习,不求快,而求稳。这门课程的学习,我将跟随专栏的章节所讲,结合工作内容进行思考,记录并分享。欢迎大家对我的思考发起质疑,共同探讨。
开篇词 | 掌握软件开发技术的第一性原理
原文摘抄
-
建立起技术思维体系,掌握技术体系背后的原理,那么当你接触一个新技术的时候,就可以快速把握住这个新技术的本质特征和思路方法。
-
“让我自由地从物理规则出发去思考问题,而不是迎合那些所谓的世俗智慧。”
-
如果你掌握了软件开发技术的第一性原理,那么当你为了解决某个新问题,去学习和研究一个新技术的时候,就算遇到了知识的盲点,也可以快速定位到自己技术体系的具体位置,进一步阅读相关的书籍资料
-
第一性原理是一种思维方式,一种学习方式,一种围绕事物核心推动事物正确前进的做事方式
心得体会
- 掌握技术的原理,才能更好理解技术的应用,巧妙的进行设计。
- 建立技术体系,才能让这幢“大楼”更为稳固,才能让上手更加的熨帖,才能巨人肩膀上再踏出一步。
01丨程序运行原理:程序是如何运行又是如何崩溃的?
原文摘抄
- 程序是静态的,安静地呆在磁盘上,什么也干不了
- 程序运行起来以后,被称作进程。
- 程序运行时如果需要创建数组等数据结构,操作系统就会在进程的堆空间申请一块相应的内存空间,并把这块内存的首地址信息记录在进程的栈中。
- 进程在生命周期中,主要有三种状态,运行、就绪、阻塞。
- CPU 以线程为单位进行分时共享执行
- 每个线程有自己的线程栈,所有的线程栈都是完全隔离的
- 多个线程访问共享资源的这段代码被称为临界区,解决线程安全问题的主要方法是使用锁
- 锁会引起线程阻塞,如果有很多线程同时在运行,那么就会出现线程排队等待锁的情况,线程无法并行执行,系统响应速度就会变慢。此外 I/O 操作也会引起阻塞,对数据库连接的获取也可能会引起阻塞。
- 如果阻塞的线程数超过了某个系统资源的极限,就会导致系统宕机,应用崩溃
心得体会
- 程序是一个文件,一个可以被操作系统理解,运行的文件。
- 程序运行的单位是一个进程,操作系统为进程在内存中分配堆空间、栈空间;分配CPU时间片执行代码指令。
- 程序变慢主要是锁、IO阻塞等竞争性的资源有限,过多的竞争导致“排队”阻塞。
- 程序奔溃是变慢的一个无穷大的体现。资源已经完全不足,操作系统、甚至硬件为了自保的壁虎断尾操作。
02丨数据结构原理:Hash表的时间复杂度为什么是O(1)?
原文摘抄
数据结构
- 数组是最常用的数据结构,创建数组必须要内存中一块连续的空间,并且数组中必须存放相同的数据类型。
- 不同于数组必须要连续的内存空间,链表可以使用零散的内存空间存储数据。
- Hash 表的物理存储其实是一个数组,如果我们能够根据 Key 计算出数组下标,那么就可以快速在数组中查找到需要的 Key 和 Value。一旦发生 Hash 冲突,只需要将相同下标,不同 Key 的数据元素添加到这个链表就可以了
- 数组和链表都被称为线性表,因为里面的数据是按照线性组织存放的.
- 栈就是在线性表的基础上加了这样的操作限制条件:后面添加的数据,在删除的时候必须先删除,即通常所说的“后进先出”。
- 队列也是一种操作受限的线性表,栈是后进先出,而队列是先进先出。
- 树则是非线性表
心得体会
-
为什么我们会关心O(1)、O(N)、O(nlogn)等算法复杂度,究其原因,是访问一次内存大约需要200-300个时钟周期(即比CPU慢这么多倍)。我们组织不同的数据结构,不同算法,根本原因还是要通过减少遍历来减少内存的访问。
-
我认为数据结构从内存的连续性可以分为两类,一类就是申请连续内存空间的数组演变的数据结构;一类是以类似链表,申请不连续的空间,通过记录下一个或上一个等关联元素内存地址来进行寻址的数据结构,例如树。
对于不同的数据结构有不同的算法进行查找、插入、删除,其所需操作内存的复杂度(时间、空间)会有不同的体现。例如连续内存空间的数据结构,如果有逻辑可以计算内存偏移,那么访问就是O(1),但是插入或删除,都会因为连续性导致其后的元素需要进行移动,就适合读多写少的场景。
我们要理解内存的访问,再去组织它的数据结构,来自己“定制”最合适的数据结构。
工作体验
-
正如这节课老师提到的:“事实上,我很难相信,如果这些基本数据结构没有掌握好,如何能开发好一个稍微复杂一点的程序”。我想起大三的时候与同学参与比赛时共同开发“贪吃蛇大作战”这样的手机游戏,看起来应该是个easy的程序,也就链表记录蛇的位置,长度。而我们遇到了游戏运行时间久了之后,游戏卡顿的问题,最终发现是遍历蛇、每条蛇吃食物等等操作,在这个数据大了之后遍历就很慢。最后针对这样的情况分析修改,来做性能优化。
而在我的工作中,微服务体系的注册中心、配置中心、网关等中间件,其维护着整个公司以万为单位的微服务节点,其如何保