Linux 下 C++ 后台服务器开发
1. 前言
最近正在准备秋招,目标岗位是 C++后端开发工程师,这个岗位对开发者的要求也比较高,需要的基础知识非常多,我在刚刚开始准备的时候,感觉也是不知从何入手,现在经过了一段时间的学习,感觉比刚开始的时候好了一些,但是在很多方面还有欠缺,所以写下这篇博客,进行一个总结,也希望能帮助到和我一样在这条路上不断前行的人。
2. 服务器开发与后台开发的联系和区别
服务器是一种高性能的计算机,相对于普通的个人电脑,它的性能往往更强,但是功能也更加单一。服务器开发,就是在服务器上面开发应用程序。服务器开发包括两部分,一是服务器上基础应用的开发,例如搜索引擎等,二是对业务流程在服务器上的相关应用开发。一般来说,企业里招第二类比较多。从业务的角度来看,服务器中的应用程序会接收来自客户端的业务请求,将其所需的数据处理以后,返回给客户端。后台开发不像前台开发一样,有清晰的可视化界面,它在整个业务中往往处于幕后的位置,所以被称为后台开发。下面这张图可以大致体现后台开发的流程:
这张图是客户端和服务器一种最简单的描述,但是这里面有很多问题如果真的研究起来就会很复杂,涉及很多基础知识。
1. 客户端的请求如何表示?对它的回答又如何表示?
2. 服务器和客户端之间的连接该如何建立呢?
3. 服务器和数据库之间又怎么进行交互?
4. 图中一台服务器只面向一台客户端,可是现实当中服务器通常需要接收多个客户端的请求。那么怎么分配这些请求?如果有非常多的客户端向服务器发送请求,服务器怎么样才能保证性能?
以上是服务器开发的一些基本问题,要解决这些问题,就要学习非常多的基础知识。带着这些问题,可以让我们把知识点串起来,对 Linux 下的服务器开发有一个更好的理解。
3. 涉及知识点
C++后台服务器开发免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-进阶学习视频
3.1 编程语言
既然是 C++后台开发,那么首先我们要掌握 C++语言。C++的知识浩如烟海,而且包含了很多不同的思想,例如,它即继承了 C 面向过程的语法,又包含了面向对象的思想,要想精通真的很难。我的想法是将 C++分成多个组成部分,然后分别学习。学习 C++之后,简单总结了一些要点:
基础数据类型和运算符:C++的基础数据类型,如 int,double。要机制它们的分别占用的内存大小,以及它们之间的转换规则。其中尤其要掌握指针和引用。
基础语法:基础的条件语句,顺序语句,循环语句,是必须要掌握的。
C++关键字:C++中包含了很多关键字,例如 static,const,extern 等,学习的时候要注意它们的特点,以及应用场景。
C++内存管理:内存管理非常重要,要记住 C++程序内存有几个区,它们之间存放的数据;另一个关键点是 C++的内存泄露的发生原因和避免方法。
C++函数:函数是面向过程的体现,重点包括函数参数,返回值。如果再深入研究,还要知道函数的调用过程等。
面向对象:主要就是面向对象的三大特性,封装,继承和多态,以及实现这三大特性的一系列手段,如类,虚函数等。
泛型编程:C++中的泛型编程主要是模板编程,包括函数模板,类模板,模板泛化,模板特化这些知识。
STL 标准库:STL 主要要掌握各种容器和泛型算法。最好能对它们的底层实现有所了解。
C++11 新特性:C++11 作为 C++的经典版本,有一些新特性需要学习者好好掌握,例如智能指针等。
除了 C/C++以外,你还需要掌握至少一门脚本语言,例如 python/shell。脚本语言可能不会是你开发的主语言,但是它可以作为程序的“粘合剂”,完成一些轻量级的工作。
3.2 Linux 基础
现在大多数服务器都运行的是 Linux 系统,作为一个后端开发,少不了要和 Linux 打交道。对于初学者来说,可以先从下载一个带图形界面的发行版本,如 Ubuntu,CentOS 等,边玩边学。我们首先要具备操作 Linux 的能力,也就是了解 Linux 的基本结构,掌握基础的 Linux 命令,会用一些 Linux 上的工具。再升入一点,Linux 和 Windows 的开发环境有区别,要熟悉 Linux 下的开发环境。如果这样还学有余力,可以研究一下 Linux 的底层原理,例如 Linux 的进程通信是如何实现的。Linux 甚至允许你修改它的源码,当然这是很高的要求。
Linux 下的常用基础命令:
文件处理命令
网络管理命令
用户管理命令
Linux 下的常用工具
gdb
git
vim
putty
Linux 原理
Linux 进程
Linux 文件系统
Linux 内存系统
3.3 计算机网络
后台开发少不了要和网络编程打交道,要想成为一个优秀的后端开发,就要打好计算机网络的基础。计算机网络的知识比较抽象,我在本科期间也没有学好,后来我听从网上大佬的建议,从计算机网络数据传输的角度出发,思考数据如何经过计算机网络的多层服务进行传送的,感觉对计算机网络有了更深的了解。传统的 OSI 七层模型是在比较复杂。现在我们实际上使用更多的是 TCP/IP 四层模型(应用层,传输层,网络层和数据链路层)。后台开发对传输层和应用层的要求非常高,所以对这两层要好好理解。
传输层要点:
TCP 和 UDP:TCP 和 UDP 是传输层最重要的两个协议,掌握的越详细越好,要了解它们的差异,以及差异形成的原因。
TCP 是如何建立连接的:主要就是三次握手和四次挥手的内容,包括连接过程,各种连接状态等。除了要成功的情况外,还要考虑失败的情况。
流量控制和拥塞控制:流量控制是为了防止发送方发送数据过快,接收方来不及接收;拥塞控制是为了防止网络上数据量太大,造成网络阻塞。要了解它们的原理和实现方法。
应用层要点:
HTTP:http 是应用层最重要的协议,http 需要理解的知识很多,如请求报文,请求方法,状态码等。向浏览器的地址栏中输入 URL 得到相应页面,这里就包含了 http 请求的过程。
HTTPs:https 是 http 和 ssl(安全套接字)的组合,可以在 http 的基础上实现加密传输和用户认证。重点应该关注 https 的流程和实现数据安全的方式。
DNS 协议:DNS 是应用层另一个非常重要的协议,用来实现域名和 IP 地址的转换,这个协议的要点在于它具体的解析过程(即如何通过域名得到 IP)。
3.4 操作系统
除了计算机网络以外,另一门 Linux 下 C++开发需要掌握的基础是操作系统。相比 Java 等语言,C++本身就是一门更加偏重底层的语言,所以它的效率更高,而且 C++不太有 Java 中 SpringBoot 这种大而全的框架,这更加要求我们理解操作系统原理,以便于自己实现对应的功能。操作系统的抽象程度比计算机网络更高,学习起来更有难度,总结下来,操作系统主要在管理计算机的四种资源:
进程管理:即对 CPU 资源的管理。主要内容包括进程和线程,进线程调度算法,同步与互斥,死锁等。这部分内容是操作系统的重中之重。
内存管理:内存分为物理内存和虚拟内存。其中对虚拟内存是内存管理的中心,要点包括分页存储管理,分段存储管理,页面置换算法。
文件管理:文件系统,即文件的属性和组织方式的相关内容。
设备管理:计算机系统如何和与外设交互,发生中断和响应。
3.5 网络编程和系统编程
这一部分是上两个部分的具体实现,也就是我们怎么利用学到的原理知识,去解决实际问题。在这方面,我们可能会自己实现一些高效的数据结构,也可能直接调用现成的库函数。主要内容包括:
Socket 编程:Socket 是对传输层的抽象,它提供给我们一些具体的 API,而不需要关注其中的具体实现
相关 API:connect(),socket(),bind(),listen()等。
socket 建立连接的过程
I/O 多路复用:一个进程复用多路 I/O,是实现高并发的利器。三种经典的多路复用方法是 select,poll 和 epoll。对这三种方式的区别和实现方式应该有具体了解。
select,poll,epoll 的实现方式和区别。
reactor 和 preactor 的实现方式和区别。
ET 和 LT 触发模式的区别。
多线程/多线程编程:多进程多线程编程是实现高并发服务器的利器,非常重要
相关 API:fork(),pthread_create()等函数。
线程池的实现:通过提前创建线程减小切换开销。
进程线程间通信方法:共享变量,消息队列,锁等。
3.6 数据库
数据库是存储数据的仓库,也是后端必备技能之一。在开源的数据库中,MySQL 因为其强大的性能被广泛引用。除了关系型数据库之外,因为现在的业务往往涉及到高并发和分布式,所以在传统的关系型数据库以外,企业还要求掌握非关系型数据库,如 Redis。
MySQL 数据库要点
基础语法:基础的 CRUD 语法
数据库引擎:目前 MySQL 主要的引擎有 InnoDB 和 MyISAM,要知道它们各自特点的区别。
索引:索引的使用方法,还有实现它们的数据结构(hashmap 和 BTree)。
锁:数据库中常见的锁,如行锁,表锁,悲观锁,乐观锁,以及它们各自的使用场景。
事务:事务的四大特性(ACID),以及四大隔离级别。
数据库优化方法:常见的优化方法又 SQL 语句优化,分表,读写分离。
Redis 数据库
基础数据类型:Redis 五大基本数据类型包括字符串,链表,字典,集合,排序集合。
配置文件:Redis 配置文件可以配置内存淘汰策略等一系列设置。
缓存:Redis 被广泛应用于缓存方向,可能会发生缓存相关的问题,如缓存穿透,缓存雪崩等。
3.7 数据结构和算法
如果我们不想当一个只会调包,只会简单增删改查的码农,那么我们就需要掌握算法和数据结构,常言道:数据结构+算法=程序,高效的数据结构和精巧的算法能提升程序的效率,对于后台开发来说,效率非常重要。当然我们不需要掌握非常高难度的算法,可是掌握基础的算法和数据结构是必须的,下面是一些基础的数据结构和算法
常用数据结构:
数组
栈和队列
链表单向链表双向链表循环链表
树二叉树二叉搜索树二叉平衡树红黑树
图有向图无向图
串 KMP
常用算法:
分治法
动态规划
递归和回溯
排序快速排序归并排序
查找二分查找
树算法图算法树的前,中,后序,层次遍历(递归和非递归写法)
图的遍历
最小生成树
迪杰斯特拉
算法和数据结构的就像是武侠小说中的内功,是每一个想成为高手的人必须要修炼的。修炼的过程是数以年记的,这个过程需要我们保持耐心和恒心。
3.8 设计模式
设计模式是软件工程师们针对软件设计模式总结出的经验,如果说前述的内容还处在'术'的阶段,设计模式已经有了'道'的感觉,好的设计模式能帮助工程师创造出高质量的软件。工程师总结了 23 种常用的设计模式。在 23 种设计模式中,有几种设计模式是重中之重,要好好掌握,例如:
单例模式:一个类只能有一个对象。
工厂模式:封装对象的创建,让子类决定创建的对象。
观察者模式:定义对象的一对多关系。
3.9 其他常用技能
除了上面这些基础内容,还有一些也要掌握,例如
Makefile 的编写
Linux 下常用工具的使用,例如 vim,git,gdb 等
另外,在社招中,企业可能会提一些更高的要求,例如分布式,容器,中间件什么的,如果学有余力,也可以进一步的去了解。
4. 总结
总的来说,Linux 下 C++服务器开发的知识还是很多的,如果想要找到一份好的工作,或者对这个领域有深入理解,还是需要投入很多的时间精力的。对于这上面列出的知识,我也有很多没掌握的地方,但我相信通过系统的学习,不断迭代更新自己的知识,一定能取得进步。
C++程序员面临的竞争压力越来越大。那么,作为一名 C++程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。为了帮助大家少走弯路
我特意整理了一下,有很多问题不是靠几句话能讲清楚,所以干脆找朋友录制了一些视频,很多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。
如果想学习 C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx 源码分析 Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux 内核,P2P,K8S,Docker,TCP/IP,协程,DPDK 的朋友可以看一下免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-进阶学习视频
看了觉得不错的朋友,可以免费给一个订阅。点击 学习技术群 分享更多干货技术视频
感谢~
评论