磁盘读写流程和网络读写流程

一 页缓存(page cache) 和 套接字缓冲区(socket buffer)

1.1 页缓存(page cache)

1.1.1 什么是页缓存? 为什么需要页缓存?

当应用程序要读取磁盘上的文件的时候,首先需要CPU将磁盘上的文件内容拷贝到主存中,然后我们再从主存中读取文件内容。但是,我们知道从磁盘属于慢速设备,主存属于高速设备,从磁盘传输数据到主存是比较慢的,所以为了均衡这种速度差,就有了类似于CPU 高速缓存一样的东西,叫做页缓存。
页缓存,它是利用主存的空闲部分来缓存一些数据块的,也就是页缓存中的页面,我们就把这部分缓存磁盘文件的空闲的主存叫做页缓存。

1.1.2 页缓存的简单工作流程

当应用程序读取文件内容的时候, 首先会从页缓存中查找有无数据,如果有直接返回;如果没有,表示缺页,会触发一个缺页中断,然后需要从磁盘上加载,再放入页缓存。

1.1.3 页缓存的写机制或者写触发的时机

当页缓存页面有脏数据的时候,什么时候这些数据被写入磁盘呢? 第一:当应用程序调用刷盘的系统调用的时候,比如fsync, fdatasync, sync等则会将脏页写回磁盘;第二:操作系统有一个后台线程,每间隔一定的时间就会将页缓存中的脏数据写入磁盘

注意:
页缓存和主存的关系: 页缓存属于主存的一部分,只不过是主存空闲的部分

1.2 套接字缓冲区(socket buffer)

1.2.1 什么是套接字缓冲区,为什么需要套字节缓冲区

我们向网络发送数据,需要对数据添加首部信息,而且还需要把数据拷贝到网卡上,然后由网卡写出。如果写的太频繁,则会需要频繁的发送中断请求和CPU频繁的将数据拷贝到网卡。所以,为了提升写的性能,引出了套接字缓冲区。

套接字缓冲区:是操作系统在主存上开辟的一块空间,主要用于缓冲要写入网络的数据。

1.2.2 套接字缓冲区的简单流程

套接字缓冲区等待被写满,然后向CPU发出中断请求,执行中断处理程序,通知网卡驱动程序有数据发送,然后由驱动程序从套接字缓冲队列获取读取数据,拷贝到网卡的缓冲队列,然后由网卡写出到网络。

二 磁盘数据读写流程(DMA)

2.1 将数据写入磁盘的流程

第一:用户程序将数据写入用户空间的缓冲区,然后调用write系统调用
第二:CPU进入内核态,将数据写入拷贝到页缓存,写入成功,立即返回
第三:用户进程调用系统调用fsync、fdatasync、sync等将页缓存中的脏页刷到磁盘;如果用户没有调用,操作系统后台线程也会间隔一段时间就刷盘。
第四:CPU执行刷盘指令,会向磁盘控制器(DMA模式)发送写指令,告诉磁盘控制器要刷盘的数据在主存的位置、要刷盘多少数据、要刷到磁盘什么位置等,然后返回干其他事情了
第五:DMA引擎向CPU发送DMA请求,申请控制总线和主存,申请成功后,开始从主存页缓存中将数据写入到磁盘。写完了之后,字计数器溢出,中断机构会向CPU发出中断请求,CPU收到中断请求后,开始处理中断程序,进行一些扫尾的工作,然后结束。

2.2 从磁盘读取数据的流程

第一:用户程序调用read系统调用
第二:CPU进入内核态,操作系统会检查页缓存是否有数据。如果有CPU拷贝这些数据到用户空间;如果没有则触发缺页中断,需要向磁盘调页,即从磁盘加载数据到页缓存
第三:CPU向磁盘控制器发送读指令,并且告诉磁盘主存地址、要读取的数据长度、要从哪一个设备读,然后返回干其他事情了
第四:磁盘控制器开始准备数据,磁盘数据准备好则放入数据缓冲区,并且通知DMA引擎。
第五:DMA引擎向CPU发送DMA请求,申请获取总线和主存的使用权,申请成功后,开始将缓冲区寄存器的数据拷贝到主存
第六:完成数据传输后,磁盘控制器中的中断机构向CPU发送中断信号,触发中断处理程序,进行扫尾工作
第七:页缓存把数据返回给用户进程(取决于I/O模式,如果是同步读,则需要线程同步等待数据准备好)

三 网络数据读写流程

3.1 将数据写入网络的流程

在这里插入图片描述

第一:用户程序调用套接字API,比如write或者send系统调用
第二:CPU进入内核态,此时会将数据拷贝到套接字缓冲区
第三:协议栈处理套接字缓冲区的数据,但并不是立即发送
不立即发送的原因就是,每次写的数据大小是由应用程序决定,如果每次要发送的数据太少,就会发送大量的小数据包,不立即发送的原因就是,每次写的数据大小是由应用程序决定,如果每次要发送的数据太少,就会发送大量的小数据包,
导致网路效率下降,所以需要积累到一定数量再发送出去。一般来说是根据MTU来决定,以太网中MTU一般是1500字节,如果(数据包大小+40(数据帧的首部长度)) > MTU,则会分片,然后满了再发送出去;到那时如果没有满,难道一直等到数据包满了才可以发送吗,协议栈内部有一个计时器,到期了也会将数据发送出去
第四:需要发送数据包的时候,协议栈会产生一个软中断,触发CPU中断处理程序,告诉网卡驱动程序有新的网络包需要发送
第五:网卡驱动程序会从套接字缓冲区读取要发送的数据包,通过DMA拷贝到网络接口控制器(网卡)的数据缓冲区
第六:等待网卡的数据缓冲区写满了之后,就会把数据发送出去

3.2 从网络读取数据的流程

在这里插入图片描述

第一: 网卡收到网络数据包,放入数据缓冲区
第二: 数据缓冲区满了,则通知DMA引擎
第三: DMA引擎向CPU申请总线和主存的使用权,将缓冲区数据拷贝到主存的套接字缓冲区
第四: 当拷贝完成后,操作系统怎么知道有数据包到来?所以需要一种机制通知操作系统。最简单方式就是触发中断,但是如果数据量很大,可能就会频繁触发中断,导致CPU没有时间执行其他的程序,从而影响系统性能。Linux 2.6引入了New API机制,综合中断和轮询的方式来接收网络数据包:第一次通过中断触发中断服务处理程序,然后唤醒软中断采用轮询方式来轮询数据,直到没有数据时才恢复中断,这样一次中断可以处理多个数据包,降低网卡中断带来的性能消耗。

第五:网络控制器(网卡)的中断机构向CPU发出中断请求,CPU会执行内核中网卡驱动程序的处理逻辑:
#1 禁用网卡中断:避免后续数据处理频繁的向CPU发起中断
#2 打开软中断:有可能后续的中断服务处理程序执行时间长,会影响CPU执行其他的进程或者中断请求,所以使用软中断,主要通过轮询的方式获取数据并处理数据
第六:软中断交给协议栈进行处理,协议栈对数据包进行拆包,并且将等待队列中的处于等待的线程加入到就绪队列,等待被CPU再次调度
#1 链路层识别上册协议(IPV4 or IPV6),去掉帧头和帧尾,然后交给网络层
#2 网络层取出IP头,判断网络包目标主机,如果不是当前主机,则转发;如果是去掉IP头,然后交给传输层
#3 取出TCP或者UDP头后,根据<源IP、源端口、目标IP、目标端口>四元组作为标识,找到对应的socket

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
HDFS(Hadoop Distributed File System)是Hadoop生态系统中的一部分,它是一个可伸缩的分布式文件系统,可以在大型集群中存储和处理超大型数据集。下面是HDFS的读写流程和原理: 1. 写入流程 (1)客户端向NameNode请求写入文件,NameNode返回一个DataNode列表,客户端接收到后与DataNode进行数据通信。 (2)客户端将数据划分为一个个数据块,并与DataNode建立连接,将数据块写入DataNode。 (3)DataNode接收到数据块后,先将数据写入本地磁盘,然后将数据块复制到其他DataNode上,以实现数据备份。 (4)客户端在写入完数据后,向NameNode发送文件元数据,即文件名、数据块ID、数据块所在的DataNode等信息,NameNode将这些信息保存在内存中,并更新元数据信息。 2. 读流程 (1)客户端向NameNode请求读文件,NameNode返回一个DataNode列表和对应的数据块位置信息。 (2)客户端与DataNode建立连接,请求数据块,DataNode将数据块返回给客户端。 (3)客户端读完所有数据块后,将数据块组合成完整的文件。 HDFS的主要原理是数据分片和复制。HDFS将大文件划分为多个数据块,每个数据块默认大小为128MB,每个数据块会复制到多个DataNode上,以实现数据备份和容错。NameNode负责管理文件系统的元数据,包括文件名、文件目录、数据块位置等信息,而DataNode则负责数据块的存储和读写。这种分布式存储方式可以实现高可用性和高可靠性,并且可以通过增加DataNode数量来提高存储和读写性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值