帅地吐血整理:那些让你起飞的计算机基础知识

共 4124字,需浏览 9分钟

 ·

2021-09-02 16:46

我公众号里的文章,写的大部分都是与计算机基础知识相关的,这些基础知识,就像我们的内功,如果在未来想要走的更远,这些内功是必须要修炼的。


框架千变万化,而这些通用的底层知识,却是几乎不变的,了解了这些知识,可以帮助我们更快着学习一门知识,更加懂得计算机的运行机制。


当然,在面试中也经常会被问到,特别是对于应届生,对于春秋招,也可以看看我前阵子写过的文章历经两个月,我的秋招之路结束了!


也有读者经常问的计算机基础知识究竟是指啥?学习顺序?推荐书籍?

我公众号的读者学生以及非科班的应该挺多的,所以我今天这篇文章就写一写,我学过的计算机基础知识,看过的书以及我学过的顺序

当然,以下是我个人的一些经验,并且学过的一些知识,仅供参考,也欢迎大家进行补充,文章涉及的资料文末都会提供

一、计算机网络

在我们用的程序中,99% 都离不开网络,作为一个程序员,我觉得了解计算机网络是必须的,在大学的课程中,一般也都会开设这一门课。

在我学习这门课之前,我就特别好奇,一台电脑是怎么把消息发给另外一台电脑的呢?例如:

1、两台电脑啥线路也没有相连,怎么就能把消息发送给他呢?

2、世界上的电脑那么多,咋就能找到那台特点的电脑呢?有人说我们可以 MAC 或者 IP 来唯一标识啊,可是,我就有点疑惑了,世界那么大,电脑那么多,有了这个标识,我们该怎么找到他呢?遍历所有电脑?

3、多个程序同时发消息给一台电脑,电脑是如何准确把这些消息拿给这些不同程序的呢?

4、发送的消息丢失了怎么办?

总之,一大堆疑问,看了计算机网络之后,才豁然开朗。自己也写了一篇评价不错的文章:一文读懂一台计算机是如何把数据发送给另一台计算机的

所以这里,我是强烈建议大家学一下的,在面试中,计算机网络也是高频考点,这里我大致总结一下一些必学协议以及面试高频考点:

物理层、链路层

  1. MTU,MAC地址,以太网协议。

  2. 广播与 ARP 协议

网络层

  1. ip 地址分类

  2. IP 地址与 MAC 地址区别

  3. 子网划分,子网掩码

  4. ICMP 协议及其应用

  5. 路由寻址

  6. 局域网,广域网区别

传输层(主要就是 TCP)

  1. TCP首部报文格式(SYN、ACK、FIN、RST必须知道)

  2. TCP滑动窗口原理,TCP 超时重传时间选择

  3. TCP 拥塞控制,TCP 流量控制

  4. TCP 三次握手与四次挥手以及状态码的变化

  5. TCP连接释放中TIME_WAIT状态的作用

  6. SYN 泛洪攻击

  7. TCP 粘包,心跳包

  8. UDP 如何实现可靠传输

  9. UDP 与 TCP 的区别

  10. UDP 以及 TCP 的应用场景

应用层

  1. DNS 原理以及应用

  2. HTTP 报文格式,HTTP1.0、HTTP1.1、HTTP2.0 之间的区别

  3. HTTP 请求方法的区别:GET、HEAD、POST、PUT、DELETE

  4. HTTP 状态码

  5. HTTP 与 HTTPS 的区别

  6. 数字证书,对称加密与非对称加密

  7. cookie与session区别

  8. 输入一个URL到显示页面的流程(越详细越好,搞明白这个,网络这块就差不多了)

上面写的这些协议,我觉得是比较重要的,特别是在面试中。之前写过一个计算机网络入门教程:别看教材了,帅地熬夜肝了一份计算机网络极简入门教程

对于新手推荐视频:可以看韩老师讲的视频,在哔哩哔哩搜索韩老师就可以找到 韩老师讲高校《计算机网络原理》

推荐书籍:《计算机网络:自顶向下》、《图解http》

我是先看了视频,在看这两本书的(文末我会给出电子版)。

二、操作系统

操作系统也是一门非常重要的知识,在面试中也是问的非常多(当然,看公司,有些公司技术栈是 Java 的,可能问的比较少)。对于操作系统,要学的也挺多,例如:

啥是进程,啥是线程,他们的本质区别?我们运行一个程序时,数据放在哪里?代码放在哪里?咋就还要分堆和栈?线程切换时是上下文是啥意思?

虚拟地址是什么鬼东西?线程需要那么多种状态干啥子?什么是乐观锁、悲观锁?死锁是怎么造成的?解决死锁的策略有哪些?等等

大致就是如下知识

  1. 进程与线程区别
  2. 线程同步的方式:互斥锁、自旋锁、读写锁、条件变量
  3. 互斥锁与自旋锁的底层区别
  4. 孤儿进程与僵尸进程
  5. 死锁及避免
  6. 多线程与多进程比较
  7. 进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket

  8. 管道与消息队列对比

  9. fork进程的底层:读时共享,写时复制

  10. 线程上下文切换的流程

  11. 进程上下文切换的流程

  12. 进程的调度算法

  13. 阻塞IO与非阻塞IO

  14. 同步与异步的概念

  15. 静态链接与动态链接的过程

  16. 虚拟内存概念(非常重要)

  17. MMU地址翻译的具体流程

  18. 缺页处理过程

  19. 缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法

推荐视频:这个我没看过视频,所以想学的,我推荐去中国mooc大学找各大高校的课,也可以去国外找对应的课。

推荐书籍:我看过的书籍是《操作系统—精髓与设计原理(第八版)》,不过大佬们都推荐《深入理解计算机操作系统(原书第三版)》,我看过目录,感觉还不错,这里也推荐这一本。不过对于零基础的,我建议可以先看一本专门给小白看的书:《程序是如何跑起来的》。

操作系统的学习,还是挺枯燥的,不过,只有把最难的啃过去,才能变的更加强大。

三、数据库(这里我用 MySQL)

在大学的课程里,一般都会开设一门数据库的课程,不过这门数据库是没有针对某一种数据库语言的(例如 MySQL、Oracle)。不过我这里只讲 MySQL的学习,别问为什么,问就是我逃了二十分之十九的课

把MySQL学好,还是特别重要的,千万不能停留在会用的层面上,而是应该要了解一下原理,特别是对于要面试的同学,会问挺多原理,我每次被问到 MySQL 我都会信心大增。

记得腾讯、shopee面试时,面完 MySQL,面试官好像对我刮目相看了。好了,不吹了,说这些也是强大 MySQL 的重要性。下面就说我学过的一些知识以及推荐的学习资料吧。

对于 MySQL,需要学的还挺多的,例如,

1、一条 sql 语句是如何执行的?也就是说,从客户端执行了一条 sql 命令,服务端会进行哪些处理?(例如验证身份,是否启用缓存啥的)。

2、索引相关:索引是如何实现的?多种引擎的实现区别?聚族索引,非聚族索引,二级索引,唯一索引、最左匹配原则等等(非常重要)。

3、事务相关:例如事务的隔离是如何实现的?事务是如何保证原子性?不同的事务看到的数据怎么就不一样了?难道每个事务都拷贝一份视图?MVCC 的实现原理(重要)等等。

4、各种锁相关:例如表锁,行锁,间隙锁,共享锁,排他锁。这些锁的出现主要是用来解决哪些问题?(重要)

5、日志相关:redolog,binlog,undolog,这些日志的实现原理,为了解决怎么问题?日志也是非常重要的吧,面试也问的挺多。

6、数据库的主从备份、如何保证数据不丢失、如何保证高可用等等。

7、一些故障排查的命令,例如慢查询,sql 的执行计划,索引统计的刷新等等。

推荐书籍:连 sql 都不会写的,推荐《SQL必知必会》,接着推荐《MySQL技术内幕:InnoDB存储引擎》。

四、数据结构与算法

数据结构与算法,我就不想多说了,看我文章的都知道,,重要性不用说。我秋招最大的优势估计就是数据结构与算法的掌握了

上面三门课程的学习,基本也都是离不开数据结构的,对于如何学习数据结构与算法,可以看这篇:【方法篇】帅地也学过几年算法,谈一谈「如何学好算法」

五、汇编

我觉得,如何有时间,学习下汇编是必须的,学习了汇编,能够更好着帮助我们知道计算机是如何处理程序代码的,例如寄存器和内存是如何使用的?循环、函数调用、数组是如何实现的?地址是怎么一回事?等等。

很多二进制代码是可以反编译成汇编的,如何你会汇编,那么可以帮助我们更好着去理解一些东西。所以这里建议大家学习下汇编,并且要动手写一些程序。

对于汇编的资料,我可能没啥好推荐的,自己看的不多。看过两本书,对于入门的,我建议看 王爽的那本书《汇编语言(第三版)》,不过这本只适合入门,如果想继续,可以看《汇编程序设计》。

六、编译原理

说实话,编译原理还挺难,反正我觉得很难,不过有时间我觉得可以学学,学了这个你可以知道我们的编译器如何分析我们的代码的,例如词法分析,语法分析,语义分析等等。当然,你未来可能会自己写个特定分析代码的编译器也不一定,这个时候,就更加需要学了。

对于学习的资料,我觉得可以看视频 + 书。视频的话中国 mooc 大学搜索即可,书的话,说时候,我也看的不多,只看过学校指定的教材,所以这里给不了多少建议,自己当当自行搜索,哪本热门卖哪本勒。

七、计算机组成原理

其实组成原理我觉得也是挺难的,如果你数字电路学的比较好,可能会稍微简单一些,记得当时这门课的最后一个任务就是自己做一个 8 位的 CPU,通过做这个 CPU,真的涨了 很多知识。

对于这门课的学习,我觉得重点就是要弄明白整数啊,浮点数啊,这些在计算机是如何存储的,两个数相加是如何通过电路的与或门操作的。

个人觉得,跟着学校的课本来就行,不用学的太深入,面试问的也不多。

八、学习顺序

个人觉得算法,计算机网络,操作系统和 MySQL 是刚需,这几门要先学,如果是大一大二,推荐优先学算法,然后计算机网络,操作系统和数据库这些,也可以并行学习。

至于汇编,编译原理和计算机组成原理,其实面试考的不多,可以有时间再学,没时间就先放一放。

总结

暂时先介绍这么多吧,说实话,学了这些,不单单是多学了一门知识,更重要的是可以提升你的罗辑思维,给你带来更多的 idea。

然后上面的书籍我也整理好了,但是书籍经常百度云失效 + 版权风险,大家如果需要,可以加我的企业微信,通过好友请求后,发送「资源」,会自动拉你进群,之后群公告文档领取。

记住,好友请求通过后,发送「资源」两个字,一定要按照要求来,否则不会拉,为了节省帅地的时间,大家进去记得看公告,资源都在公告里。

一定要看公告,资料在公告文档

一定要看公告,资料在公告文档

一定要看公告,资料在公告文档

浏览 86
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报