这一篇章,是本系列中最长的一篇,其中包括了如下的内容。

另外,这里需要说明几点。

今天分享的内容为系统底层知识中的Linux系统、内存和网络等方面的相关知识及推荐的学习资料。

Linux系统相关

学习Linux操作系统的原理是通向系统工程师的必经之路。我觉得,Unix/Linux操作系统里的东西并不难学。你千万不要一下子扎到源代码里去,那样没用——你还是要在上层先通过读一些不错的文档来学习。下面我罗列了一些很不错的站点,其中有很多内容供你去钻研和探索。

我在这里默认你前面已经读过并读懂了我推荐的那些和Unix/Linux相关的图书了。所以,我相信你对Unix/Linux下的编程已经是有一些基础了,因此,你继续深挖Linux下的这些知识应该也不是很难的事了。

内存相关

计算机内存管理是每一个底层程序员需要了解的非常重要的事儿。当然,这里我们重点还是Linux操作系统相关的内存管理上的知识。

首先,LWN.net上有一系列的 “What every programmer should know about memory” 文章你需要读一下。当然,你可以直接访问一个完整的 PDF文档。下面是这个系列文章的网页版列表。读完这个列表的内容,你基本上就对内存有了一个比较好的知识体系了。

然后是几篇和内存相关的论文。下面这三篇论文是我个人觉得能对你非常有帮助的文章,尤其是你要做一些程序的性能优化方面。

接下来是开发者最关心的内存管理方面的lib库。通常来说,我们有三种内存分配管理模块。就目前而言,BSD的jemalloc有很大的影响力。后面我们可以看到不同公司的实践性文章。

关于 C 的这些内存分配器,你可以参看Wikipedia的 “C Dynamic Memory Allocation”这个词条。

下面是几篇不错的文章,让你感觉一下上面那三种内存分配器的一些比较和工程实践。

计算机网络

网络学习

首先,推荐一本书——《计算机网络(第五版)》,这本“计算机网络”和前面推荐的那本计算机网络不一样,前面那本偏扫盲,这本中有很多细节。这本书是国内外使用最广泛、最权威的计算机网络经典教材。全书按照网络协议模型自下而上(物理层、数据链路层、介质访问控制层、网络层、传输层和应用层)有系统地介绍了计算机网络的基本原理,并结合Internet给出了大量的协议实例。

这本书还与时俱进地引入了最新的网络技术,包括无线网络、3G蜂窝网络、RFID与传感器网络、内容分发与P2P网络、流媒体传输与IP语音,以及延迟容忍网络等。另外,本书针对当前网络应用中日益突出的安全问题,用了一整章的篇幅对计算机网络的安全性进行了深入讨论,而且把相关内容与最新网络技术结合起来阐述。这本书读起来并不枯燥,因为其中有很多小故事和小段子。

然后,有两个网上的教程和讲义也可以让人入门。

网络调优

接下来,你可能需要一些非常实用的可以操作的技术,下面的几篇文章相信可以帮助到你。

网络协议

接下来,想要学习网络协议最好的方式就是学习通讯相关的RFC。所以,在这里我会推荐一系列值得读的RFC给你。读RFC有几个好处,一方面可以学习技术,另一方面,你可以通过RFC学习到一个好的技术文档是怎么写的,还能看到各种解决问题的方案和思路。

对于第2层链路层,你可能需要了解一下ARP:

以及Tunnel相关的协议:

对于第4层,你最需要了解的是TCP/IP了。和TCP相关的RFC相当多,这里给一系列经典的RFC。这些RFC我都引用在了我在CoolShell上的《TCP的那些事儿(上)》和《TCP的那些事儿(下)》两篇文章中。如果你看不懂RFC,你也可以去看我上述的文章。

我个人觉得TCP最牛的不是不丢包,而是拥塞控制。对此,如果你感兴趣,可以读一下经典论文《Congestion Avoidance and Control》。

关于Linux下的TCP参数,你需要仔仔细细地读一下TCP的man page

对于第7层协议,HTTP协议是重点要学习的。

首先推荐的是《HTTP权威指南 》,这本书有点厚,可以当参考书来看。这本书中没有提到HTTP/2的事,但是可以让你了解到HTTP协议的绝大多数特性。

HTTP 1.1的原始RFC是1999年6月的 RFC 2616,但其在2014后很快被下面这些RFC给取代了。

关于HTTP/2,这是HTTP的一个比较新的协议,它于2015年被批准通过,现在基本上所有的主流浏览器都默认启用这个协议。所以,你有必要学习一下这个协议。下面是相关的学习资源。

最后,你可以上Wikipedia的 Internet Protocol Suite 上看看,这是一个很不错的网络协议的词条汇集地。顺着这些协议,你可以找到很多有用的东西。

小结

好了,总结一下今天的内容。这是程序员练级攻略2018版第五篇章——高手成长篇的第一篇文章。前面的内容先介绍了一些这一系列内容的总体构成,及每一部分的学习重点。后面是这一篇章第一个主题系统底层知识中的部分内容,即Linux系统、内存和计算机网络,并给出了相应的学习资料。

我认为,学习到一定程度,就是要从书本中走出去,到社区里和大家一起学习,而且还需要自己找食吃了。所以,这篇文章中,我罗列了各种文章和资源,并给出了简短的推荐语言,就是在为你梳理信息源,而不是喂你吃饭。我更希望看到你自趋势地成长。

下篇文章中,我们分享的内容为系统底层知识中的异步I/O模型、Lock-Free编程以及其他一些相关的知识点和学习资源。敬请期待。

下面是《程序员练级攻略》系列文章的目录。

评论