如何打造一个符合山东网站制作团队个性的定制网站?
摘要:山东网站制作团队,个性定制网站,塘沽网红图书馆地址,网站手机端 怎么做1、在没有DMA技术之前的IO过程是这样的: CPU发出对应的指令给磁盘控制器,然后返回磁盘控制器收到指令后
山东网站制作团队,个性定制网站,塘沽网红图书馆地址,网站手机端 怎么做1、在没有DMA技术之前的I/O过程是这样的#xff1a;
CPU发出对应的指令给磁盘控制器#xff0c;然后返回磁盘控制器收到指令后#xff0c;于是就开始准备数据#xff0c;会把数据放入到磁盘控制器的内部缓冲区#xff0c;然后产生中断CPU收到中断信号后#xff0c;停下手…1、在没有DMA技术之前的I/O过程是这样的
CPU发出对应的指令给磁盘控制器然后返回磁盘控制器收到指令后于是就开始准备数据会把数据放入到磁盘控制器的内部缓冲区然后产生中断CPU收到中断信号后停下手头工作接着把磁盘控制器的缓冲区的数据一次一个字节地读进自己的寄存器。然后再把寄存器里的数据写入到内存而在数据传输的期间CPU是无法执行其他任务 的。 整个传输过程中都要CPU亲自参与搬运数据的过程而且这个过程CPU是不能做其他事情的。这会大大降低CPU的效率并且如果使用千兆网卡或者硬盘传输大量数据时都用CPU搬运的话肯定忙不过来
2、DMA技术
直接内存访问 Direct Memory Access 简单理解就是在进行I/O设备和内存的数据传输的时候数据搬运的工作全部交给DMA控制器而CPU不再参与任何与数据搬运相关的事情这样CPU就可以去处理其他的事务。 与磁盘的交互IO操作都交给了DMA控制器去做CPU得到解放
具体过程
⽤户进程调⽤ read ⽅法向操作系统发出 I/O 请求请求读取数据到⾃⼰的内存缓冲区中进程进⼊阻塞状态操作系统收到请求后进⼀步将 I/O 请求发送 DMA 然后让 CPU 执⾏其他任务DMA 进⼀步将 I/O 请求发送给磁盘磁盘收到 DMA 的 I/O 请求把数据从磁盘读取到磁盘控制器的缓冲区 中当磁盘控制器的缓冲区被读满后向 DMA 发起中断信号告知⾃⼰缓冲区已满DMA 收到磁盘的信号将磁盘控制器缓冲区中的数据拷⻉到内核缓冲区中 此时不占⽤ CPUCPU 可以执⾏其他任务当 DMA 读取了⾜够多的数据就会发送中断信号给 CPUCPU 收到 DMA 的信号知道数据已经准备好于是将数据从内核拷⻉到⽤户空间 系统调⽤返回
早期DMA只存在于主板上如今IO设备越来越多数据传输的需求也不尽相同所以每个I/O设备里面都有自己的DMA控制器
3、传统的文件传输
如果服务端要提供文件传输的功能我们能想到的最简单的方式是将磁盘上的文件读取出来然后通过网络协议发送给客户端。
而传统的I/O的工作方式是数据读取和写入是从用户空间到内核空间来回复制而内核空间的数据是通过操作系统的I/O接口从磁盘读取或写入。
read(file, tmp_buf, len);
write(socket, tmp_buf, len);这两行代码干了非常多的事如图 可以看到这期间发生了4次用户态与内核态的上下文切换 因为发生了两次系统调用一次是read()一次是write()。每一次系统调用都要从用户态切换到内核态等内核态完成任务后又要切换回用户态。而上下文切换的成本也很大尤其在高并发的场景下这类时间容易被累积放大从而影响系统的性能。
其次还发生了4次数据拷贝 两次是DMA拷贝两次是CPU拷贝。
第⼀次拷⻉把磁盘上的数据拷⻉到操作系统内核的缓冲区⾥这个拷⻉的过程是通过 DMA 搬运的。第⼆次拷⻉把内核缓冲区的数据拷⻉到⽤户的缓冲区⾥于是我们应⽤程序就可以使⽤这部分数据了这个拷⻉到过程是由 CPU 完成的。第三次拷⻉把刚才拷⻉到⽤户的缓冲区⾥的数据再拷⻉到内核的 socket 的缓冲区⾥这个过程依然还是由 CPU 搬运的。第四次拷⻉把内核的 socket 缓冲区⾥的数据拷⻉到⽹卡的缓冲区⾥这个过程⼜是由 DMA 搬运的
只是搬运一份数据结果却进行了四次数据拷贝过多的数据拷贝会消耗CPU资源大大降低系统性能。
这种传统的文件传输存在冗余的上下文切换和拷贝次数
优化文件传输
1、如何减少用户态与内核态的上下文切换的次数
读取磁盘数据时之所以要发生上下文切换这是因为用户空间没有权限操作磁盘或网卡内核的权限最高。所以一般要通过内核去完成某些任务的时候就需要使用操作系统提供的系统调用函数。
而一次系统调用必然会发生2次上下文切换从用户态切换到内核态内核态完成任务后再切换回用户态
所以要减少上下文切换的次数就要减少系统调用的次数
2、如何减少数据拷贝的次数
传统的文件传输过程会经过四次数据拷贝而这其中从内核的读缓冲区拷贝到用户的缓冲区中再从用户的缓冲区拷贝到socket的缓冲区 这个过程是没有必要的。因为文件传输的应用场景中在用户空间我们并不会对数据再加工 可以省去拷贝到数据缓冲区这一步。
