24 KiB
这一篇章,是本系列中最长的一篇,其中包括了如下的内容。
另外,这里需要说明几点。
今天分享的内容为系统底层知识中的Linux系统、内存和网络等方面的相关知识及推荐的学习资料。
Linux系统相关
学习Linux操作系统的原理是通向系统工程师的必经之路。我觉得,Unix/Linux操作系统里的东西并不难学。你千万不要一下子扎到源代码里去,那样没用——你还是要在上层先通过读一些不错的文档来学习。下面我罗列了一些很不错的站点,其中有很多内容供你去钻研和探索。
我在这里默认你前面已经读过并读懂了我推荐的那些和Unix/Linux相关的图书了。所以,我相信你对Unix/Linux下的编程已经是有一些基础了,因此,你继续深挖Linux下的这些知识应该也不是很难的事了。
内存相关
计算机内存管理是每一个底层程序员需要了解的非常重要的事儿。当然,这里我们重点还是Linux操作系统相关的内存管理上的知识。
首先,LWN.net上有一系列的 “What every programmer should know about memory” 文章你需要读一下。当然,你可以直接访问一个完整的 PDF文档。下面是这个系列文章的网页版列表。读完这个列表的内容,你基本上就对内存有了一个比较好的知识体系了。
- Part 1: Introduction ,中译版为 “每个程序员都应该了解的内存知识【第一部分】”
- Part 2: CPU caches
- Part 3 (Virtual memory)
- Part 4 (NUMA systems)
- Part 5 (What programmers can do - cache optimization)
- Part 6 (What programmers can do - multi-threaded optimizations)
- Part 7 (Memory performance tools)
- Part 8 (Future technologies)
- Part 9 (Appendices and bibliography)
然后是几篇和内存相关的论文。下面这三篇论文是我个人觉得能对你非常有帮助的文章,尤其是你要做一些程序的性能优化方面。
接下来是开发者最关心的内存管理方面的lib库。通常来说,我们有三种内存分配管理模块。就目前而言,BSD的jemalloc有很大的影响力。后面我们可以看到不同公司的实践性文章。
关于 C 的这些内存分配器,你可以参看Wikipedia的 “C Dynamic Memory Allocation”这个词条。
下面是几篇不错的文章,让你感觉一下上面那三种内存分配器的一些比较和工程实践。
- ptmalloc,tcmalloc和jemalloc内存分配策略研究
- 内存优化总结:ptmalloc、tcmalloc和jemalloc
- Scalable memory allocation using jemalloc
- Decreasing RAM Usage by 40% Using jemalloc with Python & Celery
计算机网络
网络学习
首先,推荐一本书——《计算机网络(第五版)》,这本“计算机网络”和前面推荐的那本计算机网络不一样,前面那本偏扫盲,这本中有很多细节。这本书是国内外使用最广泛、最权威的计算机网络经典教材。全书按照网络协议模型自下而上(物理层、数据链路层、介质访问控制层、网络层、传输层和应用层)有系统地介绍了计算机网络的基本原理,并结合Internet给出了大量的协议实例。
这本书还与时俱进地引入了最新的网络技术,包括无线网络、3G蜂窝网络、RFID与传感器网络、内容分发与P2P网络、流媒体传输与IP语音,以及延迟容忍网络等。另外,本书针对当前网络应用中日益突出的安全问题,用了一整章的篇幅对计算机网络的安全性进行了深入讨论,而且把相关内容与最新网络技术结合起来阐述。这本书读起来并不枯燥,因为其中有很多小故事和小段子。
然后,有两个网上的教程和讲义也可以让人入门。
- 渥汰华大学的一个课程讲义你也可以一看 Computer Network Design 。
- GeeksforGeeks 上也有一个简单的 Computer Network Tutorials 。
网络调优
接下来,你可能需要一些非常实用的可以操作的技术,下面的几篇文章相信可以帮助到你。
- [Monitoring and Tuning the Linux Networking Stack: Receiving Data](https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/)
- [Monitoring and Tuning the Linux Networking Stack: Sending Data](https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/)
- RFC 1853 - IP in IP Tunneling
- RFC 2784 - Generic Routing Encapsulation (GRE)
- RFC 2661 - Layer Two Tunneling Protocol “L2TP”
- RFC 2637 - Point-to-Point Tunneling Protocol (PPTP)
- [RFC 793 - Transmission Control Protocol](https://tools.ietf.org/html/rfc793) - 最初的TCP标准定义,但不包括TCP相关细节。
- [RFC 813 - Window and Acknowledgement Strategy in TCP](https://tools.ietf.org/html/rfc813) - TCP窗口与确认策略,并讨论了在使用该机制时可能遇到的问题及解决方法。
- [RFC 879 - The TCP Maximum Segment Size and Related Topics](https://tools.ietf.org/html/rfc879) - 讨论MSS参数对控制TCP分组大小的重要性,以及该参数与IP分段大小的关系等。
- [RFC 896 - Congestion Control in IP/TCP Internetworks](https://tools.ietf.org/html/rfc896) - 讨论拥塞问题和TCP如何控制拥塞。
- [RFC 2581 - TCP Congestion Control](https://tools.ietf.org/html/rfc2581) - 描述用于拥塞控制的四种机制:慢启动、拥塞防御、快重传和快恢复。后面这个RFC被 [RFC 5681](https://tools.ietf.org/html/rfc5681) 所更新。还有 [RFC 6582 - The NewReno Modification to TCP’s Fast Recovery Algorithm](https://tools.ietf.org/html/rfc6582) 中一个改进的快速恢复算法。
- [RFC 2018 - TCP Selective Acknowledgment Options](https://tools.ietf.org/html/rfc2018) - TCP的选择确认。
- [RFC 2883 - An Extension to the Selective Acknowledgement (SACK) Option for TCP](https://tools.ietf.org/html/rfc2883) - 对于RFC 2018的改进。
- [RFC 2988 - Computing TCP’s Retransmission Timer](https://tools.ietf.org/html/rfc2988) - 讨论与TCP重传计时器设置相关的话题,重传计时器控制报文在重传前应等待多长时间。也就是经典的TCP Karn/Partridge重传算法。
- [RFC 6298 - Computing TCP’s Retransmission Timer](https://tools.ietf.org/html/rfc6298) - TCP Jacobson/Karels Algorithm重传算法。
- [RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing](https://tools.ietf.org/html/rfc7230)
- [RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content](https://tools.ietf.org/html/rfc7231)
- [RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests](https://tools.ietf.org/html/rfc7232)
- [RFC 7233 - Hypertext Transfer Protocol (HTTP/1.1): Range Requests](https://tools.ietf.org/html/rfc7233)
- [RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching](https://tools.ietf.org/html/rfc7234)
- [RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication](https://tools.ietf.org/html/rfc7235)
- [Gitbook - HTTP/2详解](https://legacy.gitbook.com/book/ye11ow/http2-explained/details)
- [http2 explained](http://daniel.haxx.se/http2/)([中译版](https://www.gitbook.com/book/ye11ow/http2-explained/details))
- [HTTP/2 for a Faster Web](https://cascadingmedia.com/insites/2015/03/http-2.html)
- [Nginx HTTP/2 白皮书](https://www.nginx.com/wp-content/uploads/2015/09/NGINX_HTTP2_White_Paper_v4.pdf)
-
HTTP/2 的两个RFC:
-
- [RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)](https://httpwg.org/specs/rfc7540.html) ,HTTP/2的协议本身
- [RFC 7541 - HPACK: Header Compression for HTTP/2](https://httpwg.org/specs/rfc7541.html) ,HTTP/2的压缩算法
- 入门篇
最后,你可以上Wikipedia的 Internet Protocol Suite 上看看,这是一个很不错的网络协议的词条汇集地。顺着这些协议,你可以找到很多有用的东西。
小结
好了,总结一下今天的内容。这是程序员练级攻略2018版第五篇章——高手成长篇的第一篇文章。前面的内容先介绍了一些这一系列内容的总体构成,及每一部分的学习重点。后面是这一篇章第一个主题系统底层知识中的部分内容,即Linux系统、内存和计算机网络,并给出了相应的学习资料。
我认为,学习到一定程度,就是要从书本中走出去,到社区里和大家一起学习,而且还需要自己找食吃了。所以,这篇文章中,我罗列了各种文章和资源,并给出了简短的推荐语言,就是在为你梳理信息源,而不是喂你吃饭。我更希望看到你自趋势地成长。
下篇文章中,我们分享的内容为系统底层知识中的异步I/O模型、Lock-Free编程以及其他一些相关的知识点和学习资源。敬请期待。
下面是《程序员练级攻略》系列文章的目录。
网络协议
接下来,想要学习网络协议最好的方式就是学习通讯相关的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年被批准通过,现在基本上所有的主流浏览器都默认启用这个协议。所以,你有必要学习一下这个协议。下面是相关的学习资源。