Linux/c++服务器开发方向的重点

2023-05-16

作者:NULL
链接:https://www.zhihu.com/question/37247264/answer/2352680534
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

服务器是一种高性能的计算机,相对于普通的个人电脑,它的性能往往更强,但是功能也更加单一。服务器开发,就是在服务器上面开发应用程序。服务器开发包括两部分,一是服务器上基础应用的开发,例如搜索引擎等,二是对业务流程在服务器上的相关应用开发。一般来说,企业里招第二类比较多。从业务的角度来看,服务器中的应用程序会接收来自客户端的业务请求,将其所需的数据处理以后,返回给客户端。后台开发不像前台开发一样,有清晰的可视化界面,它在整个业务中往往处于幕后的位置,所以被称为后台开发。下面这张图可以大致体现后台开发的流程:

这张图是客户端和服务器一种最简单的描述,但是这里面有很多问题如果真的研究起来就会很复杂,涉及很多基础知识。

1. 客户端的请求如何表示?对它的回答又如何表示?

2. 服务器和客户端之间的连接该如何建立呢?

3. 服务器和数据库之间又怎么进行交互?

4. 图中一台服务器只面向一台客户端,可是现实当中服务器通常需要接收多个客户端的请求。那么怎么分配这些请求?如果有非常多的客户端向服务器发送请求,服务器怎么样才能保证性能?

以上是服务器开发的一些基本问题,要解决这些问题,就要学习非常多的基础知识。带着这些问题,可以让我们把知识点串起来,对Linux下的服务器开发有一个更好的理解。

涉及知识点

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。脚本语言可能不会是你开发的主语言,但是它可以作为程序的“粘合剂”,完成一些轻量级的工作。

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 计算机网络

后台开发少不了要和网络编程打交道,要想成为一个优秀的后端开发,就要打好计算机网络的基础。计算机网络的知识比较抽象,我在本科期间也没有学好,后来我听从网上大佬的建议,从计算机网络数据传输的角度出发,思考数据如何经过计算机网络的多层服务进行传送的,感觉对计算机网络有了更深的了解。传统的OSI七层模型是在比较复杂。现在我们实际上使用更多的是 TCP/IP 四层模型(应用层,传输层,网络层和数据链路层)。后台开发对传输层和应用层的要求非常高,所以对这两层要好好理解。

  • TCP和UDP:TCP和UDP是传输层最重要的两个协议,掌握的越详细越好,要了解它们的差异,以及差异形成的原因。
  • TCP是如何建立连接的:主要就是三次握手和四次挥手的内容,包括连接过程,各种连接状态等。除了要成功的情况外,还要考虑失败的情况。
  • 流量控制和拥塞控制:流量控制是为了防止发送方发送数据过快,接收方来不及接收;拥塞控制是为了防止网络上数据量太大,造成网络阻塞。要了解它们的原理和实现方法。

传输层要点:

  • TCP和UDP:TCP和UDP是传输层最重要的两个协议,掌握的越详细越好,要了解它们的差异,以及差异形成的原因。
  • TCP是如何建立连接的:主要就是三次握手和四次挥手的内容,包括连接过程,各种连接状态等。除了要成功的情况外,还要考虑失败的情况。
  • 流量控制和拥塞控制:流量控制是为了防止发送方发送数据过快,接收方来不及接收;拥塞控制是为了防止网络上数据量太大,造成网络阻塞。要了解它们的原理和实现方法。

应用层要点:

  • HTTP:http是应用层最重要的协议,http需要理解的知识很多,如请求报文,请求方法,状态码等。向浏览器的地址栏中输入URL得到相应页面,这里就包含了http请求的过程。
  • HTTPs:https是http和ssl(安全套接字)的组合,可以在http的基础上实现加密传输和用户认证。重点应该关注https的流程和实现数据安全的方式。
  • DNS协议:DNS是应用层另一个非常重要的协议,用来实现域名和IP地址的转换,这个协议的要点在于它具体的解析过程(即如何通过域名得到IP)。

4 操作系统

除了计算机网络以外,另一门Linux下C++开发需要掌握的基础是操作系统。相比Java等语言,C++本身就是一门更加偏重底层的语言,所以它的效率更高,而且C++不太有Java中SpringBoot这种大而全的框架,这更加要求我们理解操作系统原理,以便于自己实现对应的功能。操作系统的抽象程度比计算机网络更高,学习起来更有难度,总结下来,操作系统主要在管理计算机的四种资源:

  • 进程管理:即对CPU资源的管理。主要内容包括进程和线程,进线程调度算法,同步与互斥,死锁等。这部分内容是操作系统的重中之重。
  • 内存管理:内存分为物理内存和虚拟内存。其中对虚拟内存是内存管理的中心,要点包括分页存储管理,分段存储管理,页面置换算法。
  • 文件管理:文件系统,即文件的属性和组织方式的相关内容。
  • 设备管理:计算机系统如何和与外设交互,发生中断和响应。

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()等函数。
  • 线程池的实现:通过提前创建线程减小切换开销。
  • 进程线程间通信方法:共享变量,消息队列,锁等。

6 数据库

数据库是存储数据的仓库,也是后端必备技能之一。在开源的数据库中,MySQL因为其强大的性能被广泛引用。除了关系型数据库之外,因为现在的业务往往涉及到高并发和分布式,所以在传统的关系型数据库以外,企业还要求掌握非关系型数据库,如Redis。

MySQL数据库要点

  • 基础语法:基础的CRUD语法
  • 数据库引擎:目前MySQL主要的引擎有InnoDB和MyISAM,要知道它们各自特点的区别。
  • 索引:索引的使用方法,还有实现它们的数据结构(hashmap和BTree)。
  • 锁:数据库中常见的锁,如行锁,表锁,悲观锁,乐观锁,以及它们各自的使用场景。
  • 事务:事务的四大特性(ACID),以及四大隔离级别。
  • 数据库优化方法:常见的优化方法又SQL语句优化,分表,读写分离。

Redis数据库

  • 基础数据类型:Redis五大基本数据类型包括字符串,链表,字典,集合,排序集合。
  • 配置文件:Redis配置文件可以配置内存淘汰策略等一系列设置。
  • 缓存:Redis被广泛应用于缓存方向,可能会发生缓存相关的问题,如缓存穿透,缓存雪崩等。

7 数据结构和算法

如果我们不想当一个只会调包,只会简单增删改查的码农,那么我们就需要掌握算法和数据结构,常言道:数据结构+算法=程序,高效的数据结构和精巧的算法能提升程序的效率,对于后台开发来说,效率非常重要。当然我们不需要掌握非常高难度的算法,可是掌握基础的算法和数据结构是必须的,下面是一些基础的数据结构和算法

常用数据结构:

  • 数组
  • 栈和队列
  • 链表
    • 单向链表
    • 双向链表
    • 循环链表
    • 二叉树
    • 二叉搜索树
    • 二叉平衡树
    • 红黑树
    • 有向图
    • 无向图
    • KMP

常用算法:

  • 分治法
  • 动态规划
  • 递归和回溯
  • 排序
    • 快速排序
    • 归并排序
  • 查找
    • 二分查找
  • 树算法图算法
    • 树的前,中,后序,层次遍历(递归和非递归写法)
    • 图的遍历
    • 最小生成树
    • 迪杰斯特拉

算法和数据结构的就像是武侠小说中的内功,是每一个想成为高手的人必须要修炼的。修炼的过程是数以年记的,这个过程需要我们保持耐心和恒心。

8 设计模式

设计模式是软件工程师们针对软件设计模式总结出的经验,如果说前述的内容还处在'术'的阶段,设计模式已经有了'道'的感觉,好的设计模式能帮助工程师创造出高质量的软件。工程师总结了23种常用的设计模式。在23种设计模式中,有几种设计模式是重中之重,要好好掌握,例如:

  • 单例模式:一个类只能有一个对象。
  • 工厂模式:封装对象的创建,让子类决定创建的对象。
  • 观察者模式:定义对象的一对多关系。

9 其他常用技能

除了上面这些基础内容,还有一些也要掌握,例如

  • Makefile的编写
  • Linux下常用工具的使用,例如vim,git,gdb等

另外,在社招中,企业可能会提一些更高的要求,例如分布式,容器,中间件什么的,如果学有余力,也可以进一步的去了解。

总结

总的来说,Linux下C++服务器开发的知识还是很多的,如果想要找到一份好的工作,或者对这个领域有深入理解,还是需要投入很多的时间精力的。对于这上面列出的知识,我也有很多没掌握的地方,但我相信通过系统的学习,不断迭代更新自己的知识,一定能取得进步。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux/c++服务器开发方向的重点 的相关文章

  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • Linux 上的 Pervasive ODBC 错误 [01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/psql/lib/odbcci.so':找不到文件

    我正在尝试让 Pervasive v10 客户端 ODBC 在 Centos 6 上运行 据我所知 没有 64 位 ODBC 客户端 因此我必须使用 32 位客户端 我终于成功安装了它 但尝试使用时出现以下错误 isql v mydsn 0
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务

随机推荐

  • 【git】说说git的基础命令

    git的基础命令 命令名称作用git config global user name 用户名设置用户签名git config global user email 邮箱设置用户签名git init初始化本地库git status查看本地库状态
  • 【maven】maven基础知识入门

    maven 文章目录 maven什么是maven为什么使用maven项目构建过程的几个主要环节maven核心概念如何通过坐标到仓库中查找jar包 什么是maven Maven 是 Apache 软件基金会组织维护的一款自动化构建工具 xff
  • 【spring】说说spring的IOC与DI

    说说spring的IOC与DI 文章目录 说说spring的IOC与DIid属性和name属性标签scope Bean的作用范围Spring xff0c 配置生成Bean的三种方式Sping 的 Bean属性注入Sping的Bean属性通过
  • ffmpeg时间戳相关函数

    1 概述 ffmpeg中与时间戳相关的函数主要有 xff1a av rescale q xff0c av rescale q rnd xff0c av compare ts av rescale q span class token cla
  • 【计算机网络】网线规格的鉴别与接线方法

    网线规格的鉴别与接线发送 文章目录 网线规格的鉴别与接线发送一 怎么判断网线类型 xff1f 二 制作网线标准三 屏蔽类型四 使用场景五 米数标记接线方法 一 怎么判断网线类型 xff1f 可以根据网线外皮的标识来判断 xff0c 正规厂商
  • 【Java】说说spring-jdbc和spring事务管理

    文章目录 说说spring jdbc和spring事务管理spring jdbc1 配置数据源2 使用jdbcTemplete3 在dao层使用jdbcTemplete 外部配置方式新建配置文件jdbc properties修改数据源配置部
  • 【微服务】springcloud-dubbo,springCloudAlibaba服务调用使用dubbo

    springcloud dubbo xff0c springCloudAlibaba服务调用使用dubbo 文章目录 springcloud dubbo xff0c springCloudAlibaba服务调用使用dubbo添加依赖配置具体
  • 【项目实战】spring boot中使用webSocket

    spring boot中使用webSocket 文章目录 spring boot中使用webSocket引入依赖支持配置类接口类前端连接方式前端信息发送方式 引入依赖 需要在基础的spring boot web项目项目中添加下面一个依赖 x
  • 【项目复盘】springboot项目中使用mybatis-plus进行分页

    springboot项目中使用mybatis plus进行分页 文章目录 springboot项目中使用mybatis plus进行分页引入依赖配置类实体类持久层业务层 引入依赖 span class token generics span
  • 【项目复盘】javax.validation的简单使用

    javax validation的简单使用 javax validation需要与hibernate validator配合使用 validation bean 是基于JSR 303标准开发出来的 xff0c 使用注解方式实现 xff0c
  • 【项目复盘】springboot中使用swagger生成接口文档并配置bootstrap主题

    springboot中使用swagger生成接口文档并配置bootstrap主题 引入依赖 span class token generics span class token punctuation lt span dependency
  • 【项目复盘】微服务网关GateWay过滤

    微服务网管过滤 新建一个过滤类 span class token annotation punctuation 64 Component span span class token comment 过滤器的执行优先级 返回值越小 执行优先级
  • 【项目实战】Winodws下使用ELK搭建日志分析框架

    项目实战 Winodws下使用ELK搭建日志分析框架 ELK是什么 xff1a 引用官网的一句话 xff1a 核心产品包括 Elasticsearch Kibana Beats 和 Logstash xff08 也称为 ELK Stack
  • java_网络编程知识

    day11 网络编程 主要内容 软件架构CS xff0f BS网络通信三要素TCP通信Socket套接字ServerSocket 学习目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类名称 能够编写TCP协议下字符串数据传
  • AvFrame和AvPacket

    在FFmpeg中 未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存 针对视频编码器 其流程为从数据源获取图像格式的输入数据 保存为AVFrame对象并传入编码器 从编码器输出AVPacket结构 1 AVFr
  • 基于FreeRTOS的stm32程序初始化底层搭建(hal库)

    采用嵌入式实时操作系统 RTOS 可以更合理 更有效地利用CPU的资源 xff0c 简化应用软件的设计 xff0c 缩短系统开发时间 xff0c 更好地保证系统的实时性和可靠性 FreeRTOS是一个迷你的实时操作系统内核 作为一个轻量级的
  • ceres小结 -- vins为例

    从 typora 复制的 排版有问题 见谅 在estimator cpp文件里 这个函数 void Estimator optimization 1 声明problem ceres Problem problem 2 引入核函数loss f
  • JavaScript操作表格及CSS样式

    概述 在前端开发中 xff0c 表格主要用于存储结构化的数据 xff0c CSS主要用于修饰DOM元素 xff0c 如何通过DOM来操作表格及CSS呢 xff1f 本文主要通过一些简单的小例子 xff0c 简述DOM对表格和CSS的常见操作
  • 转:Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后 xff0c 不可避免的要拆分成多个子模块 xff0c 我们希望各个子模块有独立的版本管理 xff0c 并且由专门的人去维护 xff0c 这时候我们就要用到git的submodule功能 常用命令 span c
  • Linux/c++服务器开发方向的重点

    作者 xff1a NULL 链接 xff1a https www zhihu com question 37247264 answer 2352680534 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c