有关后台开发的复习知识点

推荐必读书籍:

C++语言基础类:《C++ primer plus》或《C++ primer》、《Effective C++》、《STL源码剖析》

算法类:《编程珠玑》、《剑指offer》、《算法设计与分析》(王秋芬,清华大学出版社)

计算机基础类:《计算机网络》(谢希仁)、、《后台开发核心技术与应用实践》(徐晓鑫)、《数据结构》(严蔚敏,清华大学出版社)

操作系统类:《计算机操作系统》(汤小丹)

程序链接类:《程序员的自我修养》

Linux编程类:《UNIX网络编程》、《UNIX环境高级编程》、《鸟哥的LINUX私房菜》

数据库类:《MySQL必知必会》、《高性能MySQL》(只看前四章即可)

 

C++知识点

  1. C++中函数重载的调用过程
  2. 函数模板的实现方式
  3. 常指针和指向常量的指针的区别
  4. 引用的底层是如何实现的,以及与指针的区别
  5. New、delete和malloc、free的区别
  6. C++是如何管理内存的
  7. 内联函数的特点
  8. 类的大小,空类的大小
  9. 类默认有哪些函数、C++11中默认有哪些函数
  10. 构造函数和析构函数的调用顺序
  11. Virtual关键的三个作用
  12. 动态多态的实现方法
  13. Struct和class的区别
  14. C++11做了哪些更新
  15. 4种智能指针的作用(auto_ptr、shared_ptr、unique_ptr和weak_ptr)
  16. C++中的4中强制转换方法(dynamic_cast、const_cast、static_cast和reinterpret_cast)
  17. 左值的概念
  18. 右值引用的概念
  19. 移动语义和右值构造函数、右值赋值函数的概念
  20. Strlen和sizeof的区别
  21. 存储数据时大端和小端的概念,以及如何判断计算机存储是采用大端还是小端
  22. Extern关键字在C++中的使用的含义
  23. 为什么构造函数不能声明为虚函数,为什么析构函数要声明为虚函数
  24. 静态链接和动态链接的区别
  25. 虚函数的实现方法
  26. STL是如何对内存进行管理的

 

 

后台开发主要技术:

  1. STL底层原理实现
  2. 预处理、编译、汇编、链接、创建静态库、使用静态库、创建静态库、使用动态库
  3. Makefile的撰写
  4. ELF文件的格式:.text、.data、.bss、.rec、.symtab、.strtab
  5. Strace的使用:strace -coTp
  6. Gdb的使用:l、b、16/func、r、n、p i、bt、finish、q
  7. Valgrind的使用
  8. TCP协议:TCP头部、TCP状态流转、超时重传、滑动窗口、拥塞控制
  9. TCP网络编程API
  10. IO模型:阻塞模型、非阻塞模型、多路复用模型、信号驱动式、异步
  11. 多线程:创建与结束、互斥锁、条件变量、信号量、读写锁
  12. 进程:创建与结束(fork、vfork、exec、exit、_exit、abort)、孤儿进程、僵尸进程(wait、waitpid)、守护进程
  13. 进程间的通信:信号、管道(无名管道、命令)、信号量、消息队列、共享内存
  14. HTTP协议

 

计算机网络知识点

  1. TCP报头格式

16位源端口、16位目的端口、32位序列号、32位确认号、16位检验和、16位紧急窗口指针

  1. UDP报头格式

源端口、目的端口、用户数据包长度和检验和

  1. TCP/UDP区别(不仅是宏观上的,最好能根据各自的机制讲解清楚)

TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

TCP对系统资源要求较多,UDP对系统资源要求较少。

  1. HTTP状态码(最好结合使用场景,比如在缓存命中时使用哪个)

状态码      类别      原因短语

1XX   Informational(信息性状态码) 接收的请求正在处理

100表明到目前为止都很正常,客户端可以继续发送请求

2XX   Success(成功状态码)      请求正常处理完毕

200OK

3XX   Redirection(重定向状态码)   需要进行附加操作以完成请求

301永久重定向、302临时重定向。永久重定向和临时重定向的区别

 

4XX   Client Error(客户端错误状态码)   服务器无法处理请求

403请求被拒绝、404请求未发现

5XX   Server Error(服务器错误状态码)  服务器处理请求出错

500服务器正在执行请求时发生错误

  1. HTTP协议(一些报头字段的作用,如cace-controlkeep-alive

4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

通用首部字段:Cache-Control

请求首部字段:Host:请求资源所在的服务器、Accept:用户代理可处理的媒体类型

响应首部字段:Location:令客户端重定向至指定URLserverHTTP服务器的安装

实体首部字段:Content-language:实体主体的自然语言、Content-length实体主体大小

请求报文头格式:

开始行:方法 URL 版本 CRLF

首部行:首部字段名: CRLF

        首部字段名: CRLF

            .

            .

            .

实体主体: 实体主体

响应报文头格式:

开始行:版本 状态码 短语 CRLF

首部行:首部字段名: CRLF

        首部字段名: CRLF

            .

            .

            .

实体主体: 实体主体

  1. OSI协议、TCP/IP协议以及每层对应的协议。

  1. SESSION机制、cookie机制

Cookie 是服务器发送给客户端的数据,该数据会被保存在浏览器中,并且客户端的下一次请求报文会包含该数据。通过 Cookie 可以让服务器知道两个请求是否来自于同一个客户端,从而实现保持登录状态等功能。Cookie大小、数量有限制,Cookie是存在客户端可能被禁用、删除、篡改,是不安全的。Cookie如果很大,每次请求都需带上影响传输效率。

Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session IDHTTP 就是通过 Session Cookie 这两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端。Session不做特殊处理容易失效、过期、丢失或者Session过多导致服务器内存溢出。

 

  1. TCP三次握手、四次挥手(这个问题真的要回答吐了,不过真的是面试官最喜欢问的,建议每天手撸一遍,而且不只是每次请求的过程,各种FIN_WAITTIME_WAIT状态也要掌握)。

假设 A 为客户端,B 为服务器端。

首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。

A B 发送连接请求报文段,SYN=1ACK=0,选择一个初始的序号 x

B 收到连接请求报文段,如果同意建立连接,则向 A 发送连接确认报文段,SYN=1ACK=1,确认号为 x+1,同时也选择一个初始的序号 y

A 收到 B 的连接确认报文段后,还要向 B 发出确认,确认号为 y+1,序号为 x+1

B 收到 A 的确认后,连接建立。

四次挥手

A 发送连接释放报文段,FIN=1

B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。

B 要不再需要连接时,发送连接释放请求报文段,FIN=1

A 收到后发出确认,进入 TIME-WAIT 状态,等待 2MSL 时间后释放连接。

B 收到 A 的确认后释放连接。

 

  1. 打开网页到页面显示之间的过程(涵盖了各个方面,DNS解析过程,Nginx请求转发、连接建立和保持过程、浏览器内容渲染过程,考虑的越详细越好)。

有了 HTTP 服务器的 IP 地址之后,主机就能够生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。

在生成 TCP 套接字之前,必须先与 HTTP 服务器进行三次握手来建立连接。生成一个具有目的端口 80 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。

HTTP 服务器收到该报文段之后,生成 TCP SYNACK 报文段,发回给主机。

连接建立之后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。

HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。

浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,之后进行渲染,显示 Web 页面。

 

  1. httphttps区别,https在请求时额外的过程,https是如何保证数据安全的

http是超文本传输协议,HTTPs 并不是新协议,而是 HTTP 先和 SSLSecure Sockets Layer)通信,再由 SSL TCP 通信。也就是说 HTTPs 使用了隧道进行通信。通过使用 SSLHTTPs 具有了加密、认证和完整性保护。HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。

HTTPS协议需要到CA申请证书,一般免费证书少需要交费;HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议;HTTP使用80端口,HTTPS使用443端口;HTTP的连接简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的,可进行加密传输、身份认证的网络协议。

SSL包含的动作:

  1. 验证服务器
  2. 允许客户端和服务器选择加密算法和密码,确保双方都支持
  3. 验证客户端
  4. 使用公钥加密技术来生成共享加密数据
  5. 创建一个加密的SSL链接
  6. 基于该SSL链接传递HTTP请求

 

  1. IP地址子网划分

通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。注意,外部网络看不到子网的存在。

IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}

 

  1. POSTGET区别

当前网络请求中,绝大部分使用的是 GET 方法。POST 主要用来更新资源。

GET POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在内容实体中。

GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

HEAD:向服务器索要与Get请求相一致的响应,只不过响应体将不会被返回

PUT:向指定资源位置上传其最新内容

  1. DNS解析过程

主机向本地域名服务器解析的过程采用递归,而本地域名服务器向其它域名服务器解析可以使用递归和迭代两种方式。

迭代的方式下,本地域名服务器向一个域名服务器解析请求解析之后,结果返回到本地域名服务器,然后本地域名服务器继续向其它域名服务器请求解析;而递归的方式下,结果不是直接返回的,而是继续向前请求解析,最后的结果才会返回。

 

  1. http1.1http12.0的区别

HTTP/2.0 使用多路复用技术,使用同一个 TCP 连接来处理多个请求。

HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表,从而避免了重复传输。

在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。

HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。

  1. 地址解析协议ARP 
  2. 15. 交换机和路由器的区别

 

 

数据库知识点

  1. 事务四大特性(ACID

原子性(Atomicity

事务被视为不可分割的最小单元,要么全部提交成功,要么全部失败回滚。

一致性(Consistency

事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。

 隔离性(Isolation

一个事务所做的修改在最终提交以前,对其它事务是不可见的。

持久性(Durability

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。

 

  1. 数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别

未提交读(READ UNCOMMITTED

事务中的修改,即使没有提交,对其它事务也是可见的。

提交读(READ COMMITTED

一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。

可重复读(REPEATABLE READ

保证在同一个事务中多次读取同样数据的结果是一样的。

可串行化(SERIALIXABLE

强制事务串行执行。

Mysql默认可重读级别

 

  1. MYSQL的两种存储引擎区别(事务、锁级别等等),各自的适用场景

InnoDB MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支持的特性时,才考虑使用其它存储引擎。

采用 MVCC 来支持高并发,并且实现了四个标准的隔离级别,默认级别是可重复读。

表是基于聚簇索引建立的,它对主键的查询性能有很高的提升。

MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等。但 MyISAM 不支持事务和行级锁,而且崩溃后无法安全恢复。

 

只能对整张表加锁,而不是针对行。

事务:InnoDB 是事务型的。

备份:InnoDB 支持在线热备份。

崩溃恢复:MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。

并发:MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。

其它特性:MyISAM 支持全文索引,地理空间索引。

 

  1. 数据库的优化(从sql语句优化和索引两个部分回答)

减少返回的列

慢查询主要是因为访问了过多数据,除了访问过多行之外,也包括访问过多列。最好不要使用 SELECT * 语句,要根据需要选择查询的列。

减少返回的行

最好使用 LIMIT 语句来取出想要的那些行。还可以建立索引来减少条件语句的全表扫描。

Explain

用来分析 SQL 语句。

独立的列

在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。

前缀索引

对于 BLOBTEXT VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。

多列索引

在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好。

索引列的顺序

让选择性最强的索引列放在前面

  1. 索引有B+索引和hash索引,各自的区别
  2. B+索引数据结构,和B树的区别
  3. 索引的分类(主键索引、唯一索引),最左前缀原则,哪些情况索引会失效
  4. 聚集索引和非聚集索引区别。
  5. 有哪些锁(乐观锁悲观锁),select时怎么加排它锁

共享锁、排他锁

一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。

一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A S 锁,但是不能加 X 锁。

 

  1. 关系型数据库和非关系型数据库区别

数据库
类型

特性

关系型数据库
SQLiteOraclemysql

1、关系型数据库,是指采用了关系模型来组织
数据的数据库;
2、关系型数据库的最大特点就是事务的一致性;
3、简单来说,关系模型指的就是二维表格模型,
而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

非关系型数据库
MongoDbredisHBase

1、使用键值对存储数据;
2、分布式;
3、一般不支持ACID特性;
4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。

 

  1. 了解nosql
  2. 数据库三范式,根据某个场景设计数据表(可以通过手绘ER图)

第一范式 (1NF)

属性不可分;

第二范式 (2NF)

每个非主属性完全函数依赖于键码。可以通过分解来满足。

第三范式 (3NF)

非主属性不传递依赖于键码。

  1. 数据库的主从复制
  2. 使用explain优化sql和索引
  3. long_query怎么解决
  4. 内连接、外连接、交叉连接、笛卡儿积等

 

 

操作系统知识点

  1. 内存的页面置换算法

最佳法

先进先出

最近最久未使用

时钟

  1. 进程调度算

批处理系统中的调度

    1. 先来先服务

调度最先进入就绪队列的作业。

有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

1.2 短作业优先

调度估计运行时间最短的作业。

长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

1.3 最短剩余时间优先

交互式系统中的调度

2.1 优先级调度

响应比 = (等待时间 + 要求服务时间) / 要求服务时间

这种调度算法主要是为了解决短作业优先调度算法长作业可能会饿死的问题,因为随着等待时间的增长,响应比也会越来越高。

2.2 时间片轮转

将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系。因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。

 

2.3 多级反馈队列

如果一个进程需要执行 100 个时间片,如果采用轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。

每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

实时系统中的调度

实时系统要求一个服务请求在一个确定时间内得到响应。

分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。

 

  1. 进程间通信方式

信号、信号集、管道、消息队列、信息量、共享内存

  1. 进程线程区别

拥有资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。

系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

通信方面:进程间通信 (IPC) 需要进程同步和互斥手段的辅助,以保证数据的一致性。而线程间可以通过直接读/写同一进程中的数据段(如全局变量)来进行通信。

  1. 线程之间的通信

互斥锁、条件变量、信号量

  1. 死锁的条件

互斥:每个资源要么已经分配给了一个进程,要么就是可用的。

占有和等待:已经得到了某个资源的进程可以再请求新的资源。

不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。

环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

利用抢占恢复

利用回滚恢复

通过杀死进程恢复

  1. 缓冲区溢出是什么?有什么危害?出现原因?

在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统定义好了。向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。

可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务, 另外一种就是跳转并且执行一段恶意代码。

  1. 孤儿进程、僵尸进程和守护进程

孤儿进程

如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的.

进程终止后进入僵死状态(zombie),等待告知父进程自己终止,后才能完全消失.但是如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程.

守护进程就是在后台运行,不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,它们以root用户或者其他特殊用户(apachepostfix)运行,并能处理一些系统级的任务.

下面介绍一下创建守护进程的步骤

  • 调用fork(),创建新进程,它会是将来的守护进程.
  • 在父进程中调用exit,保证子进程不是进程组长
  • 调用setsid()创建新的会话区
  • 将当前目录改成跟目录(如果把当前目录作为守护进程的目录,当前目录不能被卸载他作为守护进程的工作目录)
  • 将标准输入,标注输出,标准错误重定向到/dev/null
  1. 什么时候使用进程,什么时候使用线程
  1. 需要频繁创建销毁的优先使用线程
  2. 需要进行大量计算的优先使用线程
  3. 强相关的处理用线程,弱相关的处理用进程
  4. 可能要扩展到多机分布的用进程,多核分布的用线程

 

 

Linux系统知识点

  1. 硬链接和软连接区别

建立符号链接的命令:ln –s 目标文件 链接文件;

可以对目录建立符号链接;删除一个符号链接不会对原文件产生影响。

建立硬链接的命令:ln 目标文件 链接文件;

硬链接是已存在文件的另一个名字。建立硬链接之前,目标文件必须存在。删除源文件后,通过硬链接依然可以找回源文件

  1. kill用法,某个进程杀不掉的原因(进入内核态,忽略kill信号)

僵尸进程、忽略了kill信号

  1. linux用过的命令
  2. 系统管理命令(如查看内存使用、网络情况)

Freeifconfig

  1. 管道的使用 |
  2. grep的使用,一定要掌握,每次都会问在文件中查找
  3. shell脚本
  4. find命令
  5. awk使用

你可能感兴趣的:(编程经历)