今天在实践中遇到了一个多线程的问题,尽管这个问题已经被自己想了不知道多少遍,查了多少次资料。 但是每次碰到依然是傻傻分不清楚的状态。 今天又疯狂的转了下牛角尖。。 因为之前在看java源码篇,关于java的thread类有过一些查看,但是很多的源码核心都是c或者c++ 实现的。 所以也就没查到。
我经常听的较多的是 多线程并发,并发编程,多线程编程等等。。。
并发与并行,从文字上来分析,还真不好分析,特容易混。。
网上很多大牛举得例子很形象,也很好懂 。。 我也想自己举一个:
并发: 当我们打绝地求生跑毒的时候,经常会一边跑,一边 alt 切换视角。 从视角方面,我们每一个特定的时间都盯着某一个视角,不可能说又看着前面又看着侧面。。 就算摆两个电脑屏幕也是这样,因为眼球的注意力不好分散。。。当然经过特殊训练应该也可以实现。。
并行: 任然是跑毒的时候,我们跑步的这个动作,与我们看视野的这个动作就是同时执行。。 我们不是停下来看一下视野,然后又跑,又看。。。 当然如果从动画帧的角度理解,情况可能会有些不一样。。
所以,至少我长期理解的多线程是并行的意思。。 而非并发。。
了解一个知识,了解它的历史显得很有必要:
硬件历史:
cpu方面,1942第一台计算机问世,应该是没有cpu一说吧。。 因为当时的使用的电子管,一个计算机相当于一个楼房。
1947年12月16日,美国新泽西州墨累山的贝尔实验室里,世界上首颗晶体管问世。。
1971年,世界上第一块微处理器4004在Intel公司诞生。 具有2300个晶体管,应该是八位的(同时期发生的技术变革:c语言同时期发明,早一年的1969年 fortran语言,为高级程序语言奠基;同年,unix操作系统诞生;1971,第一个电子邮件诞生,在更早的图灵时代,人工智能便已经开始萌芽,并提出图灵测试40年代,中间还出现的语言有: Lisp,语言编译器已经迭代了两个版本好像)。
1978年,Intel公司首次生产出16位的微处理器命名为i8086。 现在很多的单片机课上就是这个。。
1985年Intel推出了80386芯片,以i3处理器而出名,32位,具有跨时代的意义。(再过几年,貌似1989年,html就该诞生了。。咳咳。。)。
2002年,2004年,2006年左右把,奔腾系列提出的超线程技术,算是多线程并行的雏形了。。刚刚看资料貌似是2004的奔腾4吧? 懒得去翻了。。大差不差吧。。2006出现双核处理器。
2011, 2012,2013年左右,酷睿系列64位处理器问世。。 位数的每一次变化是质的,此外,针对不同的缓存的支持性能提升是显著的。。
技术方面:
1976,首次出现多线程并发,并发,并发! 单处理器上的并发。
2004年左右,出现超线程技术,有点并行的意思了。
2006年左右,多处理器的出现。
酷睿系列大都支持超线程技术,搭配多核心处理器。 出现迭代原因据说是在2013年左右,摩尔定律失效,处理器性能达到瓶颈。。
这些都是在网上搜的资料,加上自己乱七八糟的理解拼凑在一起。
然而这些都太过理论化了!! 并不是我想要的结果。 尽管我绞尽脑汁的措辞,仍然百度不到我想要的信息。
我大体的疑问是:
1.多线程并行(不是并发哈!!),物理上如何给予支持。 高级程序语言,或者说汇编程序如何与硬件打交道,硬件如何支持? 怎么体现? 如果有大牛比较懂底层,将汇编程序拿来分析一通是最有说服力的,但是非常可惜的是并么有找到答案。。 可能是太过于底层了,或者说对非硬件人员来说太隐蔽了!