计算机基础
2021-12-14 10:53:47 0 举报
AI智能生成
计算机基础
作者其他创作
大纲/内容
面向对象
类与对象
对象生命周期
创建阶段(Created)
应用阶段(In Use)
不可见阶段(Invisible)
不可达阶段(Unreachable)
收集阶段(Collected)
终结阶段
重分配阶段
静态类
方法
构造方法
三大特性
封装(Encapsulation)
修饰符
里氏替换原则
开放封闭原则
实现不可变
内部类
继承(Inheritance )
抽象类
接口
两者对比
this 与 super
使用细则
执行顺序
多态(Polymorphism)
覆写(Override)
重载(Overload)
类关系
继承(Generalization):extends(is)
实现(Realization):implements(like)
组合(Composition):类作为成员变量(contains)
聚合(Aggregation):类作为成员变量(has)
依赖(Dependency):import(use)
攻击技术
跨站脚本攻击(XSS)
将代码注入到用户浏览的网页上窃取信息
示例
防范手段
设置 Cookie 为 HttpOnly
过滤特殊字符
跨站请求伪造(CSRF)
欺骗用户浏览器访问其曾经认证过的网站并执行操作
示例
防范手段
检查 Referer 首部字段
添加校验 Token
输入验证码
SQL 注入
拼接参数、发送并使服务器执行非法的 SQL 语句
示例
防范手段
使用参数化查询
单引号转换
拒绝服务攻击(DDoS)
SYN 攻击
防范手段
中间人攻击(MitM)
重放攻击
彩虹表攻击
防范手段
设计模式
设计原则
单一职责原则(Single Responsibility Principle)
开闭原则(Open Closed Principle)
里氏替换原则(Liskov Substitution Principle)
接口隔离原则(Interface Segregation Principle)
依赖倒置原则(Dependence Inversion Principle)
迪米特原则(Law of Demeter)
创建型模式
⭐ 单例(Singleton)
类图
实现
懒汉式 - 线程不安全
饿汉式 - 线程安全
懒汉式 - 线程安全
双重校验锁 - 线程安全
静态内部类实现
枚举实现
应用
JDK 中的应用
Spring 中的应用
简单工厂(Simple Factory)
类图
实现
⭐ 工厂方法(Factory Method)
类图
实现
应用
Spring 中的应用
JDK 中的应用
⭐ 抽象工厂(Abstract Factory)
类图
实现
应用
JDK 中的应用
Spring 中的应用
⭐ 建造者(Builder)
类图
实现
应用
JDK 中的应用
Spring 中的应用
原型(Prototype)
类图
实现
应用
JDK 中的应用
Spring 中的应用
结构型模式
⭐ 适配器(Adapter)
类图
实现
应用
JDK 中的应用
Spring 中的应用
桥接(Bridge)
类图
实现
应用
JDK 中的应用
组合(Composite)
类图
实现
应用
JDK 中的应用
Spring 中的应用
装饰器(Decorator)
类图
实现
应用
JDK 中的应用
Spring 中的应用
外观(Facade)
类图
实现
应用
JDK 中的应用
享元(Flyweight)
类图
实现
应用
JDK 中的应用
⭐ 代理(Proxy)
类图
实现
应用
JDK 中的应用
Spring 中的应用
行为型模式
⭐ 责任链(Chain Of Responsibility)
类图
实现
应用
JDK 中的应用
Spring 中的应用
命令(Command)
类图
实现
应用
JDK 中的应用
Spring 中的应用
解释器(Interpreter)
类图
实现
应用
JDK 中的应用
Spring 中的应用
迭代器(Iterator)
类图
实现
应用
JDK 中的应用
中介者(Mediator)
类图
实现
应用
JDK 中的应用
备忘录(Memento)
类图
实现
应用
JDK 中的应用
⭐ 观察者(Observer)
类图
实现
应用
JDK 中的应用
Spring 中的应用
状态(State)
类图
实现
应用
策略(Strategy)
类图
实现
应用
JDK 中的应用
Spring 中的应用
模板方法(Template Method)
类图
实现
应用
JDK 中的应用
Spring 中的应用
访问者(Visitor)
类图
实现
应用
JDK 中的应用
Spring 中的应用
空对象(Null)
类图
实现
加密算法
对称加密
DES
RC2/RC4
3DES
Camellia
AES
ChaCha20
非对称加密
RSA
DSA
ECC
Hash
MD5
SHA
计算机网络
HTTP
报文格式
请求报文
请求方法、URL、协议版本
请求首部
分隔行
请求主体
响应报文
协议版本、状态码、描述
响应首部
分隔行
响应主体
首部字段
请求方法
状态码
请求参数
HTTPS
基本流程
加密
加密方式
认证
服务端向 CA 提出公钥申请
CA 对公钥做数字签名,分配已签名公钥加入证书后绑定
服务端把证书发给客户端,客户端取得公钥做数字签名验证,通过则开始通信
摘要
基本特性
幂等性
安全性
可缓存
无状态
Cookie-Session
Cookie
Session
安全保证
版本特性
1.1
默认长连接
Cookie
缓存管理
虚拟主机
流水线
同时打开多个 TCP 连接
分块传输编码
2.0
二进制分层帧
服务器推送
首部压缩
3.0
QUIC
TLS
TLS 1.2 安全密码套件
密钥交换算法:ECDHE
身份验证算法:RSA
对称加密算法:AES(128 强度、GCM 模式)
签名哈希算法:SHA256
对称加密算法
工作原理
ChildTopic
TCP
工作任务
主机内进程寻址
创建和管理连接
处理并打包字节流为报文段
传输数据
保持可靠性和传输质量
流量控制和拥塞控制
解决问题
点对点,面向连接
全双工(双向传递)
字节流传输
不维护报文边界
不强求应用使用离散数据块
不限制数据块大小
流量缓冲
可靠传输
拥塞控制
报文格式
首部格式
源端口
目的端口
序号 seq
序号复用
确认号 ack
设计目的
数据偏移
确认 ACK
同步 SYN
终止 FIN
窗口
常用选项
拆分报文段
最大报文段(MSS)
连接管理
三次握手
状态机
客户端
CLOSED
SYN-SENT
ESTABLISHED
服务端
CLOSED
LISTEN
SYN-RECEIVED
ESTABLISHED
SYN 攻击
服务端处理
优化机制
TCP_DEFER_ACCEPT
Fast Open(TFO)
“三次”的原因
四次挥手
状态机
TIME_WAIT
传输机制
可靠传输
重传确认
重传机制(PAR)
往返时间(RTT)
重传超时时间(RTO)
跟踪 RTT 方差
滑动窗口
发送端
1. 已发送且收到确认
发送窗口
2. 已发送未收到确认
3. 未发送且总大小在接收方处理范围内(可用窗口)
4. 未发送且总大小在接收方处理范围外
接收端
1. 已接收且已确认
接收窗口
2. 未接收且可接收
3. 未接收且不可接收
流量控制
操作系统缓冲区
应用层未及时读取缓存
收缩窗口导致的丢包
接收缓存的配置
拥塞控制
慢开始
拥塞避免
快重传
快恢复
控制算法
基于丢包:SACK
基于带宽策略:BBR
基本原理
高效传输
SWS 避免
接收方:David D Clark 算法
发送方:Nagle 算法
粘包、半包
延迟确认
TCP_CORK
多路复用
其它功能
长连接
校验和
带外数据
多路复用
常见问题
如何防止 SYN 攻击
ISN 为何不从 0 开始?
两端同时发送 SYN 的情况
如何防止序列号回绕
如何较少小报文提高网络效率?
传输过程出现严重错误如何快速断开连接?
出现大量 TIME_WAIT 如何解决
UDP
基本特性
首部格式
IP
操作系统
系统调用
网络管理
网络收发流程
网络包接收
网络包发送
套接字
Socket I/O
阻塞式 I/O
非阻塞式 I/O
I/O 多路复用
select
poll
epoll
水平触发
边缘触发
信号驱动式 I/O
异步 I/O
网络模型
OSI 七层
TCP/IP 四层
应用层:向用户提供应用程序(HTTP、FTP、DNS)
传输层:端到端的通信(TCP、UDP)
网络层:网络包的封装、寻址和路由(IP、ICMP)
网络接口层:网络包在物理网络中的传输
性能优化
性能指标
网络配置
套接字信息
协议栈信息
网络质量统计信息
性能测试
基准测试
转发性能
TCP/UDP 性能
HTTP 性能
应用负载性能
应用层优化
I/O 模型优化
使用 I/O 多路复用 epoll 取代 select 和 poll
使用异步 I/O(比较复杂)
工作模型优化
主进程(管理网络连接)+ 多个 worker 子进程(实际的业务处理)
监听多个相同端口的多进程模型
协议优化
使用长连接取代短连接
合理利用使用内存缓存
使用序列化和压缩
使用 DNS 缓存、预取、HTTPDNS 等优化 DNS
套接字层优化
调整缓冲区
增大套接字的缓冲区 net.core.optmem_max
增大套接字接收缓冲区 net.core.rmem_max 和发送缓冲区 net.core.wmem_max
增大 TCP 接收缓冲区 net.ipv4.tcp_rmem 和发送缓冲区 net.ipv4.tcp_wmem
修改网络连接行为
为 TCP 连接设置 TCP_NODELAY 可禁用 Nagle 算法
为 TCP 连接开启 TCP_CORK 可让小包聚合成大包后再发送(会阻塞小包发送)
使用 SO_SNDBUF 和 SO_RCVBUF 分别调整套接字发送缓冲区和接收缓冲区大小
传输层优化
TCP
TIME_WAIT 状态优化
使用 TCP 长连接代替短连接
增大处于 TIME_WAIT 状态的连接数量 net.ipv4.tcp_max_tw_buckets
开启端口复用 net.ipv4.tcp_tw_reuse,被 TIME_WAIT 状态占用的端口还能用到新连接中
减小 TIME_WAIT 时间 net.ipv4.tcp_fin_timeout 和 net.netfilter.nf_conntrack_tcp_timeout_time_wait
增大连接跟踪表的大小 net.netfilter.nf_conntrack_max
增大本地端口的范围 net.ipv4.ip_local_port_range 以支持更多连接、提高整体并发
增加最大文件描述符数量
使用 fs.nr_open 和 fs.file-max 分别增大进程和系统的最大文件描述符数
在应用程序的 systemd 配置中设置应用程序的最大文件描述符数 LimitNOFILE
用户可打开文件的最大数目 ulimit -n 和 /etc/security/limits.conf nofile
用户可开启进程/线程的最大数目 ulimit -u 和 /etc/security/limits.conf noproc
高负载场景、缓解 SYN FLOOD
二选其一
增大 TCP 半连接最大数量 net.ipv4.tcp_max_syn_backlog
开启 TCP SYN Cookies net.ipv4.tcp_syncookies 绕开半连接数量限制
减少 SYN_RECV 状态连接重传 SYN+ACK 包次数 net.ipv4.tcp_synack_retries
调整客户端主动建立连接时 SYN 重发次数 net.ipv4.tcp_syn_retries
客户端应用层延长 connect 超时时间
增大本地端口的范围 net.ipv4.ip_local_port_range 以支持更多连接、提高整体并发
Keepalive 优化
缩短最后一次数据包到 Keepalive 探测包的间隔时间 net.ipv4.tcp_keepalive_time
缩短发送 Keepalive 探测包的间隔时间 net.ipv4.tcp_keepalive_intvl
减少 Keepalive 探测失败后,一直到通知应用程序前的重试次数 net.ipv4.tcp_keepalive_probes
TFO 提高三次握手性能
开启 TFO 功能 net.ipv4.tcp_fastopen
UDP
增大套接字缓冲区大小以及 UDP 缓冲区范围
增大本地端口号的范围
根据 MTU 大小调整 UDP 数据包大小,减少或避免分片
网络层优化
路由与转发
在需要转发的服务器中(网关),开启 IP 转发,即设置 net.ipv4.ip_forward = 1
调整数据包的生存周期 TTL,比如设置 net.ipv4.ip_default_ttl = 64
开启数据包的反向地址校验,比如设置 net.ipv4.conf.eth0.rp_filter = 1
数据分片
调整 MTU 大小
ICMP
禁止 ICMP 协议,即设置 net.ipv4.icmp_echo_ignore_all = 1
禁止广播 ICMP,即设置 net.ipv4.icmp_echo_ignore_broadcasts = 1
链路层优化
优化中断调度方案
为网卡硬中断配置 CPU 亲和性(smp_affinity),或开启 irqbalance 服务
开启 RPS(Receive Packet Steering)和 RFS(Receive Flow Steering)
在内核中通过软件处理的功能转移到网卡中
TSO(TCP Segmentation Offload)和 UFO(UDP Fragmentation Offload)
GSO(Generic Segmentation Offload)
LRO(Large Receive Offload)
GRO(Generic Receive Offload)
RSS(Receive Side Scaling)
VXLAN 卸载:让网卡完成 VXLAN 的组包功能
优化网络接口:可提升网络吞吐量
开启网络接口的多队列功能,每个队列可以用不同的中断号调度到不同 CPU 上执行,从而提升网络的吞吐量
增大网络接口的缓冲区大小以及队列长度等,提升网络传输的吞吐量(可能导致延迟增大)
使用 Traffic Control 工具为不同网络流量配置 QoS
绕过内核协议栈
DPDK
XDP
进程管理
同步与通信
进程同步
临界区
同步与互斥
信号量
生产者消费者问题
哲学家就餐问题
管程
生产者消费者问题
进程通信
管道
具名管道
消息队列
信号量
共享存储
套接字
死锁问题
必要条件
处理方法
鸵鸟策略
死锁检测与恢复
死锁预防
死锁避免
进程调度
上下文(Context)
进程上下文切换
内核态与用户态
切换流程
与系统调用的区别
切换成本
TLB
切换时机
进程执行终了
进程被公平分配时间片
系统资源不足,进程挂起
进程 sleep 主动挂起
高优先级进程抢先执行
线程上下文切换
中断上下文切换
内核态工作
更高的优先级
调度算法
批处理系统
先来先服务
短作业优先
最短剩余时间优先
交互式系统
时间片轮转
优先级调度
多级反馈队列
实时系统
中断(Interrupt)
硬中断
软中断
中断分类
外中断
陷入
异常
异常进程
不可中断进程(D)
僵尸进程(Z)
处理方法
孤儿进程
CPU 管理
平均负载(Load Average)
进程状态
可运行:正在使用或等待 CPU
不可中断:处于内核态关键流程中、不可打断
使用率(Usage)
与平均负载的关系
节拍率
缓存命中率
性能优化
系统优化
CPU 绑定:可提高 CPU 缓存的命中率,减少跨 CPU 调度带来的上下文切换问题
CPU 独占:进一步将 CPU 分组,通过 CPU 亲和性机制为其分配进程
适当降低非核心应用的优先级,增高核心应用的优先级,可确保核心应用得到优先处理
使用 Linux cgroups 设置进程 CPU 使用上限,可防止由于某个应用自身的问题而耗尽系统资源
支持 NUMA 的处理器会被划分为多个 node,每个 node 都有自己的本地内存空间
开启 irqbalance 服务或者配置 smp_affinity,把中断处理过程自动负载均衡到多个 CPU 上
用户可打开文件的最大数目 ulimit -n 和 /etc/security/limits.conf nofile
用户可开启进程/线程的最大数目 ulimit -u 和 /etc/security/limits.conf noproc
监控方法
iowait 分析
平均负载
压力测试
使用率
统计信息
上下文切换
问题排查
上下文切换过多
自愿切换过多:进程在等待资源,可能发生 I/O 问题
非自愿切换过多:进程在被强制调度、争抢 CPU,CPU 成为瓶颈
中断次数变多:说明 CPU 被中断处理程序占用,应分析中断类型
使用率过高
用户 CPU 和 Nice CPU 高:用户态进程占用了较多 CPU,着重排查进程性能问题
系统 CPU 高:内核态占用了较多 CPU,着重排查内核线程或系统调用的性能问题
I/O 等待 CPU 高:等待 I/O 的时间比较长,着排查系统存储是否出现 I/O 问题
软中断和硬中断高:软中断或硬中断处理程序占用较多 CPU,着重排查内核中断服务程序
不断重启的进程:同名进程 pid 不断改变
软中断过多
内存管理
虚拟内存
内存映射
缺页异常
转移后备缓冲区(TLB)
内存布局
只读段:包括代码和常量等
数据段:包括全局变量等
堆:包括动态分配的内存,从低地址开始向上增长
文件映射段:动态分配,包括动态库、共享内存等,从高地址开始向下增长
栈:包括局部变量,函数调用上下文等(大小一般固定 8MB)
内存分配
小块内存:brk
大块内存:mmap
内存碎片
内部碎片:slab 分配器
外部碎片:伙伴系统
内存泄漏
内存回收
回收时机
直接回收
定期回收
回收策略
手动回收
free() 或 unmap()
自动回收
基于淘汰算法:LRU、Second Chance 等
不常用的内存通过交换分换出到磁盘
基于 zproject 的内存压缩
基于 oom_score 为进程评分,高分 OOM 杀死
交换空间
文件页(File-backed Page):经系统释放后可回收的内存,包括缓存和缓冲区
匿名页(Anonymous Page):诸如应用程序动态分配的堆内存,不能被直接回收
Swap 原理
换入:把进程暂时不用的内存数据存储到磁盘中,并释放内存
换出:在进程再次访问这些内存时,从磁盘读到内存
NUMA 架构
分页系统地址映射
页面置换算法
最佳(OPT)
最近最久未使用(LRU)
最近未使用(NRU)
先进先出(FIFO)
第二次机会
时钟(Clock)
分段管理
段页式
与分页比较
Buffer 与 Cache
Buffer:磁盘数据缓存
Cache:文件系统数据缓存
SRealaimable
性能优化
系统优化
禁止 Swap,如果必须开启 Swap 则降低 swappiness 的值,减少内存回收时 Swap 的使用倾向
减少内存的动态分配,比如使用内存池、大页(HugePage)等
尽量使用缓存和缓冲区来访问数据
使用 cgroups 等方式限制进程内存使用情况
通过 /proc/pid/oom_adj,调整核心应用的 oom_score
缓存优化
命中分析
监控方法
监控方法
Swap
内存泄漏
读写分析
写操作
读操作
文件系统
索引节点和目录项
关于删除文件
文件系统与磁盘
I/O 方式
文件 I/O:I/O 请求首先经过文件系统,由文件系统与磁盘交互
块设备 I/O:跳过文件系统、直接与磁盘交互,即裸 I/O
读写原理
虚拟文件系统(VFS)
磁盘文件系统
内存文件系统
网络文件系统
Page Cache
I/O 方式
直接与非直接 I/O
直接 I/O:跳过操作系统页缓存,直接与文件系统交互访问文件
非直接 I/O:文件读写时经过系统页缓存,再由内核或额外的系统调用真正写入磁盘
零拷贝(Zero Copy)
实现方式
mmap+write:利用虚拟内存映射到用户空间
sendfile:直接从磁盘读取到内核、发送到网卡
无需关心 Socket 缓冲区大小
利用 Page Cache
无法对数据进行预处理
传输大文件效率低
阻塞与非阻塞 I/O
阻塞 I/O:执行 I/O 操作后如没有获得响应就会阻塞当前线程,不能执行其他任务
非阻塞 I/O:执行 I/O 操作后不会阻塞当前的线程,随后再通过轮询或者事件通知的形式获取调用结果
同步与异步 I/O
同步 I/O:发起 I/O 操作后要等到整个 I/O 完成后,才能获得 I/O 响应
异步 I/O:发起 I/O 操作后不等待完成,I/O 完成后响应由内核以事件通知应用程序
缓冲与非缓冲 I/O
缓冲 I/O:利用标准库缓存加速文件访问,标准库内部再通过系统调度访问文件
非缓冲 I/O:直接通过系统调用来访问文件,不经过标准库缓存
性能优化
磁盘
性能指标
监控方法
优化方向
优化文件访问:使用页缓存、索引节点缓存、目录项缓存等减少对下层块设备的直接调用
优化块设备访问:使用缓冲区来缓存块设备的数据
文件系统
监控方法
优化方向
选择合适的文件系统
优化文件系统配置选项
优化缓存
优化 pdflush 脏页的刷新频率
优化脏页限额
优化内核回收目录项缓存和索引节点缓存的倾向
设备管理
磁盘(Disk)
存储介质
机械硬盘(Hard Disk Driver,HDD)
盘面(Platter)
磁道(Track)
扇区(Track Sector)
磁头(Head)
制动手臂(Actuator arm)
主轴(Spindle)
固态硬盘(Solid State Disk,SSD)
接口
架构
I/O 栈
文件系统层
通用块层
I/O 调度算法
NONE
NOOP
CFQ
Deadline
设备层
调度算法
先来先服务
最短寻道时间优先
电梯算法
0 条评论
下一页