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

您所在的位置:网站首页 硬盘分区流程 磁盘读写流程和网络读写流程

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

2024-06-15 10:22| 来源: 网络整理| 查看: 265

一 页缓存(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头后,根据四元组作为标识,找到对应的socket



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3