一 页缓存(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

磁盘读写流程和网络读写流程相关推荐

  1. Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程

    Android的WiFi 我们通常看到WiFi的守护进程wpa_supplicant在我们的ps的进程列表中,这个就是我们的wifi守护进程.wpa_supplicant在external/wpa_s ...

  2. Apache Pulsar的数据写入和读取流程,及读写异常处理流程

    目录 1. 数据写入流程 2. 数据读取流程 3. 读写异常处理流程 1. 数据写入流程 说明: 写入操作客户端只和broker交互, 不和zookeeper和bookkeeper交互 客户端通过pr ...

  3. ATECC508A芯片开发笔记(九):加密读写508芯片数据的流程及相应设置

    目录 ATECC508A芯片开发笔记(九):加密读写508芯片数据的流程及相应设置 1.Encrypted Read 1.1 Standard Encrypted Read Flow 1.2 Simp ...

  4. idm 爬取网站 跳转路径_儋州网站案例基本流程,电子元件网络推广,浅析

    首页 > 新闻列表 > 正文 作者:佚名 点击数: 7更新时间:2020-11-06 11:19:34 导读:北京佐助信息科技有限公司为您提供儋州网站案例基本流程,电子元件网络推广的相关知 ...

  5. step5 . day2 网络编程 基于TPC协议的网络编程流程及API

    基于TCP协议的网络编程流程 服务器端: 1) socket(),创建套接字文件,用于连接 2) bind(), 绑定,把socket()函数返回的文件描述符和IP.端口号进行绑定; 3) liste ...

  6. Retrofit2源码解析——网络调用流程(下)

    Retrofit2源码解析系列 Retrofit2源码解析(一) Retrofit2源码解析--网络调用流程(上) 本文基于Retrofit2的2.4.0版本 implementation 'com. ...

  7. MFC socket网络编程(流程示例)

    MFC socket网络编程(流程示例) 1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK! 服务器端程序: 1.加 ...

  8. 4G网络数据传输流程 三

    原文:微信公众号 Wisdom365 摘要:这是4G网络数据传输流程系列的第三课,上一课讲了资源调度,备好粮草,这一课我们集结兵马,趟一趟物理层处理流程.先讲从传输块TB到码字(CW,Code Wor ...

  9. abb机器人负载配置设定_ABB机器人配置Profinet网络配置流程.pdf

    ABB机器人配置Profinet网络配置流程 PN 网网络配置置流程 1.NetName++软件分配从从站地址以以及站点名称称 ①电脑连连接至X208 交换机: ②打开NetName+,点点击Refr ...

最新文章

  1. 《生命是什么》读书笔记
  2. Linux 用户管理命令id、su
  3. C#在类型实例化时都干了什么:从一道笔试题说开去
  4. linux oracle 删除为空的dbf,Linux上Oracle误删除一个没有用的dbf表空间文件
  5. 支付宝相关信息会被泄露出去吗?
  6. opengl矩阵变换与平移缩放旋转
  7. 01数据结构——绪论
  8. 电商金额计算的 4 个坑,千万注意了!
  9. 一次登录,终身免费:GitHub宣布向所有人免费开放所有核心功能
  10. 去年北京居民服务消费快速增长 占消费支出半壁江山
  11. Gradle下载安装 使用本地Maven仓库 IDEA2020.1配置Gradle
  12. 三、静息状态的神经元外膜
  13. 2022 SpeechHome 语音技术研讨会-回顾
  14. LCP 22. 黑白方格画(排列组合)
  15. Python for循环嵌套用法
  16. [bbk5148] 第51集 - 第五章 管理内存 06
  17. 宝塔Linux面板——用正确的入口登录面板
  18. GO工具开发|基于网站API的子域名与IP反查工具(二)
  19. 牛逼,前阿里 P7 技术专家!
  20. 百度快照更新是什么意思?

热门文章

  1. qlv视频转换器免费版_迅捷视频转换器无法转换腾讯视频怎么办?亲测操作快速转换...
  2. linux下备份mysql日志_Linux下使用Logrotate对MySQL日志进行轮转备份
  3. 数据科学入门与实战:玩转pandas之三
  4. html中js定义的方法无效,javascript中定义函数有几种常用方法?
  5. mysql myisam写入性能_(转)innodb 与 myisam 读写性能分析
  6. python使用HDF文件格式,保存多个类型的数据到一个文件
  7. android smb 图片,谷歌放出安卓版Samba客户端 但仅支持SMBv1
  8. java读取打包时间_Java获取响应的日期时间,这样写是否合理?
  9. mysql报tns无监听_oracle提示TNS:无监听程序的解决办法
  10. android 4.4 keyfactory.getinstance 报错_Android实际开发bug大总结