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