Linux C++ 服务器端这条线怎么走？一年半能做出什么？
看了陈硕的，提一点自己的观点。 先把结论放在前面：对于题主，一年半时间，足够做一个中间件（比如，LocalMQ：从零构建类 RocketMQ 高性能消息队列），或者做一个HTTP服务器（不考虑安全、但是可以有文件/目录存取控制），或者一个内存数据库服务器（要求高一些），如果编程能力强，操作系统和数据结构的底子好，做一个键值数据库服务器（要求再高一些）。HTTP服务器，需要进程、数据结构、异步网络I/O。内存数据库服务器，多一个锁。键值数据库服务器，再多一个存储引擎。无论是做哪一个，第3版都要考虑到高性能、高可靠、高可用。 1、首先，要有一个整体概念。整体概念有助于我们明确目标和方向，明确路线和计划。 服务器，起源于60~70年的主机，经过UNIX、C/S、B/S，从主机/终端、单服务器到服务器农场（Server Farm），到并行计算，到集群计算和分布式计算，到服务计算、到云计算，其系统结构不断地演进和发展。 这条发展路线，也给我们今后的学习指明了道路——对于不同的服务器系统，着重点是不一样。另外一方面，今天的云计算和分布式计算都可以在前面的单服务器中找到痕迹。 2、从计算机系统结构来看，服务器开发应该怎么学。 众所周知，计算机科学与技术一级学科下面有3个二级学科。计算机系统结构（081201）是其中的1个二级学科。 同时，我们也知道计算机系统由计算机硬件和软件组成，经典划分方法将计算机系统划分为硬件层、系统软件层、系统软件支撑层、应用层等4层。 服务器，是一种典型的计算机系统。因此，学习服务器开发，必不可少地涉及到这4层。所以，在本科阶段必然会开设计算机组成原理、操作系统（系统软件层）、编译原理（系统软件层）、数据库原理（系统支撑软件层）。除此之外，计算机系统结构（必修或选修）、计算机体系结构（选修）。传统的计算机系统结构的划分方法没有中间件层，虽然在90年代诞生出corba和uml，不过那个时候，中间件层并没有纳入计算机系统结构来。随着B/S应用的流行和兴盛，中间件层才逐渐纳入计算机系统结构中，特别是分布式计算机系统。 一般来说，我们总是从单服务器和串行处理做起。并行计算机的通用性较差、要求数据级的粒度，所以并行计算并没有象B/S那样普及。所以，现在大多数服务器开发是并发的，少数是并行的。并发主要由进程/线程实现， 一个题外话，在2000年前，对于计算机系统结构，多数人认为硬件层占主要地位，而软件层是次要地位。在企业界，例如SUN的操作系统就是免费的，似乎IBM的操作系统也曾经这样。在学术界，亦是如此。然而，大约是2002年后，逐渐发生变化，软件层在计算机系统结构的地位逐年上升。而且，由于CPU的研发越来越具有资金密集型、技术密集型和软件生态的特点，越来越趋于少数公司（ARM CPU的生产和研发是独立的，所以不在此列），所以国内很多大学不再搞CPU了（之前，国内许多大学购买MIPS和ARM授权，然而由于没有相关软件生态的支撑，都搞不下去了）。同时，象存储器、硬盘、高速总线标准（infiniband）等也被少数厂商垄断，中国完全没有话语权，所以，国内大学的相关研究也越来越少了。相反地，由于linux和bsd的开源，集群服务器的开放特性，服务器的研发逐渐迁移到软件层。一个题外话，当时很多人都笑话中科院计算所，曙光就是攒机的干活。所以，硬件这一块，越来越不透明，大多数人没有机会接触到硬件底层。象CPU、存储器逐渐迁移到微电子学院了，计算机学院研究它们的人反而越来越少。 3、学习路线 （1）单服务器上的操作系统调用，特别是进程。 （2）单服务器上的操作系统的内核知识，这个知识与单服务器的性能有关，特别是文件、CPU、磁盘、内存（网络放在后面）。一般来说，对于初学者，在掌握进程和数据结构之后，就可以选择一个点深入了。在这一步，首先是串行计算，然后是分时的串行计算，即并发的（多）进程。文件、CPU、磁盘、内存等，也曾经是热门工作，至今仍有深刻的影响。 一般来说，对于初学者来说，第一步要掌握的是单服务器的应用编程，这里选用《UNIX环境高级编程》就可以了。此时，学习成果最好是一个并发的服务器软件，比如，从http服务器、ftp服务器、文件服务器、代理服务器、协议转换服务器、视频服务器、邮件服务器等挑一个即可。一般来说，网络服务器的数据结构较普通，相对于数据库服务器来说，所需知识不算太多。从服务器软件的开发中，我们可以进一步地掌握数据结构与算法的使用，比如缓存替换算法，同时对锁机制也有进一步的掌握。同时，对软件工程和状态机也是有很大的帮助的。这些服务器软件的源码，sourceforge等开源网站有许多非常的项目，可以从中学习。不过，《UNIX环境高级编程》还没涉及到一些高性能高可靠高可用的内容。所以，开发完一版之后，就要动脑筋想想高性能高可靠高可用，这时就可以查阅文献，阅读著名开源软件的源码了。单服务器的网络服务器软件曾经是热潮，比如，如何在单服务器上支持10000个并发TCP长连接的会话？直到2006年，这仍然是热门话题。如果要增强趣味性的话，象mud（泥巴）游戏服务器也是风靡一时。 然后，先了解和掌握服务器系统的优化，再有选择地挑选一下linux内核的开发。服务器系统的优化，先学习一下服务器性能的评估，掌握几个常用的评估工具。接下来，linux内核的编译选项，多实验，多评测。之后，选择CPU的调度（linux内核编程4部曲之三：修改O(1)调度算法-lynch435-ChinaUnix博客）、内存管理的一部分（比如内存分配与回收）、磁盘/文件系统的一部分（比如块、布局、缓存/缓冲算法）作为目标。这些工作，曾经是是非常热门的工作。这些可以任选一个，对数据结构和c/c++的学习也是有很大的帮助。当然，linux内核开发不是那么容易入门的，前期工作非常繁琐，时间也比较长。所以，对于不是从内核开发的人来说，了解服务器内核的优化、配置、编译、测试就可以了。但是，对于分布式计算、云计算的底层来说，这些方法至少要知道，比如openstack的面向对象存储，就是和磁盘/文件系统有关，分布式文件系统，数据库服务器，nosql服务器，等等。 接下来，就要进行选择了，常见的选择有并行计算、分布式计算、集群计算、服务计算（中间件）等等。 注1：在2000年前，这一条路线是极为清晰的。 注2：在90年代中期，集群计算开始发展，而并行计算相对来说比较成熟（MPI和PVM）。 注3：接下来，就要按照计算机系统结构来分方向了。 （3）方向一：并行计算。比如，天河一号、天河二号，还有各个银行、金融机构用的中小型并行计算机（IBM）。如果是天河二号之类，主要工作是并行计算机系统结构和并行算法。而银行和金融机构使用中小型并行计算机的工作，主要是事务处理，不过这些已经封装好了，比如ibm的db2数据库，oracle并行数据库。 方向二：集群计算。由于虚拟机和云计算的兴起，这个不好说了，集群计算和分布式计算（云计算）的边界越来越模糊。 方向三：分布式计算。同理。 方向四：服务计算。并行计算的耦合度最高，集群计算次之，分布式计算又次之。在工业界有一个非常难办的事情，由于赶项目进度，所以，并没有什么模块划分、类层次设计。比如，一个模块/类往往几千行、上万行代码。一方向，发明了中间件，另一方面，更加松散（面向协议的编程，还记得OSI/RM模型的接口和服务吗？）。REST就是一种典型的服务计算。 注4：每个方向，都有相通/相同的领域，比如，并行计算、集群计算、分布式计算都有文件子系统这个领域。 注5：此时，应该系统地学习理论知识，并解决具体的问题。 （4）服务器更多的是属于计算机系统结构。在（2）的基础上，对串行计算进行改造，将串行计算改造为并行计算、分布式计算。这里，CPU（计算机体系结构，例如深度学习专用芯片、高频交易专用芯片、比特币挖矿芯片）和存储器（PCM，相变存储器）已经不适合大多数人作为方向选择了，因为这两个是技术密集型、资金密集型的方向，大多数人玩不起，只能做仿真（当然深度学习专用芯片是一种阵列向量机，在理论和实践上都比较成熟）。 先把结论放在前面：对于题主，一年半时间，做HTTP服务器/，或者一个内存数据库服务器（要求高一些），如果编程能力强，操作系统和数据结构的底子好，做一个键值数据库服务器。HTTP服务器，需要进程、数据结构、异步网络I/O。内存数据库服务器，多一个锁。键值数据库服务器，再多一个存储引擎。无论是做哪一个，第3版都要考虑到高性能、高可靠、高可用。的深度学习专用芯片、高频交易的专/用芯片、比特币的专用芯片（ASIC也属于门阵列）。而国内/国际上搞计算机体系结构的并不多了，除了少数几个学校/公司。现在的计算机系统结构的研究，已经根据用途，划分了多个领域。 （未完）