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