最早期的计算机,也就是我们称为的“冯·诺依曼”计算机,它拥有存储指令和数据的内存空间,根据机器语言以串行的方式执行指令,并通过一组I/O指令与外部的设备通讯,也就是程序中的控制流是按照指令集的规则来确定执行顺序的,这样就是当前几乎所有主流编程语言都遵循的串行编程模型;而串行模型正式参照人类最原始的工作方式来设计的,其直观性和简单性,让它能帮我们完成一些简单的重复工作,解放了我们的生产力;而早期的计算机就相当于原始社会的一个生产单位,简单,有序,重复;而现在我们的工作方式随着社会的进步产生了巨大的变化,一个显著的特点就是“并行”,比如我们在等公交的时候,我们还可以吃早点,同时刷刷手机新闻,听着动听的音乐,我们的行为充满了并行性(我们也称之为异步),这得益于我们大脑思维方式的转变,而由我们创造出的计算机,为什么就不能呢?于是强大的计算机处理系统出现了,进程出现了,计算机可以同时运行多个程序了,每个程序都在单独的进程中执行(所以我们现在玩游戏,可以双开,多开,小号满地跑);但凡做事高效的人,总能在串行性与异步性之间找到合理的平衡,对于程序来说,亦如此,所以为了进一步提高资源利用率,资源使用公平性及便利性,线程终于出现了;
线程允许同一个进程中存在多个程序控制流,线程会共享进程范围内的资源(比如内存句柄和文件句柄),每个线程都有各自的程序计数器(Program Counter)、栈(stack)以及局部变量(Local variable)等。线程还提供了一种直观的分解模式来充分利用多处理器系统中的硬件并行性,而在同一个程序中,多个线程还可以被调度到多个CPU上执行;所以线程也被称为轻量级进程,这也是当前大多数操作系统的基本调度单位(当然,最新出现的fiber--纤程,将纤程做了更细的分割,优化了纤程的缺陷,在此不作讲解,有兴趣可以自行了解),在没有明确协同机制的情况下,线程都是独立执行的;
线程可以将绝大多数的异步工作流转换为串行工作流(通过协同机制,并发进行,条件触发),不仅能提升单处理器系统的吞吐率,还能发挥多处理器的强大能力,将复杂并且异步的工作流进一步分解为一组简单的同步工作流,从而极大的提升了复杂应用程序的性能,降低了程序的开发和维护成本;
凡事都有好坏,这是我国传统的中庸思想,所以说java线程也是一把双刃剑,用得好,能发挥巨大威力,用不好,相当于给程序埋了无数的定时炸弹,说不定哪天就尸骨无存;当它刚出现时,只流行在高手之间,但是现在,每个主流程序员都必须了解,不然只能被江湖淘汰,更别说留下你的传说了;
线程最大的问题就是安全性(永远不发生糟糕的事情),而我们需要的是某件正确的事情最终会发生,也就是所说的活跃性,我们不仅要保证活跃性,我们还需要正确的事情尽快的发生,这也就是程序的性能,所有的优化都是需要代价的,就像线程能提升程序性能,其付出的代价就是线程上下文的切换(Context switch),会产生更极大的开销(保存和恢复执行上下文,丢失局部性,并且CPU将耗费更多的时间在线程调度上而不是运行上);
如何解决这3个问题,将是我们掌握这把双刃剑必不可少的试炼,想成为武林高手的猿们,准备好了吗?
线程允许同一个进程中存在多个程序控制流,线程会共享进程范围内的资源(比如内存句柄和文件句柄),每个线程都有各自的程序计数器(Program Counter)、栈(stack)以及局部变量(Local variable)等。线程还提供了一种直观的分解模式来充分利用多处理器系统中的硬件并行性,而在同一个程序中,多个线程还可以被调度到多个CPU上执行;所以线程也被称为轻量级进程,这也是当前大多数操作系统的基本调度单位(当然,最新出现的fiber--纤程,将纤程做了更细的分割,优化了纤程的缺陷,在此不作讲解,有兴趣可以自行了解),在没有明确协同机制的情况下,线程都是独立执行的;
线程可以将绝大多数的异步工作流转换为串行工作流(通过协同机制,并发进行,条件触发),不仅能提升单处理器系统的吞吐率,还能发挥多处理器的强大能力,将复杂并且异步的工作流进一步分解为一组简单的同步工作流,从而极大的提升了复杂应用程序的性能,降低了程序的开发和维护成本;
凡事都有好坏,这是我国传统的中庸思想,所以说java线程也是一把双刃剑,用得好,能发挥巨大威力,用不好,相当于给程序埋了无数的定时炸弹,说不定哪天就尸骨无存;当它刚出现时,只流行在高手之间,但是现在,每个主流程序员都必须了解,不然只能被江湖淘汰,更别说留下你的传说了;
线程最大的问题就是安全性(永远不发生糟糕的事情),而我们需要的是某件正确的事情最终会发生,也就是所说的活跃性,我们不仅要保证活跃性,我们还需要正确的事情尽快的发生,这也就是程序的性能,所有的优化都是需要代价的,就像线程能提升程序性能,其付出的代价就是线程上下文的切换(Context switch),会产生更极大的开销(保存和恢复执行上下文,丢失局部性,并且CPU将耗费更多的时间在线程调度上而不是运行上);
如何解决这3个问题,将是我们掌握这把双刃剑必不可少的试炼,想成为武林高手的猿们,准备好了吗?

从最早的冯·诺依曼计算机到现代多线程处理系统,本文介绍了计算机编程模型从串行到并行的演变过程。线程作为轻量级进程,允许同一进程中并行执行多个控制流,极大地提高了程序性能和资源利用率。
1105

被折叠的 条评论
为什么被折叠?



