推荐必读书籍:
C++语言基础类:《C++ primer plus》或《C++ primer》、《Effective C++》、《STL源码剖析》
算法类:《编程珠玑》、《剑指offer》、《算法设计与分析》(王秋芬,清华大学出版社)
计算机基础类:《计算机网络》(谢希仁)、、《后台开发核心技术与应用实践》(徐晓鑫)、《数据结构》(严蔚敏,清华大学出版社)
操作系统类:《计算机操作系统》(汤小丹)
程序链接类:《程序员的自我修养》
Linux编程类:《UNIX网络编程》、《UNIX环境高级编程》、《鸟哥的LINUX私房菜》
数据库类:《MySQL必知必会》、《高性能MySQL》(只看前四章即可)
C++知识点
后台开发主要技术:
计算机网络知识点
16位源端口、16位目的端口、32位序列号、32位确认号、16位检验和、16位紧急窗口指针
源端口、目的端口、用户数据包长度和检验和
TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP对系统资源要求较多,UDP对系统资源要求较少。
状态码 类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
100表明到目前为止都很正常,客户端可以继续发送请求
2XX Success(成功状态码) 请求正常处理完毕
200OK
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
301永久重定向、302临时重定向。永久重定向和临时重定向的区别
4XX Client Error(客户端错误状态码) 服务器无法处理请求
403请求被拒绝、404请求未发现
5XX Server Error(服务器错误状态码) 服务器处理请求出错
500服务器正在执行请求时发生错误
有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。
通用首部字段:Cache-Control、
请求首部字段:Host:请求资源所在的服务器、Accept:用户代理可处理的媒体类型
响应首部字段:Location:令客户端重定向至指定URL、server:HTTP服务器的安装
实体首部字段:Content-language:实体主体的自然语言、Content-length实体主体大小
请求报文头格式:
开始行:方法 URL 版本 CRLF
首部行:首部字段名: 值CRLF
首部字段名: 值CRLF
.
.
.
实体主体: 实体主体
响应报文头格式:
开始行:版本 状态码 短语 CRLF
首部行:首部字段名: 值CRLF
首部字段名: 值CRLF
.
.
.
实体主体: 实体主体
Cookie 是服务器发送给客户端的数据,该数据会被保存在浏览器中,并且客户端的下一次请求报文会包含该数据。通过 Cookie 可以让服务器知道两个请求是否来自于同一个客户端,从而实现保持登录状态等功能。Cookie大小、数量有限制,Cookie是存在客户端可能被禁用、删除、篡改,是不安全的。Cookie如果很大,每次请求都需带上影响传输效率。
Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是通过 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端。Session不做特殊处理容易失效、过期、丢失或者Session过多导致服务器内存溢出。
假设 A 为客户端,B 为服务器端。
首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
A 向 B 发送连接请求报文段,SYN=1,ACK=0,选择一个初始的序号 x。
B 收到连接请求报文段,如果同意建立连接,则向 A 发送连接确认报文段,SYN=1,ACK=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 的确认后释放连接。
有了 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 页面。
http是超文本传输协议,HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是说 HTTPs 使用了隧道进行通信。通过使用 SSL,HTTPs 具有了加密、认证和完整性保护。HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。
HTTPS协议需要到CA申请证书,一般免费证书少需要交费;HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议;HTTP使用80端口,HTTPS使用443端口;HTTP的连接简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的,可进行加密传输、身份认证的网络协议。
SSL包含的动作:
通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。注意,外部网络看不到子网的存在。
IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}
当前网络请求中,绝大部分使用的是 GET 方法。POST 主要用来更新资源。
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在内容实体中。
GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。
HEAD:向服务器索要与Get请求相一致的响应,只不过响应体将不会被返回
PUT:向指定资源位置上传其最新内容
主机向本地域名服务器解析的过程采用递归,而本地域名服务器向其它域名服务器解析可以使用递归和迭代两种方式。
迭代的方式下,本地域名服务器向一个域名服务器解析请求解析之后,结果返回到本地域名服务器,然后本地域名服务器继续向其它域名服务器请求解析;而递归的方式下,结果不是直接返回的,而是继续向前请求解析,最后的结果才会返回。
HTTP/2.0 使用多路复用技术,使用同一个 TCP 连接来处理多个请求。
HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表,从而避免了重复传输。
在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。
HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。
数据库知识点
原子性(Atomicity)
事务被视为不可分割的最小单元,要么全部提交成功,要么全部失败回滚。
一致性(Consistency)
事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
隔离性(Isolation)
一个事务所做的修改在最终提交以前,对其它事务是不可见的。
持久性(Durability)
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。
未提交读(READ UNCOMMITTED)
事务中的修改,即使没有提交,对其它事务也是可见的。
提交读(READ COMMITTED)
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
可重复读(REPEATABLE READ)
保证在同一个事务中多次读取同样数据的结果是一样的。
可串行化(SERIALIXABLE)
强制事务串行执行。
Mysql默认可重读级别
InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支持的特性时,才考虑使用其它存储引擎。
采用 MVCC 来支持高并发,并且实现了四个标准的隔离级别,默认级别是可重复读。
表是基于聚簇索引建立的,它对主键的查询性能有很高的提升。
MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等。但 MyISAM 不支持事务和行级锁,而且崩溃后无法安全恢复。
只能对整张表加锁,而不是针对行。
事务:InnoDB 是事务型的。
备份:InnoDB 支持在线热备份。
崩溃恢复:MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。
并发:MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。
其它特性:MyISAM 支持全文索引,地理空间索引。
减少返回的列
慢查询主要是因为访问了过多数据,除了访问过多行之外,也包括访问过多列。最好不要使用 SELECT * 语句,要根据需要选择查询的列。
减少返回的行
最好使用 LIMIT 语句来取出想要的那些行。还可以建立索引来减少条件语句的全表扫描。
Explain
用来分析 SQL 语句。
独立的列
在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。
前缀索引
对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。
多列索引
在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好。
索引列的顺序
让选择性最强的索引列放在前面
共享锁、排他锁
一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
数据库 |
特性 |
关系型数据库 |
1、关系型数据库,是指采用了关系模型来组织 |
非关系型数据库 |
1、使用键值对存储数据; |
第一范式 (1NF)
属性不可分;
第二范式 (2NF)
每个非主属性完全函数依赖于键码。可以通过分解来满足。
第三范式 (3NF)
非主属性不传递依赖于键码。
操作系统知识点
最佳法
先进先出
最近最久未使用
时钟
批处理系统中的调度
调度最先进入就绪队列的作业。
有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
1.2 短作业优先
调度估计运行时间最短的作业。
长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。
1.3 最短剩余时间优先
交互式系统中的调度
2.1 优先级调度
响应比 = (等待时间 + 要求服务时间) / 要求服务时间
这种调度算法主要是为了解决短作业优先调度算法长作业可能会饿死的问题,因为随着等待时间的增长,响应比也会越来越高。
2.2 时间片轮转
将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。
时间片轮转算法的效率和时间片的大小有很大关系。因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
2.3 多级反馈队列
如果一个进程需要执行 100 个时间片,如果采用轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。
每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
实时系统中的调度
实时系统要求一个服务请求在一个确定时间内得到响应。
分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
信号、信号集、管道、消息队列、信息量、共享内存
拥有资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。
系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
通信方面:进程间通信 (IPC) 需要进程同步和互斥手段的辅助,以保证数据的一致性。而线程间可以通过直接读/写同一进程中的数据段(如全局变量)来进行通信。
互斥锁、条件变量、信号量
互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
占有和等待:已经得到了某个资源的进程可以再请求新的资源。
不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。
利用抢占恢复
利用回滚恢复
通过杀死进程恢复
在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统定义好了。向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。
可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务, 另外一种就是跳转并且执行一段恶意代码。
孤儿进程
如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的.
进程终止后进入僵死状态(zombie),等待告知父进程自己终止,后才能完全消失.但是如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程.
守护进程就是在后台运行,不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,它们以root用户或者其他特殊用户(apache和postfix)运行,并能处理一些系统级的任务.
下面介绍一下创建守护进程的步骤
Linux系统知识点
建立符号链接的命令:ln –s 目标文件 链接文件;
可以对目录建立符号链接;删除一个符号链接不会对原文件产生影响。
建立硬链接的命令:ln 目标文件 链接文件;
硬链接是已存在文件的另一个名字。建立硬链接之前,目标文件必须存在。删除源文件后,通过硬链接依然可以找回源文件
僵尸进程、忽略了kill信号
Free、ifconfig