大学四年我是怎么写操做系统和计算机网络的?掏心掏肺的分享!

最近收到很多读者留言,关于怎么学「操做系统」和「计算机网络」的留言,小林写这一块的内容也有半年多了,啃很是多的书,也看了不少视频,有好的有差的,今天就掏心掏肺地分享给你们。程序员

操做系统和计算机网络有多重要呢?若是没有操做系统,咱们的手机和电脑能够说是废铁了,天然它们都没有使用价值了,另外若是没有计算机网络,咱们的手机和电脑就是一座「孤岛」了,孤岛的世界很单调,也没有什么色彩,也正是由于计算机网络,才创造出这么丰富多彩的互联网世界。面试

身为程序员的咱们,那更应该深入理解和掌握它们,虽然咱们平常 CURD 的工做中,即便不熟悉它们,也不妨碍咱们写代码,可是当出现问题时,没有这些基础知识,你是无厘头的,根本没有思路下手,这时候和别人差距就显现出来了,能够说是程序员之间的分水岭。算法

事实上,咱们工做中会有大量的时间都是在排查和解决问题,编码的时间其实比较少,若是计算机基础学的很扎实,虽然不敢保证咱们能 100% 解决,可是至少遇到问题时,咱们有一个排查的方向,或者直接就定位到问题所在,而后再一步一步尝试解决,解决了问题,天然就体现了咱们自身的实力和价值,职场也会越走越远。缓存

我本身工做中就深入体会到了它们多重要性,我最近项目就遇到 TCP 比较底层的问题,咱们的一个 Web 服务运行久以后,就没法与客户端正常创建链接了,使用 tcpdump 抓包发现 TCP 三次握手过程当中,服务端把客户端握手过程当中最后 1 个 ack 给丢掉了。服务器

刚开始以为很是的莫名奇妙,后面想起本身写过一篇 TCP 半链接和全链接队列的文章,就往这个方向排查问题,因而执行 netstat -s 命令查看 TCP error 相关的信息,发现 TCP 全链接队列溢出了,接着再经过 ss -lnt 命令进一步确认,当前 TCP 全链接队列确实超过了 TCP 全链接队列最大值,这个问题就很快定位出来了。微信

另外,当 TCP 全链接队列溢出后,因为 tcp_abort_on_overflow 内核参数默认为 0,因此服务端会丢掉客户端发过来的 ack,若是你把该参数设置为 1,那现象将变成,服务端会给客户端发送 RST 报文,废弃掉链接。网络

那要扩大全链接队列也不难,TCP 全链接队列最大值取决于 somaxconn 和 backlog 之间的最小值,也就是 min(somaxconn, backlog),其中 somaxconn 是内核参数,而 backlog 是咱们程序 listen 方法中指定的参数。数据结构

上面这个小例子,很明显是没法经过看应用层的代码来解决的,必须了解 TCP 的机制,才能找到解决之道。并发

铺垫了那么多,接下里进入正题。app


计算机网络怎么学?

计算机网络相比操做系统好学很是多,由于计算机网络不抽象,你要想知道网络中的细节,你均可以经过抓包来分析,并且无论是手机、我的电脑和服务器,它们所使用的计算网络协议是一致的。

也就是说,计算机网络不会由于设备的不一样而不一样,你们都遵循这一套「规则」来相互通讯,这套规则就是 TCP/IP 网络模型。

OSI 参考模型与 TCP/IP 的关系OSI 参考模型与 TCP/IP 的关系

TCP/IP 网络参考模型共有 4 层,其中须要咱们熟练掌握的是应用层、传输层和网络层,至于网络接口层(数据链路层和物理层)咱们只须要作简单的了解就能够了。

对于应用层,固然重点要熟悉最多见的 HTTP 和 HTTPS,传输层 TCP 和 UDP 都要熟悉,网络层要熟悉 IPv4,IPv6 能够作简单点了解。

我以为学习一个东西,就从咱们常见的事情开始着手。

好比, ping 命令能够说在咱们判断网络环境的时候,最常使用的了,你能够先把你电脑 ping 你舍友或同事的电脑的过程当中发生的事情都搞明白,这样就基本知道一个数据包是怎么转发的了,因而你就知道了网络层、数据链路层和物理层之间是如何工做,如何相互配合的了。

搞明白了 ping 过程,我相信你学起 HTTP 请求过程的时候,会很快就能掌握了,由于网络层如下的工做方式,你在学习 ping 的时候就已经明白了,这时就只须要认真掌握传输层中的 TCP 和应用层中的 HTTP 协议,就能搞明白访问网页的整个过程了,这也是面试常见的题目了,毕竟它能考察你网络知识的全面性。

重中之重的知识就是 TCP 了,TCP 无论是创建链接、断开链接的过程,仍是数据传输的过程,都不能放过,针对数据可靠传输的特性,又能够拆解为超时从新、流量控制、滑动窗口、拥塞控制等等知识点,学完这些只能算对 TCP 有个「感性」的认识,另外咱们还得知道 Linux 提供的 TCP 内核的参数的做用,这样才能从容地应对工做中遇到的问题。

接下来,推荐我看过并以为不错的计算机网络相关的书籍和视频。

入门系列

此系列针对没有任何计算机基础的朋友,若是已经对计算机轻车熟路的大佬,也不要忽略,不妨看看我推荐的正确吗。

若是你要入门 HTTP,首先最好书籍就是《图解 HTTP》了,做者真的作到完彻底全的「图解」,小林的图解功夫仍是从这里偷学到很多,书籍不厚,相信优秀的你,几天就能够看完了。

《图解 HTTP》《图解 HTTP》

若是要入门 TCP/IP 网络模型,我推荐的是《图解 TCP/IP》,这本书也是以大量的图文来介绍了 TCP/IP 网络模式的每一层,可是这个书籍的顺序不是从「应用层 —> 物理层」,而是从「物理层 -> 应用层」顺序开始讲的,这一点我以为不太好,这样一上来就把最枯燥的部分讲了,很容易就被劝退了,因此我建议先跳过前面几个章节,先看网络层和传输层的章节,而后再回头看前面的这几个章节。

《图解 TCP/IP》《图解 TCP/IP》

另外,你想了解网络是怎么传输,那我推荐《网络是怎样链接的》,这本书相对比较全面的把访问一个网页的发生的过程讲解了一遍,其中关于电信等运营商是怎么传输的,这部分你能够跳过,固然你感兴趣也能够看,只是我以为不必看。

《网络是怎样链接的》《网络是怎样链接的》

若是你以为书籍过于枯燥,你能够结合 B 站《计算机网络微课堂》视频一块儿学习,这个视频是湖南科技大学老师制做的,PPT 的动图是我见过作的最用心的了,一看就懂的佳做。

《计算机网络微课堂》《计算机网络微课堂》

B 站视频地址:https://www.bilibili.com/video/BV1c4411d7jb?p=1

深刻学习系列

看完入门系列,相信你对计算机网络已经有个大致的认识了,接下来咱们也不能放慢脚步,马不停蹄,借此机会继续深刻学习,由于隐藏在背后的细节仍是不少的。

对于 TCP/IP 网络模型深刻学习的话,推荐《计算机网络 - 自顶向下方法》,这本书是从咱们最熟悉 HTTP 开始提及,一层一层的说到最后物理层的,有种挖地洞的感受,这样的内容编排顺序相对是比较合理的。

《计算机网络 - 自顶向下方法》《计算机网络 - 自顶向下方法》

但若是要深刻 TCP,前面的这些书还远远不够,赋有计算机网络圣经的之说的《TCP/IP 详解 卷一:协议》这本书,是进一步深刻学习的好资料,这本书的做者用各类实验的方式来细说各类协议,但不得不说,这本书真的很枯燥,当时我也啃的很难受,可是它质量是真的很高,这本书我只看了 TCP 部分,其余部分你能够选择性看,可是你必定要过几遍这本书的 TCP 部分,涵盖的内容很是全且细。

《TCP/IP 详解 卷一:协议》《TCP/IP 详解 卷一:协议》

要说我看过最好的 TCP 资料,那一定是《The TCP/IP GUIDE》这本书了,目前只有英文版本的,并且有个专门的网址能够白嫖看这本书的内容,图片都是彩色,看起来很舒服很鲜明,小林以前写的 TCP 文章很多案例和图片都是参考这里的,这本书精华部分就是把 TCP 滑动窗口和流量控制说的超级明白,很惋惜拥塞控制部分说的很少。

《The TCP/IP GUIDE》《The TCP/IP GUIDE》

白嫖站点:http://www.tcpipguide.com/free/t_TCPSlidingWindowAcknowledgmentSystemForDataTranspo-6.htm

固然,计算机网络最牛逼的资料,那一定 RFC 文档,它能够称为计算机网络世界的「法规」,也是最新、最权威和最正确的地方了,困惑你们的 TCP 为何三次握手和四次挥手,其实在 RFC 文档几句话就说明白了。

TCP 协议的 RFC 文档:https://datatracker.ietf.org/doc/rfc1644/

实战系列

在学习书籍资料的时候,无论是 TCP、UDP、ICMP、DNS、HTTP、HTTPS 等协议,最好均可以亲手尝试抓数据报,接着能够用 Wireshark 工具看每个数据报文的信息,这样你会以为计算机网络没有想象中那么抽象了,由于它们被你「抓」出来了,并毫无保留地显如今你面前了,因而你就能够肆无忌惮地「扒开」它们,看清它们每个头信息。

那在这里,我也给你推荐 2 本关于 Wireshark 网络分析的书,这两本书都是同一个做者,书中的案例都是源于做者工做中的实际的案例,做者的文笔至关有趣,看起来堪比小说同样爽,相信你不用一个星期 2 本都能看完了。

《Wireshark 网络分析就这么简单》 与 《Wireshark 网络分析的艺术》《Wireshark 网络分析就这么简单》 与 《Wireshark 网络分析的艺术》

操做系统怎么学?

操做系统真的能够说是 Super Man,它为了咱们作了很是厉害的事情,以致于咱们根本察觉不到,只有经过学习它,咱们才能深入体会到它的精妙之处,甚至会被计算机科学家设计思想所震撼,有些思想实际上也是能够应用于咱们工做开发中。

操做系统比较重要的四大模块,分别是内存管理进程管理文件系统管理输入输出设备管理。这是我学习操做系统的顺序,也是我推荐给你们的学习顺序,由于内存管理不只是最重要、最难的模块,也是和其余模块关联性最大的模块,先把它搞定,后续的模块学起来我认为会相对轻松一些。

学习的过程当中,你可能会遇到不少「虚拟」的概念,好比虚拟内存、虚拟文件系统,实际上它们的本质上都是同样的,都是向下屏蔽差别,向上提供统一的东西,以方便咱们程序员使用。

还有,你也遇到各类各样的调度算法,在这里你能够看到数据结构与算法的魅力,重要的是咱们要理解为何要提出那么多调度算法,你固然能够说是为了更快更有效率,可是因什么问题而所以引入新算法的这个过程,更是咱们重点学习的地方。

你也会开始明白进程与线程最大的区别在于上下文切换过程当中,线程不用切换虚拟内存,由于同一个进程内的线程都是共享虚拟内存空间的,线程就单这一点不用切换,就相比进程上下文切换的性能开销减小了不少。因为虚拟内存与物理内存的映射关系须要查询页表,页表的查询是很慢的过程,所以会把经常使用的地址映射关系缓存在 TLB 里的,这样即可以提升页表的查询速度,若是发生了进程切换,那 TLB 缓存的地址映射关系就会失效,缓存失效就意味着命中率下降,因而虚拟地址转为物理地址这一过程就会很慢。

你也开始不会傻傻的认为 read 或 write 以后数据就直接写到硬盘了,更不会以为屡次操做 read 或 write 方法性能会很低,由于你发现操做系统会有个「磁盘高速缓冲区」,它已经帮咱们作了缓存的工做,它会预读数据、缓存最近访问的数据,以及使用 I/O 调度算法来合并和排队磁盘调度 I/O,这些都是为了减小操做系统对磁盘的访问频率。

……

还有太多太多了,我在这里就不赘述了,剩下的就交给大家在学习操做系统的途中去探索和发现了。

还有一点须要注意,学操做系统的时候,不要误觉得它是在说 Linux 操做系统,这也是我初学的时候犯的一个错误,操做系统是集合大多数操做系统实现的思想,跟实际具体实现的 Linux 操做系统多少都会有点差异,若是要想 Linux 操做系统的具体实现方式,能够选择看 Linux 内核相关的资料,可是在这以前你先掌握了操做系统的基本知识,这样学起来才能事半功倍。

入门系列

对于没学过操做系统的小白,我建议学的时候,不要直接闷头看书。相信我,你不用几分钟就会打退堂鼓,而后就把厚厚的书拿去垫显示器了,今后再无后续,毕竟直接看书太特喵的枯燥了,固然不如用来垫显示器玩游戏来着香。

B 站关于操做系统课程资源不少,我在里面也看了不一样老师讲的课程,以为比较好的入门级课程是《操做系统 - 清华大学》,该课程由清华大学老师向勇和陈渝授课,虽然咱们上不了清华大学,可是至少咱们能够在网上选择听清华大学的课嘛。课程授课的顺序,就如我前面推荐的学习顺序:「内存管理 -> 进程管理 -> 文件系统管理 -> 输入输出设备管理」。

《操做系统 - 清华大学》《操做系统 - 清华大学》

B 站清华大学操做系统视频地址:https://www.bilibili.com/video/BV1js411b7vg?from=search&seid=2361361014547524697

该清华大学的视频教学搭配的书应该是《现代操做系统》,你能够视频和书籍二者结合一块儿学,好比看完视频的内存管理,而后就看书上对应的章节,这样相比直接啃书相对会比较好。

《现代操做系统》《现代操做系统》

清华大学的操做系统视频课讲的比较精炼,涉及到的内容没有那么细,《操做系统 - 哈工大》李治军老师授课的视频课程相对就会比较细节,老师会用 Linux 内核代码的角度带你进一步理解操做系统,也会用生活小例子帮助你理解。

《操做系统 - 哈工大》《操做系统 - 哈工大》

B 站哈工大操做系统视频地址:https://www.bilibili.com/video/BV1d4411v7u7?from=search&seid=2361361014547524697

深刻学习系列

《现代操做系统》这本书我感受缺乏比较多细节,说的仍是比较笼统,并且书也好无聊。

推荐一个说的更细的操做系统书 —— 《操做系统导论》,这本书不只告诉你 What,还会告诉你 How,书的内容都是按部就班,层层递进的,阅读起来仍是以为挺有意思的,这本书的内存管理和并发这两个部分说的很棒,这本书的中文版本我也没找到资源,不过微信读书能够免费看这本书。

《操做系统导论》《操做系统导论》

固然,少不了这本被称为神书的《深刻理解计算机系统》,豆瓣评分高达 9.8 分,这本书严格来讲不算操做系统书,它是以程序员视角理解计算机系统,不仅是涉及到操做系统,还涉及到了计算机组成、C 语言、汇编语言等知识,是一本综合性比较强的书。

《深刻理解计算机系统》《深刻理解计算机系统》

它告诉咱们计算机是如何设计和工做的,操做系统有哪些重点,它们的做用又是什么,这本书的目标其实即是要讲清楚原理,但并不会把某个话题挖掘地过于深刻,过于细节。看看这本书后,咱们就能够对计算机系统各组件的工做方式有了理性的认识。在必定程度上,其实它是在锻炼一种思惟方式 —— 计算思惟。


最后

好了,小林本次的分享就到这里了,不知道推荐的书和视频是否和你的「口味」,同时也欢迎你在留言区里分享你是怎么学习它们的,又有什么好书推荐给你们呢?

相关文章
相关标签/搜索