Part II Concurrency 并发
25 并发对话
教授:因此,我们达到了操作系统的三个支柱中的第二个支柱:
并发。
学生:我以为有四个支柱…?
教授:不,那是该书的旧版本。
学生:嗯…好。那么什么是并发?
教授:好吧,想象一下我们有一个桃子-
学生:(打扰)桃子又来了!你和桃子怎么了?
教授:曾经读过T.S.艾略特? J. Alfred Prufrock的情歌,“我敢吗
吃桃子”,还有所有有趣的东西?
学生:是的!在高中英语课上。好东西!我真的很喜欢其中的一部分。
教授:(打断)与此无关-我只是喜欢桃子。不管怎样,想象桌上有很多桃子,还有很多人希望吃掉它们。假设我们是这样做的:每个食者首先都认出一个桃子,视觉上,然后尝试抓住它并吃掉它。这种方法有什么问题?
学生:嗯…似乎您可能会看到一个桃子,其他人也看到。如果他们先到达那里,当您伸出手时,就没有桃子了!
教授:是的!那么我们应该怎么做呢?
学生:好吧,可能会发展出更好的解决方案。也许形成一个线,当您到达最前面时,抓住一个桃子继续前进。
教授:好!但是您的方法有什么问题?
学生:well,我必须做所有的工作吗?
教授:是的。
**学生:**好的,我想想。好吧,我们立刻有很多人争抢全部桃子,更快。但是以我的方式,我们一次只走一个,这是正确的,但是要慢很多。最好的方法是快速并且可能是正确的。
教授:你真的开始印象深刻。实际上,您只是告诉了我们一切
我们需要了解并发!做得好。
学生:是吗?我以为我们只是在谈论桃子。记住这一点通常是您再次使用计算机的部分。
教授:确实。我很抱歉!必须永远不要忘记concreate(百度百科:Concrete,计算机术语。在Java中Concrete method代表不抽象的方法。)。好,事实证明,我们将某些类型的thread称为多线程应用(multi-threaded applications);每个线程(thread)都类似于在该程序中运行的独立代理,代表该程序执行操作。但是这些线程访问内存,对他们来说,每个内存点都像是那些桃子中的一个。如果我们不协调线程之间对内存的访问,该程序将无法运行如预期的那样。理解吗?
学生:有点。但是,为什么我们要在OS类中谈论这一点呢?这不只是
应用程序编程?
**教授:**好问题!实际上有几个原因。首先,操作系统必须支持
具有原语primitives(例如锁locks和条件变量condition variables)的多线程应用程序,我们将在稍后讨论。其次,操作系统本身是第一个并发程序——它必须非常小心地访问其自己的内存,否则会出现许多奇怪的情况,可怕的事情将会发生。真的,它可能会变得很糟。
学生:我知道了。听起来不错。我想还有更多细节吗?
教授:确实有……