For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
并发编程开发随着互联网的不断发展而被众多企业加入到了软件开发需求行列之中,而本文我们就通过案例分析来简单了解一下,并发编程提高效率需要解决的问题都有哪些。
一个完整服务器,都有CPU、内存、IO,三者之间的运行速度存在明显的差异:
CPU相关的操作,执行指令以及读取CPU缓存等操作,基本都是纳秒级别的。
CPU读取内存,耗时是CPU相关操作的千倍,基本都是微秒级别。CPU和内存之间的速度差异。
IO操作基本是毫秒的级别,是内存操作的千倍,内存和IO之间存在速度的差异。
CPU->内存->SSD->磁盘->网络
纳秒->微秒->毫秒->毫秒->秒
程序中大部分的语句都要访问内存,有些还要访问的IO读写。为了合理的利用CPU的高性能,高效的平衡三者的速度差异,操作系统、编译器主要做了以下改进:
CPU增加了CPU缓存,用来均衡CPU和内存的速度差异。
操作系统增加了多进程、多线程,用来分时复用CPU,从而均衡CPU与IO设备之间的差异。
编译优化程序执行顺序,充分利用缓存。
做了以上操作之后,CPU读取或者修改数据之后,将数据缓存在CPU缓存中,CPU不需要每次都从内存中获取数据,极大的提高了CPU的运行速度。多线程是将时间段切成一个个小段,多个线程在上下文切换中,执行完任务,而不用等前面的线程都执行完毕之后再执行。比如做一个计算,CPU耗时1纳秒,而从内存读取数据要1微秒,没有多线程的话,N个线程要耗时N微秒,此时CPU高效性就无法体现出来。有了多线程之后,操作系统将CPU时间段切成一个一个小段,多线程上下文切换,线程执行计算操作,无需等待内存读取操作。
虽然并发可以提高程序的运行效率,但是凡事有利也有弊,并发程序也有很多诡异的bug,根源有以下几个原因。
缓存导致可见性问题
一个线程对共享变量的修改,另外线程能立刻看到,称为可见性。
在单核时代,所有的线程都是在同一个CPU上运行,所有的线程都是操作同一个线程的CPU缓存,一个线程修改缓存,对另外一个线程来说一定是可见的。
线程切换带来的原子性问题
上面提到,由于CPU、内存、IO之间的速度存在很大的差异,在单进程系统中,需要等速度慢的IO操作完成之后,才能接着完成下一个任务,CPU的高性能也无法体现出来。但操作系统有了多进程之后,操作系统将CPU切成一个一个小片段,在不同的时间片段内执行不同的进程的,而不需要等待速度慢的IO操作,在单核或者多核的CPU上可以一边的听歌,一边的聊天。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。