网络io、磁盘io、db和多线程开发

线程池配置中要看项目是程序密集型还是io密集型,从而配置不同的线程数量。如果是io密集型,推荐2*Ncpu的线程数量,因为在io中,线程是阻塞的,cpu没有被占用太多。由此查询了一些关于cpu和io关系的资料,主要是从软件开发的角度简单了解下,方便提高程序的性能

io其实就是读写,io分为网络io和磁盘io:网络io就不用说了,代码里发起调用其他服务的接口,必然会导致线程阻塞,直到获取结果,cpu做了发起网络请求和数据传输后应该就是等待。

https://blog.csdn.net/wenxindiaolong061/article/details/79741027

http://www.cnblogs.com/sunsky303/p/8962628.html

这两篇文章中有讲到io的控制方式,其中DMA控制方式,解释了为什么磁盘io降低了cpu使用

  • PIO
    我们拿磁盘来说,很早以前,磁盘和内存之间的数据传输是需要CPU控制的,也就是说如果我们读取磁盘文件到内存中,数据要经过CPU存储转发,这种方式称为PIO。显然这种方式非常不合理,需要占用大量的CPU时间来读取文件,造成文件访问时系统几乎停止响应。

  • DMA
    后来,DMA(直接内存访问,Direct Memory Access)取代了PIO,它可以不经过CPU而直接进行磁盘和内存的数据交换。在DMA模式下,CPU只需要向DMA控制器下达指令,让DMA控制器来处理数据的传送即可,DMA控制器通过系统总线来传输数据,传送完毕再通知CPU,这样就在很大程度上降低了CPU占有率,大大节省了系统资源,而它的传输速度与PIO的差异其实并不十分明显,因为这主要取决于慢速设备的速度。

猜你喜欢

转载自blog.csdn.net/u014203449/article/details/84890930
今日推荐