- 他曾任罗切斯特大学计算机科学教授,并曾在其母校威斯康星大学麦迪逊分校担任五年院长。他从事并行和分布式编程以及语言设计方面的研究,并向学生讲授这些课程。
全世界都通过教科书认识了迈克尔。 , 工作呢 他因在分布式计算领域取得的杰出成就而荣获迪杰斯特拉奖。您可能也知道他是该算法的作者。 .
他与 Doug Lee 一起开发了为 Java 库提供支持的非阻塞算法和同步队列。 JavaSE 6 的性能提升了 10 倍。 ThreadPoolExecutor.
内容:
- 职业生涯早期,罗切斯特大学。夏洛特项目,猞猁语言;
- IEEE 可扩展相干接口,MCS 锁定;
- 在瞬息万变的世界中生存;
- 学生的智商是不是越来越低了?全球趋势,国际化;
- 与学生有效合作;
- 如何跟上新课程和书籍编写方面的最新发展;
- 商业与学术界的联系;
- 将想法付诸实践。MCS、MS、CLH、JSR 166,与 Doug Lee 合作等等;
- 事务内存;
- 新型架构。事务内存即将取得胜利;
- 非易失性存储器、傲腾DIMM、超高速器件;
- 下一个重大趋势:双重数据结构。Hydra。
采访由以下人员进行:
维塔利·阿克塞诺夫 —目前是奥地利信息科学技术研究所(IST Austria)的博士后研究员,同时也是ITMO大学计算机科学系的成员。他的研究方向是并发数据结构的理论与实践。在加入IST之前,他师从Petr Kuznetsov教授,先后在巴黎狄德罗大学和ITMO大学获得博士学位。
阿列克谢·费多罗夫 - JUG Ru Group 的制作人,该公司是一家为开发者组织会议的俄罗斯公司。 Alexey 参与了 50 多个会议的筹备工作,他的简历包括从 Oracle(JCK,Java Platform Group)的开发工程师职位到 Odnoklassniki 的开发人员职位等各种内容。
弗拉基米尔·西特尼科夫 - Netcracker 工程师。 十年来致力于 NetCracker OS 的性能和可扩展性,该软件是电信运营商用来自动化网络和网络设备管理流程的软件。 对 Java 和 Oracle 数据库性能问题感兴趣。 官方 PostgreSQL JDBC 驱动程序中十几项性能改进的作者。
职业生涯早期,罗切斯特大学。夏洛特项目,Lynx语言。
阿列克谢首先,我想告诉你们,我们俄罗斯人对计算机科学、数据科学和算法都非常热爱。这种热爱简直到了痴迷的程度。我们都读过相关的书籍和论文。 因此,即将召开的会议、这所学校以及这次采访本身都应该会非常受欢迎。我们收到了来自学生、程序员和社区成员的大量采访问题,因此我们非常感谢这次机会。计算机科学在美国也很受欢迎吗?
迈克尔我们的领域非常多元化,分支众多,对社会的影响也十分广泛,因此我很难给你一个确切的答案。但事实是,在过去的30年里,它已经推动了商业、工业、艺术以及整个社会发生的巨大变革。
维塔利我们先从一个比较冷门的话题开始。很多大学在某个特定领域都有自己的特色。卡内基梅隆大学的特色是并行计算;麻省理工学院的特色是密码学、机器人学和多线程。罗切斯特大学也有类似的特色吗?
迈克尔说实话,我觉得卡内基梅隆大学和麻省理工学院几乎什么都专攻。我们系一直专注于人工智能。我们系一半的人都在从事人工智能或人机交互方面的工作——这个比例比其他系高,而且一直如此。但我在卡内基梅隆大学的时候,没有上过任何人工智能相关的课程,也从未从事过这方面的工作。所以,我们系专攻的领域和我完全不相关。好消息是,我们系第二重要的问题是并发和多线程编程,而这正是我的专长。
维塔利您开始从事计算机科学研究时,多线程编程领域才刚刚兴起。从您的论文列表来看,您早期的研究涵盖了相当广泛的主题:多线程系统中的内存管理、分布式文件系统和操作系统。为什么您的研究领域如此广泛?您是否试图在研究界找到自己的定位?
迈克尔作为一名学生,我参加了 我在威斯康星大学工作,那里开发了最早的分布式操作系统之一。在那里,我与 Raphael Finkel 共事()和马文·所罗门(我的博士论文是关于开发一种用于分布式系统的系统软件语言——谢天谢地,现在它基本上已经被人遗忘了。我创建了 Lynx 编程语言,旨在简化松耦合分布式操作系统服务器的创建。由于当时我主要从事操作系统方面的工作,我以为我的职业生涯也会专注于此。但罗切斯特大学规模很小,因此,那里的各个研究小组之间的互动非常密切。我能交流的操作系统专家不超过十几个,所以我的所有联系人都是来自完全不同领域的人。我非常喜欢这种状态;成为一名通才对我来说是一个巨大的优势。至于多线程数据结构和同步算法,我开始研究它们完全是出于偶然。
IEEE 可扩展相干接口,MCS 锁定。
维塔利您能再详细解释一下吗?
迈克尔这是一个我百讲不厌的趣事。它发生在一次会议上。 在波士顿——那是在 80 年代末或 90 年代初。约翰·梅勒-克鲁米出席了会议(),我们系的一位毕业生。我认识他,但我们之前没有合作过研究。玛丽·弗农(来自威斯康星州的某位专家就他们在威斯康星州开发的多处理器系统做了报告: 这个 Multicube 有一个叫做 Q on Sync Bit 的硬件同步机制,后来因为听起来像 Colby cheese(科尔比奶酪),所以改名为 Q on Lock Bit,算是个双关语。如果你了解多线程,你可能知道 Colby 最终成为了 IEEE 可扩展一致性接口 (SCI) 标准的同步机制。它是一种锁定机制,在硬件层面创建从一个缓存指向另一个缓存的指针,这样每个锁持有者就知道轮到谁了。我和 John 听到这个机制后,面面相觑,心想:为什么要在硬件层面实现呢?我们难道不能用比较交换 (compare-and-swap) 来实现同样的功能吗?我们随手拿起教室里随手可得的笔记本,把它画了出来。 玛丽继续她的演讲。后来我们实现了这个想法,进行了实验,结果证明是可行的,于是我们发表了论文。当时,这个课题对我来说只是个有趣的消遣,之后我打算回到操作系统领域。但后来,我又遇到了一个类似的问题,最终,同步、多线程和数据结构成了我的主要研究方向。正如你所见,这一切都是偶然发生的。
维塔利我早就听说过 MCS 阻塞,但直到现在才知道这是你们的作品,也没有意识到它是你们姓氏的缩写。
如何在不断变化的世界中生存?
阿列克谢我有一个相关的问题。三四十年前,不同专业领域之间的自由度更高。如果你想从事多线程或分布式系统方面的工作,完全没问题;如果你想研究操作系统,也没问题。每个领域都有很多未解之谜,但专家却寥寥无几。如今,专业领域日趋细分:不再只有通用的操作系统专家,还有专门研究特定系统的专家。多线程和分布式系统领域也是如此。但问题在于,我们的生命是有限的;每个人只能投入几十年的时间从事研究。我们该如何在这个新世界里生存下去呢?
迈克尔在这方面我们并不特殊;其他领域也曾经历过类似的阶段。我很幸运,在计算机科学的萌芽时期就开始从事这方面的工作。虽然一些基础已经奠定,但一切都还很不成熟。这样的机会并不常见。电气工程已经存在了很长时间,物理学的历史更悠久,而数学几乎可以追溯到人类文明之初。但这并不意味着数学领域已经没有新的发现。仍然存在许多未解之谜,但与此同时,我们也需要学习更多。你说得对,现在的专业领域比以前多了很多,但这仅仅意味着我们和其他大多数人类活动领域一样,都处于同样的境地。
阿列克谢我更想了解这个问题的实际层面。我拥有数学背景,在学习期间经常参加学术会议,研究各种科学课题。我发现听众几乎听不懂我的报告,同样,其他人的报告也只有他们自己能理解。对于高深的课题来说,这种情况并不常见,但一旦你开始深入探讨某个主题,听众就跟不上节奏了。如何才能克服这个问题呢?
迈克尔并非总是如此。我最近准备了一场演讲,其中我深入探讨了太多技术细节。随着演讲的进行,我发现大多数听众都听不懂,所以我不得不临时调整。幻灯片无法更改,因此效果并不理想——这就是为什么我通常尽量避免使用幻灯片的原因。总而言之,我的建议是要考虑你的听众。你需要了解你的听众是谁,他们的知识水平如何,以及他们需要听到什么才能理解你的工作。
维塔利你能给我透露一下这次讲座的内容吗?
迈克尔说实话,为了保护相关人员的隐私,我不想过多赘述这个话题。关键在于,我们常常会过于深入地探讨问题的细节,导致在演讲开始时难以解释清楚问题为何有趣、重要,以及它与听众已有知识的关联。以我的经验来看,这是学生们最容易犯的错误,也是我最近一次演讲的不足之处。一个结构良好的演讲应该从一开始就与听众建立联系,准确地解释问题是什么,以及它与他们已有知识的关联。引言的技术性程度取决于听众。如果听众背景非常多元化,演讲可以分多个步骤进行。引言部分应该通俗易懂,到最后,虽然有些人可能难以完全理解,但对你所在领域比较熟悉的人应该能够完全理解。
学生的智商是不是越来越低了?全球趋势与国际化。
阿列克谢你观察学生已经几十年了。学生们是每过十年或每年都变得更聪明还是更愚笨?在俄罗斯,教授们不断抱怨学生一年比一年愚笨,但究竟该如何应对,却始终不得而知。
迈克尔你确实能从我们这些老家伙那里听到很多负面的声音。潜意识里,我们总是期望学生们能吸收我们三十年来积累的所有经验。如果我比1985年的时候理解得更透彻,为什么学生们却没有呢?大概是因为他们才20岁吧,你说是不是?我认为近几十年来最显著的变化在于人口结构:除了加拿大学生之外,我们现在的国际学生数量显著增加。以前加拿大学生很多,因为我们离加拿大边境很近,加拿大的学生周末可以回家。但现在加拿大有很多优秀的大学,加拿大学生更倾向于在国内学习;他们去美国留学的次数大大减少了。
阿列克谢你认为这是局部趋势还是全球趋势?
迈克尔我不记得是谁说的了,但有人说过地球是平的。我们这个领域已经变得非常国际化了。 此前,这些活动仅在美国境内举办;后来决定每四年在其他国家举办一次;而现在,它们已在全球各地举办。这些变化产生了更为深远的影响。 因为它一直以来都比ACM更具国际性。而且,它的程序委员会主席来自中国、印度、俄罗斯、德国以及许多其他国家,因为现在世界各地都发生着很多事情。
阿列克谢但是,这种国际化可能也存在一些负面影响吧?
迈克尔我认为所有负面影响都源于政治,而非技术。过去,主要问题是美国从世界各国挖走最聪明、最有才华的人才。而现在,主要问题是各国之间围绕签证和移民问题展开的政治博弈。
阿列克谢也就是说,障碍之类的东西。明白了。
弗拉基米尔我个人很想了解您在教授学生新学科时采用的方法。有很多不同的方法:您可以侧重于激发他们尝试新事物的兴趣,也可以更侧重于讲解特定技术的工作原理。您更倾向于哪种方法呢?
与学生有效合作
阿列克谢那么,你该如何找到第一点和第二点之间的平衡呢?
迈克尔问题在于,课堂并非总能如我所愿。我通常会提前给学生布置阅读材料,让他们有时间吸收,尽可能理解,并就任何未掌握的知识点提出问题。然后,在课堂上,我们可以集中精力探讨最难的部分。我喜欢这样的教学方式。但鉴于目前的工作量,我并非总能确保他们提前做好准备。结果,我最终不得不花费比预期多得多的时间进行概括总结。尽管如此,我仍然努力保持课堂的互动性。否则,还不如直接录制视频,让学生在家观看。直播课程的意义就在于人与人之间的互动。在课堂上,我更喜欢用粉笔和黑板,而不是幻灯片,除非极少数情况下,图表过于复杂,无法在黑板上展示。这让我不必拘泥于固定的教案。由于我没有固定的讲解顺序,我可以根据学生提出的问题灵活调整教学内容。总的来说,我尽量让课堂具有互动性,这样我所讲授的内容就取决于我被问到的问题。
弗拉基米尔太好了。就我的经验而言,很难从听众那里得到问题。即使你事先问了他们任何问题,无论问题多么愚蠢或巧妙,他们仍然保持沉默。你是如何应对这种情况的?
迈克尔你可能会笑,但如果你一直沉默地站在那里,迟早大家都会感到不自在,然后就会有人提问。或者你可以问一个简单的技术性是非题,来判断大家是否理解了刚才的内容。例如,刚才的例子里是否存在数据竞赛?谁认为存在?谁认为不存在?谁完全没听懂,因为只有一半的人举手了?
维塔利如果回答错误,你会被赶出教室 :)
迈克尔如果你什么都没回答,那我就得问问题了。我得弄清楚学生需要知道什么才能回答我刚才提出的问题。他们需要帮助我才能更好地帮助他们。我愿意根据他们的情况调整教学方式,以便他们能够解决问题。但如果我不了解他们的想法,我就无法做到这一点。如果我能让学生保持足够长时间的专注,有时他们最终会提出正确的问题——这些问题能让我了解他们的想法。
阿列克谢这些问题是否有时会启发你产生以前从未想过的想法?它们是否出乎意料?它们是否能让你以全新的视角看待问题?
迈克尔有些问题能启发我们用全新的方式呈现教学内容。很多时候,问题会引出一些我原本没打算讨论的有趣问题。学生们经常告诉我,这种情况发生时,我的讲课内容往往会偏离主题。而且,据他们说,这往往是课堂上最精彩的部分。极少数情况下,学生提出的问题会引导我们找到新的研究方向,最终发展成一篇文章。这种情况在与学生的交流中比在课堂上更常见,但偶尔也会在课堂上发生。
阿列克谢所以,学生们问了你一些问题,这些问题后来可以作为文章的素材?
迈克尔:是的。
维塔利你多久会和学生进行一次这类对话?他们什么时候会想要学习课堂之外的知识?
迈克尔我和我的研究生们经常交流。我有五六个研究生,我们总是讨论各种事情。和那些只是来上课的学生进行这种交流的机会并不多。虽然我希望这种情况能更频繁一些。我猜他们只是害怕在办公时间来找我。每个学期,总有一些学生能够克服这种心理障碍,课后和他们聊天总是很有意思。但是,如果所有学生都这么勇敢,我就根本没时间了。所以,也许一切都运转得恰到好处。
维塔利您是如何抽出时间与学生互动的?据我所知,在美国,教授们都很忙——要申请科研经费等等。
迈克尔说实话,我最喜欢的就是和学生一起工作。所以我工作动力十足。我大部分时间都待在办公室里开各种会。现在是暑假,所以我的日程比较轻松,但在学年期间,我每天从早上9点到下午17点都安排得满满当当。研究、评审、申请拨款——这些事情我只能利用晚上和周末的时间来完成。
如何跟上新课程和书籍编写方面的最新进展。
阿列克谢您还在教授您以前教过的那些课程吗?比如计算机科学导论之类的。
迈克尔首先想到的就是编程语言课程。
阿列克谢如今的这门课程与10年前、20年前甚至30年前相比,究竟有何不同?或许整体趋势比具体课程的细节更有意思。
迈克尔我开设的编程语言课程在当时算是比较特别的。我从 20 世纪 80 年代末开始教授这门课,接替了我的同事道格·鲍德温(Doug Baldwin)。这门课的主题与我的专业只有一点点关联,但他离开后,我发现自己是教授这门课的最佳人选。我不喜欢现有的任何教材,所以最终决定自己编写这门课的教材。(编者注:这里指的是这本书)目前,全球已有超过 200 所大学采用这门课程。我的方法比较独特,它刻意融合了语言设计和实现方面的考量,着重探讨这些方面在各个领域中的交互作用。核心方法和许多核心概念(例如抽象、命名空间、模块化和类型)都保持不变。然而,用于演示这些概念的语言集合却发生了彻底的变化。这门课程最初创建时,包含了大量 Pascal 的示例,但如今,我的许多学生甚至从未听说过这种语言。不过,他们熟悉 Swift、Go 和 Rust,所以我必须讲解当今流行的语言。此外,学生们现在对脚本语言也相当精通,而我刚开始教授这门课程时,它完全专注于编译型语言。然而,现在我们需要大量关于 Python、Ruby 甚至 Perl 的资料,因为这些语言是人们现在编写代码的主要工具,而且这些语言领域正在发生许多有趣的变化,包括语言设计方面。
维塔利那么我的下一个问题与上一个问题相关。您是如何在这个领域保持更新的?我猜想更新这样的课程需要付出很多努力——您需要理解新的语言并掌握基本概念。您是如何做到的?
迈克尔我不能说我每次都能百分之百成功。但大多数时候,我只是做着和大家一样的事情——上网查资料。如果我想了解 Rust,我会用谷歌搜索,然后去 Mozilla 的网站,阅读那里的指南。这主要是为了了解商业开发领域的最新动态。至于学术方面,我需要关注大型会议的演讲。
商业与学术界的联系
维塔利我们来谈谈商业与学术研究之间的联系。我在您的工作列表中找到了几篇关于缓存一致性的文章。据我了解,在这些文章发表的时候,缓存一致性算法还不稳定?或者说应用并不广泛?您的理念在实践中被广泛接受吗?
迈克尔我不太确定你指的是哪些出版物。我和我的学生比尔·博洛斯基(Bill Bolosky)一起做了很多工作()和列奥尼达·康托塔纳西斯(上世纪1990年代初,我和Leonidas在诺伊曼机器上从事内存管理方面的工作。当时,业界对如何正确构建多处理器系统还不太了解:是否要在硬件层面支持远程内存访问,是否要采用分布式内存,是否要从远程内存加载缓存,或者是否要在操作系统中移动页面。Bill和Leonidas都在研究这个领域,探索无需远程缓存加载的方法。这与缓存一致性没有直接关系,但仍然是NUMA内存管理方面的工作,后来成为现代操作系统页面放置方法的基础。总的来说,Bill和Leonidas的工作很重要,尽管他们并非该领域最具影响力的人物——当时还有许多其他人在做同样的事情。后来,我在硬件事务内存的背景下研究了缓存一致性。我所在的团队最终获得了几项专利。这些专利背后有一些有趣的想法,但我认为它们最终不会被实现。总之,我很难判断它们的盈利能力。
阿列克谢在此,我想问一个更私人的问题:你认为你的想法付诸实践有多重要?或者你根本没考虑过这个问题?
迈克尔我喜欢在面试中问别人这个问题,无论是应聘者还是对部门工作感兴趣的人。我觉得这个问题没有标准答案。做着很棒的事情的人,动机可能千差万别。我之所以会被问题吸引,是因为我个人觉得它们很有趣,而不是因为它们的实际用途。但另一方面,当一些有趣的东西最终找到了用武之地时,我也会非常开心。所以,这个问题并不那么简单。不过,在项目初期,驱动我的不是它最终在世界上的用途,而是想法本身的逻辑性,以及探索它、看看它能带来什么结果的渴望。如果最终它能带来实际效益,那就更好了。
阿列克谢凭借您的教育背景和经验,您比许多人更有能力评估他人想法的价值。您可以比较这些想法,并判断哪些想法最适合相互配合。我相信您对英特尔等主要制造商目前实际应用的技术有自己的看法。您认为这些公司选择的道路是否正确?
迈克尔实践总是围绕着商业成功,也就是盈利展开,而关于这一点,你最好去问别人。我的工作成果大多以论文的形式发表,在操作系统领域,论文的评价指标是性能指标:速度、功耗、代码大小。但我总觉得,这些实证结果被添加到论文中只是为了发表,而人们工作的真正动机是审美。研究人员从艺术的角度评估解决方案;他们注重想法的优雅,并力求创造出比现有方法更好的东西。研究人员的驱动力是个人的、主观的、审美的。但你不能在论文本身中写这些;这些内容不能作为程序委员会的论据。幸运的是,优雅的解决方案通常也快速且成本低廉。大约15年前,我和十位同事讨论过这个话题,最终写了一篇论文。我想现在还能找到;它叫做…… 或者类似这样的,它有十几位作者。这是我唯一一篇与他人共同撰写的文章。 所以,如果你在我的出版物列表中搜索她的名字,就能找到你想要的内容。那篇文章讨论了系统研究的评估以及简洁性的重要性。
阿列克谢所以,科学界和商业界对“好结果”的标准有所不同。在科学领域,性能、功耗、热设计功耗(TDP)、易于实施等诸多因素都会被评估。你们大学是否有机会开展这类研究?你们是否有配备不同机器和架构的实验室可以进行实验?
迈克尔是的,我们系有很多很棒的机器。它们通常比较小巧;我们有一个小型集群和许多配备各种加速器的多处理器系统。我们校园里还有一个大型计算中心,为几十个不同学科的研究人员提供服务。它拥有大约一千个节点和两万个核心,全部运行Linux系统。如果需要,我们随时可以购买AWS云服务。所以,我们的硬件没有明显的限制。
阿列克谢三十年前的情况如何?当时存在什么问题吗?
迈克尔当时的情况与现在略有不同。在20世纪80年代中后期,人们普遍认为科学界缺乏计算资源。为了改善这种情况,美国国家科学基金会 我们创建了协调实验研究(CER)项目。该项目的目标是为计算机科学系提供计算基础设施,并且取得了显著成效。利用该项目提供的资金,我们在1984年,也就是我到任前一年,在罗切斯特大学购置了一台128节点的BBN Butterfly超级计算机。当时,它是世界上最大的共享内存多处理器系统。它拥有128个处理器,每个处理器都位于独立的主板上,占据了四个机架。每个处理器都配备了1MB的内存;128MB的内存容量在当时是难以想象的。我们首次在这台机器上实现了MCS锁定。
阿列克谢所以,如果我理解正确的话,硬件问题现在已经解决了?
迈克尔总的来说,是的。但也有一些需要注意的地方:首先,如果你从事芯片级计算机架构的研究,在学术界很难做到,因为商业领域有更先进的工具。如果你需要小于 10 纳米的工艺,就必须外包。在这个领域,在英特尔做研究人员要容易得多。如果你从事芯片上的光通信或固态存储器的研究,你会发现商业领域拥有学术界尚未掌握的技术,所以你必须建立合作关系。例如,Stephen Swanson(已创建 对于新型存储技术而言,这种方法并非总是奏效,但在某些情况下却能取得显著成效。此外,在科学领域开发最强大的计算系统难度更大。目前美国、日本和中国正在进行的最大型超级计算机项目都集中在商业领域。
将理念付诸实践。MCS、MS、CLH、JSR 166、与 Doug Lee 合作等等。
维塔利您之前已经谈到过您是如何开始研究同步算法的。您有两篇非常知名的论文,主题是…… и 从某种意义上说,它们是用 Java 实现的。(编者注:所有出版物均可查看) )。在那里,这种封锁措施经过一些修改后得以实施,结果表明: 队列功能也按计划实现了。但是,从您的文章发表到实际应用,中间间隔了许多年。
阿列克谢:就排队的情况来看,似乎要等10年左右。
迈克尔在这些特性出现在 Java 标准库之前?
维塔利是的。你做了什么才促成这件事?还是你什么都没做?
迈克尔我可以告诉你微软队列是如何被引入 Java 5 的。在 Java 5 发布前几年,我曾在 Sun Microsystems 公司波士顿郊外的实验室里,和 Mark Moyers 的团队一起工作。他为一些研究多线程领域有趣问题的朋友组织了一次研讨会,因为他想找到一些可以卖给公司的课题。正是在那里,我第一次见到了 Doug Lea。Doug、我和 Sun 公司的其他大约 25 个人正在讨论 Doug 关于多线程队列的报告。 后来它演变成了 java.util.concurrent。在此过程中,Doug 提到他想使用 MS 队列,但需要一个计数器来处理队列中的元素数量。这意味着必须使用一个单独的、原子性的、精确的、快速的方法来实现。我建议直接将序列号添加到节点上,然后取第一个节点和最后一个节点的序列号,再用其中一个减去另一个。Doug 挠了挠头,说:“为什么不呢?”,最终他真的这么做了。我们讨论过在库中实现这种方法,但 Doug 自己完成了大部分工作。最终,他成功地在 Java 中建立了优秀的线程支持。
阿列克谢所以,如果我理解正确的话,.size() 方法应该是标准队列接口的一部分,并且它的算法复杂度应该是 O(1)?
迈克尔是的,此外还需要一个单独的电表。
阿列克谢因为在 Java 中调用 .size() 方法时,结果应该立即可用,而不是基于集合的实际大小。明白了,谢谢。
迈克尔几年后,我和我的学生比尔·谢勒一起研究了双重数据结构——这就是我的论文的主题。 Doug联系我们,说他可以在Java执行器框架中使用它们。他和Bill一起创建了两个实现,即所谓的公平队列和非公平队列。我参与了这个项目,虽然没有直接编写代码。最终,执行器的速度显著提升。
弗拉基米尔你是否遇到过算法实现错误或新功能需求的情况?通常来说,实践应该与理论相符,但两者往往存在偏差。假设你编写了一个算法,理论上运行正常,但实际执行的人却开始要求添加更多功能或进行一些定制。你是否遇到过这种情况?
迈克尔唯一一次有人来问我“如何实现”的例子就是道格的问题,我已经提到过了。不过,为了满足实际需求,也出现过一些有趣的改动。例如,IBM 的 K42 团队改造了 MCS 锁,创建了一个标准接口,从而无需在获取和释放例程之间来回传递队列节点。这个标准接口让这个理论上很美好的想法在实践中得以实现。令人惊讶的是,他们从未就此发表过论文,虽然他们获得了专利,但后来放弃了。这个概念非常出色,我会尽可能地谈论它。
还有其他一些例子,人们在我发表的算法基础上进行了改进。例如,微软队列采用两阶段设置机制,这意味着队列的关键路径上有两个 CAS 指令。在旧机器上,CAS 指令的开销相当大。英特尔和其他厂商最近对其进行了很好的优化,但在当时,这些指令需要 30 个时钟周期,因此在关键路径上存在多个 CAS 指令是不理想的。因此,人们开发了一种类似于微软队列的优秀队列,但它的关键路径上只有一个原子操作。这是通过允许操作在特定时间间隔内花费 O(n) 的时间复杂度而不是 O(1) 来实现的。这种情况虽然不太可能发生,但并非不可能。这是因为在某些点上,算法会从队列的开头遍历到当前位置。总的来说,该算法非常成功。据我所知,它并没有被广泛使用,部分原因是原子操作所需的资源比以前少得多。但这个想法很棒。我也非常欣赏 Oracle 的 Dave Dice 的工作。他所做的一切都非常务实,而且对硬件的运用也十分巧妙。他参与了NUMA感知同步算法和多线程数据结构的重要部分开发。
弗拉基米尔当你编写算法或教授学生时,你的工作成果不会立即显现。例如,一篇新论文需要一段时间才能被学术界所熟悉。一个新的算法也不会立即得到应用。
迈克尔一篇文章是否具有影响力远非一目了然。我认为对那些获得会议奖项的论文进行研究会很有意思。也就是说,研究一下当时程序委员会认为最好的论文。我们应该尝试根据引用次数和商业影响来计算这些论文在10年、20年、25年后的实际影响力。我怀疑这两个参数之间不会有很强的相关性。相关性不会为零,但很可能远低于我们的预期。许多想法在获得认可之前,会长期无人问津。例如,事务内存。从最初的论文发表到人们真正开始用它制造机器,过去了10多年。而这种内存技术最终出现在商业产品中,又过了整整20年。很长一段时间里,这篇论文无人问津,但之后它的引用次数却急剧增加。这很难提前预测。另一方面,有些想法也能迅速得到应用。几年前,我与 Joe Izraelevitz 合著了一篇发表在 DISC 上的论文,提出了一种新的持久化数据结构正确性形式化定义,这种定义适用于运行这些数据结构的计算机崩溃后的数据结构。我从一开始就很喜欢这篇论文,但它比我预想的更受欢迎。多个不同的研究小组采纳了它,最终它成为了持久化数据结构的标准定义。这当然是一件好事。
弗拉基米尔你使用过哪些评估方法?你会评估自己的文章或学生吗?比如,评估你所教的人是否达到了学习进度。
迈克尔和大家一样,我更专注于手头的工作。和大家一样,我偶尔也会查看谷歌学术,看看我之前的论文是否被引用,但这主要是出于好奇。我大部分时间都沉浸在学生们的研究工作中。至于如何评价当前的研究成果,一部分取决于审美——什么是优雅的,什么是不优雅的。而在日常工作中,开放式问题扮演着重要的角色。例如,学生可能会拿着一些结果图表来找我,我们会一起探讨图表出现异常的原因。总的来说,在我们的工作中,我们不断地尝试去理解那些我们尚未理解的事物。
事务内存
维塔利或许我们应该稍微谈谈事务内存?
迈克尔我觉得至少应该简单提一下,因为我在这方面投入了很多精力。这是我发表文章最多的主题。但奇怪的是,我一直对事务内存持怀疑态度。在我看来, (M. Herlihy 和 J.E.B. Moss)的论文发表于时代之前。在 20 世纪 90 年代初,他们提出事务内存可以帮助那些从事多线程数据结构开发的优秀程序员,从而使这些结构能够作为库供普通程序员使用。换句话说,这对 Doug Lees 开发 JSR 166 来说将是一大福音。但事务内存的初衷并非简化多线程编程。然而,在 21 世纪初它开始流行时,人们却恰恰这样看待它。它被吹捧为解决并行编程难题的途径。在我看来,这种观点始终行不通。事务内存只能简化并行数据结构的编写。而这,在我看来,正是它最终取得的成就。
编写多线程代码的复杂性
阿列克谢非常有趣。看来普通程序员和能够编写多线程代码的程序员之间存在一定的门槛。去年,我曾多次与一些算法框架的开发者交流,例如 Martin Thompson,以及一些从事多线程库开发的程序员。(编者注:Martin Thompson 是一位非常知名的开发者;他曾撰写过……) и 而且他还有 在我们的 Joker 2015 大会上,视频录制 他还是一样。 本次会议, (也易于访问)。据他们说,主要挑战在于如何让算法既快速又易于使用。因此,他们正努力克服这一障碍,并吸引尽可能多的人进入这个领域。您对此有何看法?
迈克尔这是多线程的主要问题:如何在不增加系统复杂性的情况下实现高性能。
阿列克谢因为当他们试图避免复杂性时,算法的通用性就会降低。
迈克尔关键在于设计合理的抽象。我认为这是计算机系统领域的核心所在。巴特勒·兰普森喜欢用“抽象商人”这个词来形容我们。如今,简单的技术并不存在。我们使用的处理器包含10亿个晶体管——简单性根本不可能。与此同时,指令集架构(ISA)比处理器本身要简单得多,因为我们投入了大量精力来确保其高性能和相对简单的接口。但即便如此,也并非一帆风顺。目前市面上出现的加速器也面临着同样的问题。问题随之而来:如何为GPU、加密引擎、压缩引擎、转码引擎、线性代数引擎,甚至是更灵活的FPGA创建合适的接口?如何创建一个既能确保易用性又能隐藏复杂性的接口?不是要消除复杂性,而是要将其对普通程序员隐藏起来。
阿列克谢我明白我们理解抽象概念仍然存在障碍。以内存模型为例;在我们目前的科技发展阶段,它是最重要的抽象概念之一。它将所有程序员分为两类:大多数人——不理解它的人,以及少数人——理解它或自认为理解它的人。
迈克尔这是一个好问题——我们当中真的有人理解记忆模型吗?
维塔利尤其是在 C++ 中。
迈克尔找个时间和汉斯·伯姆聊聊。他是我认识的最聪明的人之一,也是记忆模型领域的权威专家。他会坦诚地告诉你,他对很多东西也并不完全理解。但回到抽象的概念,我认为过去30年来记忆模型领域最重要的思想是由……提出的。 (编者注:完整的出版物列表可供查阅) ).
阿列克谢我的问题是:这种障碍是否源于概念本身的性质?
迈克尔不。Sarita 的结论是,只要方法得当,就能成功隐藏所有复杂性,实现高性能,并为程序员提供简洁的 API。而且,如果遵循这个 API,就能实现顺序一致性。我认为这才是正确的模型。编写没有数据竞争的代码就能获得顺序一致性。当然,为了降低数据竞争的可能性,你需要一些专门的工具,但这又是另一个话题了。
弗拉基米尔在你的职业生涯中,是否遇到过看似已解决的问题突然演变成灾难,或者最终发现根本无法解决的情况?例如,理论上,我们可以分解任何数或判断任何数是否为质数。但实际上,这可能非常困难;以目前的硬件条件,分解数都很困难。你是否遇到过类似的情况?
迈克尔我一时想不出类似的例子。有时候我觉得某个领域已经没有什么可做的了,但之后总会有新的、有趣的事情发生。比如,我曾经认为无限队列领域已经发展成熟。在对MNS队列进行了一些改进之后,似乎没有什么特别的事情发生了。然后,Morrison(Adam Morrison)和Afek(Yehuda Afek)发明了…… 很明显,无限多线程队列是可行的,而且大多数情况下,关键路径上只有取指加递增指令。这使得性能提升了一个数量级。并非我们之前不知道取指加递增指令非常有用。埃里克·弗罗伊登塔尔在20世纪80年代末与艾伦·戈特利布合著的关于超级计算机的论文中就提到过这一点,但那篇论文讨论的是有限队列。莫里森和阿费克成功地在无限队列中使用了取指加递增指令。
新架构:事务内存即将取得胜利吗?
弗拉基米尔您是否关注可能对算法有用的新架构解决方案?
迈克尔当然,有很多事情我希望能够得到落实。
弗拉基米尔例如,哪些?
迈克尔首先,我想对英特尔和IBM处理器中的硬件级事务内存做一些简单的扩展。具体来说,我希望非事务性的加载和存储操作能够在事务内部立即执行。它们会立即导致“先行事件”序列中的循环,因此处理起来比较棘手。但如果我们保持抽象层,那么在事务进行期间,我们可以在事务外部执行许多非常有趣的操作。我不知道实现起来有多难,但这将非常有用。
另一个实用功能是从远程内存加载缓存。我认为这项技术迟早会实现。这项技术将允许创建具有解耦内存的系统。例如,可以将 100 TB 的非易失性内存存储在机架中,操作系统将动态决定将内存的哪些部分映射到处理器的物理地址空间。这对云计算来说非常有用,因为它允许将大量内存分配给需要的任务。我认为最终会有人实现这项技术。
维塔利关于事务内存的讨论到此结束,我还有一个相关问题。事务内存最终会取代标准的多线程数据结构吗?
迈克尔不。事务是一种推测机制。在编程层面上,它们是原子锁,但在内部,它们是推测。这种预测只有在大多数猜测都正确的情况下才有效。这就是为什么事务内存适用于线程间交互极少的情况,你只需要确保没有交互即可。但如果消息在线程间传递,事务就几乎没什么用了。让我澄清一下:我们讨论的是事务包裹整个原子操作的情况。它们仍然可以成功地用作构建多线程数据结构的基础模块。例如,如果你需要一个三字 CAS 算法,并且需要在同时运行二十个线程的真正多线程算法中,用多线程处理三个小步骤。简而言之,事务可能有用,但它们并不能取代正确设计多线程数据结构的必要性。
非易失性存储器、傲腾DIMM、超高速器件。
维塔利最后我想和您探讨一下您目前的研究课题:非易失性存储器。在这个领域,近期内我们能期待些什么?您是否了解任何现有的高效实现方案?
迈克尔我不是硬件专家,我只知道新闻报道和同事们告诉我的信息。大家都已经听说英特尔正在出售 它们的读取延迟大约是动态随机存取存储器(DRAM)的3倍,写入延迟大约是DRAM的10倍。它们很快就会以超大容量面世。想想看,一台笔记本电脑就能拥有几TB的字节寻址内存,这真是令人兴奋。很有可能在10年后,我们会像使用DRAM一样使用这项新技术——不断增加容量。但非易失性开启了全新的可能性。我们可以从根本上改变存储堆栈,使字节寻址的工作内存和块结构化的持久内存之间不再分离。这意味着我们不必将所有需要的数据序列化到块结构化的文件中——只需在程序运行之间传输即可。这对操作系统、运行时环境和分布式数据存储有着许多重要的意义。这是一个非常有趣的研究领域。就我个人而言,我很难预测这一切最终会走向何方,但这里的问题确实非常有趣。这里可能会发生革命性的变化,而且这些变化很自然地源于多线程技术的研究,因为崩溃恢复是一个与系统正常运行并行的“多线程”过程。
我目前研究的第二个主要课题是管理超高速设备,并利用系统级策略控制从用户空间安全地访问它们。近年来,将设备访问转移到用户空间已成为一种趋势。这是因为内核的 TCP/IP 协议栈无法在每 5 微秒就需要发送新数据包的网络接口上运行;它根本跟不上。因此,厂商提供了对设备的直接访问。然而,这意味着操作系统失去了对进程的控制,并且无法确保其他应用程序能够正确访问设备。我们的研究小组认为这种缺陷是可以避免的。我们将在本月的 USENIX ATC 会议上发表一篇关于此主题的论文。这与持久性研究相关,因为持久的、字节寻址的持久内存本质上是一种具有超高速 I/O 的设备,需要在用户空间进行访问。这些研究为微内核、外内核以及其他将功能从操作系统内核安全地转移到用户空间的传统尝试提供了新的方法。
弗拉基米尔字节寻址存储器固然好,但它存在一个物理极限——光速。这意味着与设备交互时不可避免地会存在延迟。
迈克尔完全正确。
弗拉基米尔现有产能是否足以应对新增负荷?
迈克尔这是一个很好的问题,但我很难回答。内存处理的概念由来已久,它非常有趣,但也非常复杂。我没有从事过这方面的研究,但如果能取得一些新的发现,那就太好了。恐怕我没有什么可以补充的了。
弗拉基米尔还有一个问题。容量更大的新内存无法装入CPU内部。因此,由于物理限制,这部分内存必须隔离。
迈克尔在这里,一切都取决于集成电路生产过程中的缺陷数量。如果能够制造出完全没有缺陷的半导体晶圆,那么就可以用它们制造出完整的微芯片。但目前,我们甚至无法制造出比邮票还大的微芯片。
弗拉基米尔但我们讨论的仍然是巨大的尺寸,以厘米为单位。这必然会影响延迟。
迈克尔是的。光速是无法改变的。
弗拉基米尔: 很遗憾。
下一个重大趋势:双重数据结构。Hydra。
维塔利据我了解,您总是能迅速接受新趋势。您是最早从事事务内存研究的人之一,也是最早从事非易失性内存研究的人之一。您认为下一个重大趋势会是什么?或者这或许是个秘密?
迈克尔说实话,我也不知道。我希望当新的领域出现时,我能及时发现。我还没能凭借一己之力开创任何新领域,但我很幸运地抢先一步应用了其他人创建的新领域。我希望将来也能继续这样做。
阿列克谢本次采访的最后一个问题是关于您在 Hydra 大会上的演讲以及您在学校的课程。如果我理解正确的话,您在学校的演讲将是关于无锁算法,而您在会议上的演讲将是关于对偶数据结构。您能否简要介绍一下这两次演讲?
迈克尔我们在这次采访中已经谈到了一些相关话题。这涉及到我和我的学生 Bill Scherer 一起做的研究。他以此为题撰写了博士论文,Doug Lee 也参与了贡献,最终它成为了 Java 库中多线程同步队列的一部分。假设你正在对一个数据结构进行读写操作,但没有加锁,这意味着每个操作的关键路径上的指令数量有限。如果你尝试从一个空容器中检索数据,或者尝试检索容器中不存在的特定数据,你会立即被告知操作无法完成。但如果某个线程确实需要这些数据,这种行为就令人无法接受。首先想到的方法是创建一个循环,不断询问所需数据是否已到达。但这会干扰其他线程。此外,使用这种方法,你可能要等待 10 分钟,然后某个线程可能会意外地先一步获取到所需数据。双数据结构虽然仍然缺少锁机制,但它们允许线程进行适当的等待。 “双重”指的是该结构既包含数据,也包含数据请求——我们称之为反数据。因此,如果您尝试从一个空容器中检索数据,容器中将放入一个请求。这样,线程就可以等待请求而不会干扰其他线程。此外,该数据结构会优先处理请求,并在收到请求后将其传递给相应的线程。这形成了一种无锁机制,该机制具有正式规范,并且在实践中表现出良好的性能。
阿列克谢您对这种数据结构有何期望?它能否在所有典型情况下提升性能,还是更适合某些特定情况?
迈克尔首先,当需要一个无锁容器时,其次,当需要从容器中检索尚未加载的数据时,等待是必要的,那么这种结构就非常有用。据我所知,当满足这两个条件时,我们的结构能够提供最佳性能。因此,我建议在这些情况下使用它。无锁数据结构的主要优势在于它们可以避免性能问题。而在许多算法中,当数据在不同线程之间传输时,等待至关重要。
维塔利让我确认一下:你在学校和会议上谈论的内容会是同一件事吗?
迈克尔在学校 本节课将重点讲解多线程数据结构,首先会简要介绍其基本原理。我假设听众已经了解线程的概念以及锁的相关知识。在此基础上,我将讨论无锁数据结构。我会概述该领域最重要的几个问题,并涉及内存管理等主题。我认为不会涉及比 MS 队列更复杂的内容。
阿列克谢你们学校计划在课程结束时讲授双数据结构吗?
迈克尔我会提到它们,但不会花太多时间。我会在 Hydra 会议上专门讲解它们。演讲内容将涵盖最终成为 Java 一部分的项目,以及我与 Joe Israelevich 合作创建的 LCRQ 双队列变体,以及为双数据结构创建近乎通用构造的过程。
阿列克谢所以,学校的讲座适合初学者,而Hydra上的对偶数据结构讲座则适合有一定经验的人?
迈克尔如果我理解有误请指正,但 Hydra 的受众群体将非常多元化,包括许多 Java 专家和不专门从事多线程编程的人。
维塔利是的,没错。
阿列克谢至少我们希望如此。
迈克尔在这种情况下,我将面临与我们开始这次采访时相同的问题:如何制作一份既包含足够丰富的技术细节又能让所有听众理解的报道。
维塔利你会像讲课一样进行演讲吗?也就是说,你会与听众互动并根据情况调整演讲内容吗?
迈克尔恐怕行不通,因为演示文稿需要用到幻灯片。当听众最初使用不同的语言时,幻灯片就显得尤为重要。很多人可能难以听懂我的英语,尤其是我语速过快的时候。我特意选择这些主题是因为 他邀请我在SPTDC学校讲授无锁数据结构;之后他们又需要为Java用户组大会做演讲,我想选择一些Java程序员特别感兴趣的内容。最简单的办法就是谈谈我曾经参与开发的Java库的特性。
阿列克谢我们假设 Hydra 的听众已经对无锁编程有所了解,或许还具备一些相关经验。但这只是我们的假设;实际情况会在大会上更加明朗。无论如何,感谢您抽出时间。我相信我们的读者会觉得这次采访非常有趣。非常感谢!
维塔利:谢谢。
迈克尔我很高兴能在圣彼得堡见到你。
阿列克谢我们这里也有一个美丽的城市。你来过这里吗?
迈克尔不,我甚至从未去过俄罗斯。但圣彼得堡一直是我很想去但还没去过的地方之一,所以收到邀请时我非常激动。
阿列克谢顺便一提,我们会为演讲嘉宾安排参观行程。非常感谢您接受采访,祝您愉快!
您可以在2019年7月11日至12日在圣彼得堡举行的Hydra 2019会议上继续与Michael进行交流。他将在会上作报告。 。 可以购买门票 .
来源: habr.com
