compute-base
2022-02-22 17:37:33 0 举报
AI智能生成
计算机基础
作者其他创作
大纲/内容
基础篇
组成原理
① 计算机组成原理
基本硬件组成
主板
芯片组
北桥芯片
系统总线
南桥芯片
IO总线 PCI总线
CPU总线
CPU
功能
提取
主存里提取指令
解码
执行
功能组成
寄存器
控制器
运算器
时钟
内存(主存)
程序和CPU沟通的桥梁
随机存储器(RAM)
只读存储器(ROM)
高速缓存
磁盘缓存-----实际是内存空间
硬盘
程序安装在硬盘上
虚拟内存----实际上是硬盘上的存储空间
显卡
GPU 图形处理器
IO设备
显示器
鼠标+键盘
与CPU交互方式
直接
DMA----直接内存访问
通道----特殊功能的处理器
② 体系
冯诺依曼体系
基本原则
二进制
程序存储
顺序执行
组成部分
运算器
控制器
存储器
输入设备
输出设备
哈佛体系
③ 指令
CPU指令
控制单元---从内存中提取指令并解码执行
指令寄存器
算术逻辑单元(ALU)---处理算数和逻辑运算
数据单元(从内存中拿数据放入里面)
数据寄存器
④ 二进制
⑤ 链接
静态链接
动态链接
网络
基础篇
OSI(Open System Interconnect)标准模型
7 应用层
电子邮件
远程登录
文件传输
6 表示层
转换
加密
压缩
5 会话层
4 传输层
3 网络层
地址管理
路由选择
2 数据链路层
1 物理层
TCP/IP 网络模型
5 应用层
4 传输层
TCP协议
UDP协议
3 网络层
IP协议
网络号
主机号
2 数据链路层
1 物理层
物理媒介
双铜绞线
同轴电缆
光纤
陆地⽆线电信道
卫星⽆线电信道
HTTP
应用层
请求响应的过程
DNS服务器解析域名
HTTP客户端在80端口发起一个到服务器的TCP连接
HTTP 客户端通过它的套接字向服务器发送⼀个 HTTP 请求报⽂
HTTP 服务器通过它的套接字接收该报⽂,进⾏请求的解析⼯作,并从其 存储器(RAM 或磁盘) 中检索出对象www.someSchool.edu/someDepartment/home.index,然后把检索出来的对象进⾏封装,封装到 HTTP响应报⽂中,并通过套接字向客户进⾏发送。
HTTP 服务器随即通知 TCP 断开 TCP 连接,实际上是需要等到客户接受完响应报⽂后才会断开 TCP 连接。
HTTP 客户端接受完响应报⽂后,TCP 连接会关闭。客户端会从报⽂中提取响应⽂件,并检查该 HTML ⽂件,然后循环检查报⽂中其他内部对象。
检查完成后,HTTP 客户端会把对应的资源通过显示器呈现给⽤户。
连接类型
持久连接
非持久连接
报文格式
起始行
头部字段
消息正文
请求报文
请求行
请求方法,URL(包括参数信息),协议版本这些信息
GET /admin_ui/rdx/core/images/close.png HTTP/1.1
请求头部
key-value值
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
空行
请求报文用空行表示header和请求数据的分隔
请求数据
GET方法没有携带数据, POST方法会携带一个body
响应报文
状态行
HTTP版本号,状态码和状态值组成。
HTTP/1.1 200 OK
响应头
类似请求头,是一系列key-value值
Cache-Control: private
Content-Encoding: gzip
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
空行
响应体
响应的data,例如一段HTML
TCP
概念
面向连接
一定是「一对一」才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
可靠的
无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
字节流
消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃。
报文段
报文首部段(最大60字节)
固定首部(20byte)
原端口号(2byte)
目标端口号(2byte)
序列号(4byte)sequence number
初始值是随机数
大于2^32个序号后,下个序号返回到0
通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。
解决乱序问题
确认应答号(4byte)
下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收
若确认号为= N,则表明:到序号N-1为止的所有数据都已正确收到。
解决不丢包问题
数据偏移(4bits)
单位为4字节,它指出报文数据距TCP报头的起始处有多远(TCP报文头长度)
最小单位是4字节,也就是0001表示数据偏移了4字节,所以整个首部是4*15=60字节
保留(6bits)
保留今后使用,目前置0处理
控制位(6bits)
URG--紧急比特
当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
ACK--确认比特
只有当 ACK=1时确认号字段才有效。当 ACK=0 时,确认号无效
PSH--推送比特
接收方 TCP 收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付
RST--复位比特
当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
SYN--同步比特
同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。并在其「序列号」的字段进行序列号初始值的设定
FIN
终止比特
用来释放一个连接。当FIN=1 时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
窗口大小(2byte)
窗口字段用来控制对方发送的数据量,单位为字节
TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限
检验和(2byte)
检验和字段检验的范围包括首部和数据这两部分
在计算检验和时,要在TCP报文段的前面加上12字节的伪首部
紧急指针(2byte)
URG=1有意义
紧急指针指出在本报文段中的紧急数据的最后一个字节的序号
即使窗口为0时也可以发送紧急数据
可变首部
选项(长度可变)最大40字节
报文数据段
MSS(Maximum Segment Size)
TCP报文段长度 减去 TCP首部长度
三次握手-建立连接
初始状态
客户端处于Closed状态
服务端处于Listen状态
三次握手过程
第一次握手
客户端向服务端发送SYN报文,初始化自己的序列号
SYN=1,seq=x
客户端状态SYN_Send状态
在发送连接请求后等待匹配的连接请求
服务端接收报文
第二次握手
服务端收到SYN报文之后,会发送SYN报文作为应答(SYN=1),并且初始化自己的序列号seq=y
同时,把客户端的seq加上1,作为自己的确认号(ack),表明已经收到客户端发来的SYN报文。
希望收到下一次数据的第一个字节的序号是x+1 (客户端初始序列号+1)
服务端状态SYN_REVD状态
在收到和发送一个连接请求后等待对连接请求的确认
第三次握手
客户端接收到服务端响应的SYN报文之后,会发送ACK报文
把服务端初始化序列号加一作为ack的值,表明已经收到服务端的SYN报文
希望收到下一个数据的第一个字节的序号是y+1,指明客户端序列号是x+1。
客户端状态 Establised状态
服务端接收到ACK报文之后,也处于Establised
为什么要三次握手?
目的:双方确认自己与对方的发送和接受是正常的
第一次:客户端发SYN,服务端接收
客户端
什么也确认不了
服务端
确认:服务端接收正常,客户端发送正常
第二次:服务端响应报文,客户端接收
客户端
确认:客户端发送正常,客户端接收正常,服务端发送正常,接收正常
服务端
确认:服务端接收正常,客户端发送正常
第三次:客户端发送ACK报文
客户端
确认:客户端发送正常,客户端接收正常,服务端发送正常,接收正常
服务端
确认:服务端接收,发送正常,客户端发送,接收正常
半连接队列
SYN洪泛攻击
如果第三次握手丢失了,客户端服务端会如何处理
四次挥手-释放连接
第一次:客户端发送FIN=1,seq=x
此时客户端不再发送数据,只接收数据
第二次:服务端接收到客户端的FIN=1,然后发送ACK=1,ACKnum=x+1。客户端接收数据之后,等待服务端发送FIN请求。
第三次:服务端主动发起FIN=1,seq=y
第四次:客户端接收到后,发送ACK=1,ACKnum=y+1
服务端接收之后,处于CLOSED状态
必须要接收到报文,才能关闭连接
客户端经过2MSL之后关闭(MSL:报文最大生存时间)
为什么是四次握手?
TCP连接是双向的。两次握手会关闭一段到另一端的连接
流量控制(通过接受窗口来控制)
拥塞控制
慢启动
拥塞避免
快速恢复
重传机制
超时重传
快速重传
SACK(Selective Acknowledgment 选择性确认)
D—SACK(Duplicate SACK)
UDP
头部格式
源端口号16bits
目标端口号16bits
包长度16bits
该字段保存了 UDP 首部的长度跟数据的长度之和
校验和16bits
TCP与UDP比较
区别
连接
TCP 是面向连接的传输层协议,传输数据前先要建立连接
UDP 是不需要连接,即刻传输数据
服务对象
TCP 是一对一的两点服务,即一条连接只有两个端点。
UDP 支持一对一、一对多、多对多的交互通信
可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
UDP 是尽最大努力交付,不保证可靠交付数据。
拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
首部开销
TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。
UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
使用场景
TCP
FTP
HTTP,HTTPS
UDP
包较少的通信,DNS,SNMP
视频,音频等多媒体通信
广播通信
IP
IP地址分类
A类
0+网络号7位+主机号24位
0.0.0.0~127.255.255.255
B类
10+网络号14位+主机号16位
128.0.0.0~191.255.255.255
C类
110+网络号24位+主机号8位
192.0.0.0~223.255.255.255
D类
1110+组播地址28位
E类
11110+留待后用27位
分类优点
分类缺点
无分类地址CIDR
10.100.122.2/24
/24表示前24位是网络号
剩余8位是主机号
子网掩码
IP地址:10.100.122.2
子网掩码:255.255.255.0
将IP地址和子网掩码做AND运算
得到网络号:10.100.122.0
私有IP地址
A类
10.0.0.0~10.255.255.255
B类
172.16.0.0~172.31.255.255
C类
192.168.0.0~192.168.255.255
IP 地址与路由控制
IP分片和重组
IPv6
基本知识
相关技术
DNS
ARP
DHCP
NAT
内网IP转公网IP
普通
只能转换IP
NAPT
IP与地址一起转换
缺点
● 外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。
● 转换表的生产与转换操作都会产生性能开销。
● 通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
数据链路层
概述
MAC
MAC地址长度48bits
第1位:单播地址(0)/多播地址(1)
第2位:全局地址(0)/本地地址(1)
第3-24位:由IEEE管理并保证各厂家之间的不重复
第35-48位:由厂商管理并保证产品之间不重复
MAC报文
MAC头部
接受方MAC地址48位
发送方MAC地址48位
协议类型16位
0800:IP协议
0806:ARP协议
IP头部
TCP头部
HTTP头部
ARP协议
实现IP到MAC对的映射
只用于IPv4
工作机制
综合篇
数据传输过程
资料地址
https://www.yuque.com/books/share/227872c0-1f19-4c83-960e-5e13e39343c8/txd3u7
操作系统
概念
结构
内核
概念
能力
管理进程、线程,决定哪个进程、线程使用 CPU,也就是进程调度的能力
管理内存,决定内存的分配和回收,也就是内存管理的能力;
管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬件通信能力;
提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。
内核是怎么工作的?
内存
虚拟内存地址
我们程序所使用的内存地址
物理内存地址
实际存在硬件里面的空间地址
管理虚拟地址和物理地址的关系
内存分段
产生连续内存空间
也会产生内存碎片
效率低下
内存分页
linux下 每一页大小是4k
通过页表来映射
简单分页
占用内存大
多级分页
一级页面可以覆盖所有虚拟地址,二级页面等需要的时候再创建
页表缓存TLB(Translation Lookaside Buffer)
内存管理
逻辑地址
linux实际不生效,虽然intel CPU设计了段式映射
虚拟地址
内核空间
用户空间
● 程序文件段,包括二进制可执行代码;
● 已初始化数据段,包括静态常量;
● 未初始化数据段,包括未初始化的静态变量;
● 堆段,包括动态分配的内存,从低地址开始向上增长;
● 文件映射段,包括动态库、共享内存等,从低地址开始向上增长(跟硬件和内核版本有关)
● 栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;
进程和线程
线程是调度的基本单位,而进程则是资源拥有的基本单位。
进程
概念
并行
伪并行
真并行
串行
状态
五状态模型
创建状态
就绪状态
阻塞状态
运行状态
结束状态
七状态模型
创建状态
就绪状态
就绪挂起状态
阻塞挂起状态
运行状态
阻塞状态
结束状态
描述进程(PCB)
进程存在的唯一标识
包含信息
进程管理
存储管理
文件管理
如何组织
链表
索引
进程切换
1.保存处理器上下文环境:将CPU程序计数器和寄存器的值保存到当前进程的私有堆栈里
2.更新当前进程的PCB(包括状态更变)
3.将当前进程移到就绪队列或者阻塞队列
4.根据调度算法,选择就绪队列中一个合适的新进程,将其更改为运行态
5.更新内存管理的数据结构
6.新进程内对堆栈所保存的上下文信息载入到CPU的寄存器和程序计数器,占有CPU
上下文切换场景
● 为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其它正在等待 CPU 的进程运行;
● 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行;
● 当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度;
● 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行;
● 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序;
线程
CPU调度的基本单位
上下文切换
属于同一进程
虚拟内存等资源不变
私有数据、寄存器需要切换
不属于同一进程
切换等同于进程切换
进程调度
什么时候调度进程
● 从就绪态 -> 运行态:当进程被创建时,会进入到就绪队列,操作系统会从就绪队列选择一个进程运行;
● 从运行态 -> 阻塞态:当进程发生 I/O 事件而阻塞时,操作系统必须另外一个进程运行;
● 从运行态 -> 结束态:当进程退出结束后,操作系统得从就绪队列选择另外一个进程运行;
调度算法
非抢占式调度算法
● 先来先服服务
● 最短作业优先
● 最短剩余时间优先
抢占式调度算法
● 时间片轮转
● 优先级调度
● 多级反馈队列调度
以什么原则调度进程
● CPU 利用率:调度程序应确保 CPU 是始终匆忙的状态,这可提高 CPU 的利用率;
● 系统吞吐量:吞吐量表示的是单位时间内 CPU 完成进程的数量,长作业的进程会占用较长的 CPU 资源,因此会降低吞吐量,相反,短作业的进程会提升系统吞吐量;
● 周转时间:周转时间是进程运行和阻塞时间总和,一个进程的周转时间越小越好;
● 等待时间:这个等待时间不是阻塞状态的时间,而是进程处于就绪队列的时间,等待的时间越长,用户越不满意;
● 响应时间:用户提交请求到系统第一次产生响应所花费的时间,在交互式系统中,响应时间是衡量调度算法好坏的主要标准。
说白了,这么多调度原则,目的就是要使得进程要「快」。
进程间通信
通信渠道
通过内核
通信目的
共享数据
数据传输
消息通知
进程控制
通信方式
共享内存
零拷贝
管道
消息队列
涉及用户态和内核态切换
信号量
初始值是1,表示进程互斥访问
初始值是0.表示进程可以顺序访问
信号
异步通信机制
查看命令(kill -l)
套接字
文件系统
设备管理
网络系统
网络协议
零拷贝
没有零拷贝情况
CPU 发出对应的指令给磁盘控制器,然后返回
磁盘控制器收到指令后,于是就开始准备数据,会把数据放入到磁盘控制器的内部缓冲区中,然后产生一个中断
CPU 收到中断信号后,停下手头的工作,接着把磁盘控制器的缓冲区的数据一次一个字节地读进自己的寄存器,然后再把寄存器里的数据写入到内存,而在数据传输的期间 CPU 是无法执行其他任务的。
传统I/O过程
用户进程调用read()函数,用户态切换到内核态
CPU对磁盘发起IO请求
磁盘将数据磁盘控制器缓冲区
磁盘对CPU发起IO中断信号
CPU将数据从磁盘控制器缓冲区COPY到PageCache
CPU再将数据从PageCache拷贝到用户缓冲区
read()调用返回 内核态切换到用户态
引入DMA技术
CPU直接控制DMA,由DMA来控制磁盘操作
过程
● 用户进程调用 read 方法,向操作系统发出 I/O 请求,请求读取数据到自己的内存缓冲区中,进程进入阻塞状态;
● 操作系统收到请求后,进一步将 I/O 请求发送 DMA,然后让 CPU 执行其他任务;
● DMA 进一步将 I/O 请求发送给磁盘;
● 磁盘收到 DMA 的 I/O 请求,把数据从磁盘读取到磁盘控制器的缓冲区中,当磁盘控制器的缓冲区被读满后,向 DMA 发起中断信号,告知自己缓冲区已满;
● DMA 收到磁盘的信号,将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中,此时不占用 CPU,CPU 可以执行其他任务;
● 当 DMA 读取了足够多的数据,就会发送中断信号给 CPU;
● CPU 收到 DMA 的信号,知道数据已经准备好,于是将数据从内核拷贝到用户空间,系统调用返回;
优化文件传输的性能
减少 上下文切换
减少 数据拷贝
方式
mmap+write
过程
● 应用进程调用了 mmap() 后,DMA 会把磁盘的数据拷贝到内核的缓冲区里。接着,应用进程跟操作系统内核「共享」这个缓冲区;
● 应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中,这一切都发生在内核态,由 CPU 来搬运数据;
● 最后,把内核的 socket 缓冲区里的数据,拷贝到网卡的缓冲区里,这个过程是由 DMA 搬运的。
sendfile
替代前面的 read() 和 write() 这两个系统调用
可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里
最终解决方案
需要网卡支持SG-DMA技术
ethtool -k eth0 | grep scatter-gather
scatter-gather: on
过程
● 第一步,通过 DMA 将磁盘上的数据拷贝到内核缓冲区里;
● 第二步,缓冲区描述符和数据长度传到 socket 缓冲区,这样网卡的 SG-DMA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里,此过程不需要将数据从操作系统内核缓冲区拷贝到 socket 缓冲区中,这样就减少了一次数据拷贝;
PageCache
磁盘高速缓存,就是内核缓冲区
将磁盘数据拷贝到内存的原则
程序运行的时候,具有「局部性」,所以通常,刚被访问的数据在短时间内再次被访问的概率很高,于是我们可以用 PageCache 来缓存最近被访问的数据,当空间不足时淘汰最久未被访问的缓存
预读功能
优点
缓存最近被访问的数据
预读功能
针对大文件,不建议使用
异步 I/O + 直接 I/O
绕开 PageCache 的 I/O 叫直接 I/O,使用 PageCache 的 I/O 则叫缓存 I/O。
总结
大文件
异步 I/O + 直接 I/O
小文件
零拷贝技术
Nginx配置
0 条评论
下一页