离异带葫芦娃
Java后端
·2022-08-06
路过的大佬解解惑 为什么io就慢?为什么要减少io次数? 下面是我的理解: io分为两个阶段: 1.io调用(就是系统调用,系统调用又分为用户态到内核态,内核态到用户态) 涉及到系统调用,系统调用就会有中断操作,中断会有保存现场--->等待调用----->恢复现场 ①.执行系统调用时,首先会保存现场,然后通过系统调用到内核态执行,最后内核态变为用户态,执行用户程序时,需要恢复用户态的现场。 在进入内核时需要保存用户态的寄存器,在内核态返回用户态时恢复寄存器的内容 ②.每个线程都有两个栈,用户栈和内核栈,执行系统调用时,线程就会由用户栈切换到内核栈,而内核代码对用户不信任,需要进行额外的检查 2.io执行(分为两个阶段) ①.数据就绪,将数据拷贝至内核态缓冲区 这里可能理解的有问题 ---------- 数据从哪来?如何寻找数据在磁盘上的地址?磁盘寻道? 第一:先检查缓存,缓存有就拷贝到用户空间,没有需要从磁盘加载数据到缓存 第二:cpu提供磁盘主存地址、要读取的数据长度 第三:磁盘控制器准备数据,并放入数据缓冲区 第四:申请总线、内存使用权,将缓冲区数据拷贝到主存 第五:后续处理 ----------- 磁盘:磁盘分为磁头、柱面、磁道、扇区、扇面.... (读写)花费时间:寻道时间(磁头移动到目的磁道) 旋转延迟时间(磁头定位到所在扇区) 传输时间(传输数据所花费的时间) ②.将内核态缓冲区数据再拷贝至用户态缓冲区 慢的地方:系统调用耗时,磁盘寻找数据耗时(寻址、寻道、传输),申请总线什么的也需要时间
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP