`
- 浏览:
428044 次
- 性别:
- 来自:
上海
-
引用
多线程模型是主流的并发编程模型。在过去几十年来,多线程模型一直是开发并发程序的有力工具。然而,它的历史并非总那么美好。1997年,NASA 的“火星探路者”号在执行任务的途中遭遇了严重的时序异常(参见 “What really happend on Mars“,注目 follow-up 中的现身说法),无法发回探测数据。如果不是 NASA 远程刷新了程序,它的结局就只能是报废在火星上。这一切都是由程序中潜藏的一个优先级反转 bug 造成的。更早的例子还有80年代的一系列 Therac-25 型医用粒子加速器事故。在这些加速器释放出的过量辐射照射之下,数位病人死亡。事后调查显示,至少有一次发生事故的原因,是加速器的控制软件中,存在一个只能由特定操作序列引发的竞争条件 bug。你也许认为这些只是陈年往事,但是直到现在,即便是世界500强公司们高价买来的信息系统,也同样避免不了这些问题。这导致许多程序员认为线程是个潘多拉魔盒,对它采取能躲就躲的态度。然而近来计算机的发展使得躲猫猫的空间越来越小:随便从市场上淘一个CPU,它里面也有不止一个核心。未来的程序员只会有越来越多的机会接触到并发编程,而无法再独善其身了。
加州大学伯克利分校教授,爱德华 A. 李在2006年做了一次题为《线程的麻烦 (The Problem with Threads)》的学术报告。在报告中他提到:看上去,多线程只是对核心语言的小小扩展,甚至可以以第三方库的形式存在。但实质上,多线程程序和原有的核心语言编写的程序已经完全不同了。其原因在于,由于多线程程序可能以任意的次序交错执行,程序再也无法像顺序执行时那样产生确定的结果。多线程程序容易编写(因为写的是顺序程序),但是难分析,难调试,更容易出错。
在我的想法中,产生问题的根源,是多线程模型作为对并发问题的一个抽象,是很不完善的。抽象的实质是对问题的转换。我们可以把抽象应用于一个问题,把它转换成另一个(或许)更简单的问题来解决。解决了转换后的简单问题,就意味着解决了原有的困难问题。严格来说,一个抽象一定要保存原有问题的结构,同时去除无关细节。但是,由于我们生活的世界并没有什么东西是完全“严格”的,现实中使用的抽象有时会隐藏解决问题的关键细节,或者残留一些不该漏出来的东西。评价一个抽象的好坏,也就不止是看它能节省多少代码,和它的界面有多优美这么简单,同时还要看看在一个问题被抽象转换之后,留了下来的细节还能不能好好地解决它。
我们可以从这个意义上理解为什么线程模型是个很糟糕的抽象。一方面,对解决问题很关键的细节(如执行次序)被隐藏起来并受到了粗暴的对待。另一方面,线程模型极力兼容顺序程序的设计思想也使得如共享变量这样的,与线程不兼容的细节依然残留在程序员们的视线之内。我们无力控制程序的执行次序,而我们程序的正确性却依赖于对共享变量的有序变更。可以说,线程提供给我们的抽象简直是千疮百孔。我们还能用它干活,只是因为我们手里还有加锁机制,而它可以部分地堵上线程模型的漏洞。讽刺的是,引入加锁机制解决问题的同时,又带来了新的问题,所以我们编写多线程程序总会遇上死锁,活锁,优先级反转……等等。
同样作为并发编程问题的抽象,角色模型(Actor Model) 比线程模型好就好在,它的资源分享不像线程模型那样通过共享变量来进行。角色模型中的资源分享只能通过特定的机制(消息传递)来进行。你在角色模型里依然可能犯错误,如你可能制造死锁,也有可能造成优先级反转。但是没有共享变量就意味着没有了竞争条件,所以绝大部分资源也用不着上锁了。这样一来,原先至关重要的细节变得不那么重要,问题就这么解决了。
一般来说,在修复一个糟糕的抽象时,可以采取的策略分如下两类:
把造成问题的那部分抽象拿掉,直接露出底层的细节
换一个和底层兼容性更好的抽象模型
以 MapReduce 为例,它在解决分布式计算问题时,采取的是第一类策略。与现时流行的做法相反,MapReduce 并不试图制造计算是在单一场所完成的假象(流行话讲叫“云计算”),相反它需要程序员自己把问题拆分到集群中不同的机器上。同时,它却隐藏了大量其他细节。这种另类策略导致批评 MapReduce “太底层,不通用” 的声音不绝于耳, 然而这正是 MapReduce 聪明的地方。它放弃面面俱到,集中精力于高效地解决一小类问题(这类问题与排序问题有类似的结构),同时对其他的问题故意视而不见。它的流行证明了这一策略的成功。
角色模型,通信进程(Communicating Sequential Processes, CSP),以及函数式编程(FP)在应对并发编程问题时不约而同地选择了第二类策略。它们采用了与并发兼容性更好的抽象。角色模型与通信进程从线程模型的问题中抹去了共享变量,纯粹 FP 则抹掉了“变量”的可变性。CSP 还可以降低程序执行次序的不确定性(因为在CSP中执行次序默认是确定的,不确定性必须在程序设计时显式声明)。由于这些努力,这几种模型都避免了落入线程模型的麻烦中,得到了对并发问题的更优美的解法。我们可以说,这些模型提供的抽象比线程模型的都要好。很遗憾的是,它们尽管优美,但却乏人问津。角色模型与通信进程目前不被任何主流操作系统原生支持(微软在 Windows 7 附带的新并行运行时 ConcRT 中加入了基于角色模型的 Asynchronous Agents Library,使得状况稍微改观了一点)。FP 的年岁几乎和计算机语言的历史一样古老, 但它的市场份额直到现在也小得可怜。
也许一切都是因为线程模型表面上那迷惑人的简单性,以及墨菲定律的变体:布劳尔技术惯性定律(已经成功的技术在新的,更好的技术出现时也会赖着不走)。我们曾经接纳了一个有缺点的解决方案,而现在我们被捆绑在这个方案上了。我们为线程模型写了成百上千万行的代码,而现在这些代码的重量束缚住我们的手脚,使得我们无法前行。
解决线程模型带来的问题的正确做法,是推广新的,更完善的模型。既然解决问题的阻碍同时来自于新技术的低认知度和现有代码的拖累,很自然地有两个方面的工作要做。一、使得新技术更容易被多数程序员使用,二、想办法让现有的代码和新技术兼容。
在兼容老代码这一头,我们已经有了一些行动。微软在 Windows 7 中提供一个称为用户模式调度 (UMS) 的功能。UMS 可以将内核模式的线程转换为用户模式线程,而应用程序可以自己提供一个 UMS 调度器来调度它们。这意味着,我们现在有机会重载掉系统调度器的默认行为,而根据应用自身的特点给出更合理的调度安排来。这个功能可以用在构造更容易使用的并发模型上,这样开发的模型可以与老代码兼容(但 UMS 有一个让人迷惑的限制:只能用在64bit 的Windows 7 版本上)。
同样地,在推广新技术方面,现在也有了很多成果。除了角色模型外,事务性内存(这又是一种避免竞争条件,从而避免加锁的方法)正在研究中;CSP 已经有了数个实现(如由 Kent 大学开发,针对 Java 的 JCSP),同时还有针对 CSP 的模型检证工具;至于 FP,最近因为人们认为 Web 系统的建模可以在函数式编程范式中更好的表达,FP 正在唤起人们的注意。我们缺的只剩下新技术的成功应用范例(实际上,前面的技术并不是没有成功范例,我们缺的是经验能够大规模运用的范例 ),以及一支理解这些技术的程序员大军了。对于这后一条,我甚至想,既然多线程编程唯一”容易”的事情是写代码,何不做出一种工具来让程序员们可以用写顺序程序的思维来在这些新模型中编写程序呢?这样的工具会帮助程序员利用线性程序的思维来理解代码,但是同时又让人注意到自己的改动正在影响系统的哪一部分。如果新模型的代码变得好理解了,也许更多的人会使用它们。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
影刀RPA致力于为各行业客户提供高效、灵活的自动化解决方案。能够实现PC、手机上任何软件的自动化操作,支持Windows、Linux等操作系统,以及桌面软件、Web程序和手机App的自动化。 影刀RPA的核心功能包括数据抓取、解析、校验和自动填表,还支持可视化流程设计器、Python和JavaScript脚本接入,以及流程录制等功能,帮助用户快速搭建自动化流程。影刀RPA结合AI技术,支持机器视觉、自然语言处理等高级功能,进一步提升自动化能力。影刀RPA广泛应用于电商、金融、制造等行业,帮助客户实现订单处理、客户数据录入、财务对账等任务的自动化。影刀实战,影刀证书快速获取,影刀功能定制
cloud单点登录集成
女朋友生日,突发奇想用她喜欢的表情包做了个虚拟桌宠 大家要用只需要替换一下GIF就行
大学生创业项目源码
1、文件内容:open-vm-tools-11.0.5-3.el7_9.9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf open-vm-tools-11.0.5-3.el7_9.9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
华为网路设备学习-14 (web界面中复原防火墙实验)
关键词:海滨体育馆管理,Java技术,MYSQL数据库,Spring Boot框架 1 引言 1 1.1 课题背景 1 1.2 设计原则 1 1.3 论文结构安排 2 2 系统关键技术 3 2.1 JAVA技术 3 2.2 B/S结构 3 2.3 MYSQL数据库 4 2.4 Spring Boot框架 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 经济可行性 5 3.1.3 运行可行性 5 3.1.4 法律可行性 5 3.2 系统性能分析 5 3.3 系统功能分析 6 3.4 系统流程分析 7 3.4.1 注册登录流程 7 3.4.2 添加信息流程 8 3.4.3 删除信息流程 8 4 系统设计 9 4.1 系统概要设计 9 4.2 系统结构设计 9 4.3 系统顺序图设计 10 4.4 数据库设计 10 4.4.1 数据库E-R图设计 10 4.4.2 数据库表设计 12 5 系统的实现 15 5.1 登录模块的实现 15 5.2 注册模块的实现 15 5.3 学生管理模块的实现 16 5.4 系统主界面模块的实现 16 5.5 器材管理模块
内容概要:本文档详细介绍了一个名为《Python实现基于IBES-ELM基于改进的秃鹰搜索优化算法优化极限学习机的数据回归预测》的项目。该项目旨在通过结合改进的秃鹰搜索优化算法(IBES-EO)和极限学习机(ELM),优化ELM模型以提高其预测精度,尤其针对多指标、高维数据以及噪声数据的处理进行了探讨。项目涵盖了从数据预处理到建模预测的一系列完整流程,并提供了代码案例和GUI界面设计思路。文档详细阐述了模型的工作机制、适用场景及其实现细节。 适合人群:对机器学习有兴趣,特别是对ELM、IBES-EO感兴趣的研究人员、开发人员和技术爱好者。 使用场景及目标:适用于各种回归预测问题,包括但不限于金融预测、气象预测、健康数据分析和智能交通系统等。目标在于提供一种高效的解决方案,提高在大规模复杂数据集中进行回归预测的能力,同时也展示了如何将生物启发式的优化算法运用于改进现有的机器学习模型,为实际应用提供更多可能。 阅读建议:文档按照章节顺序编排,从背景介绍到具体实现再到最终总结。初学者可以从头至尾通读,以掌握全流程概念和技能;有一定经验的读者可以直接跳转至自己感兴趣的环节,例如优化算法的具体设计或者代码实现部分。建议边学习边动手实验,以达到最佳的学习效果,并可通过提供的完整示例代码加深理解和记忆。此外,项目中有关于系统架构设计、API接口搭建等内容也可作为实际工程项目参考。
内容概要:本文介绍了一款名为智能海报设计助手的应用程序,该应用程序是一款面向大众使用的AI工具,专注于解决普通人在设计高质量海报时遇到的问题。应用程序拥有强大的创意灵感库,可以根据用户提出的特定需求(例如主题、风格偏好等),快速推荐不同类型的海报设计方案,并配备智能化的一键素材筛选系统和自动排版功能,使得整个海报制作流程更为简化、高效,即使是无设计经验的用户也能独立完成高水平的作品。 适合人群:缺乏专业设计能力的广大非专业人士,如商家营销人员、活动策划者、个体创作者。 使用场景及目标:帮助需要短时间内完成海报宣传材料准备的工作人士提高工作效率,减少人力投入的同时获得媲美专业人士水准的成品。 阅读建议:文章旨在强调此智能海报设计器对普通用户的友好性和便捷性的特点,因此重点在于理解它是怎样利用先进技术来满足一般用户的实际应用需求的,而不仅仅关注具体的操作方法。这有助于潜在用户决定是否采用这一工具来进行海报创建工作。
本文为C++ STL入门指南,详解vector、stack、map等核心容器的用法与底层原理,助你高效掌握标准模板库!
大学生创业项目源码
西门子S71511PLC实现PID程序控制阀门开度和模拟量转换:博途WinCC画面搭建完整演示,西门子S71511PLC实现PID程序控制阀门开度和模拟量转换:博途WinCC画面搭建完整演示,7自由度车辆动力学模型与联合仿真验证 软件使用:Carsim2020.0+Matlab Simulink2018b 适用场景:为了验证7自由度模型的正确性,与Carsim进行联合仿真验证,采用模块化建模方法,搭建了电机模型、参数计算、轮胎模型、7自由度动力学模型。 包含模块:电机模型模块1和2、参数计算模块、轮胎模型、7DOF模型、详细参考文献及说明文档。 包含:Matlab Simulink源码文件,详细建模说明文档,对应参考资料及相关文献, ,7自由度车辆动力学模型;联合仿真验证;Carsim2020.0;Matlab Simulink2018b;模块化建模方法;电机模型;参数计算模块;轮胎模型;详细参考文献;建模说明文档。,7自由度车辆模型联合仿真验证:Carsim2020.0与Matlab Simulink2018b应用实践
对应博客地址:https://blog.csdn.net/u011561335/article/details/146313054
大学生创业项目源码
大学生创业项目源码
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
iPhone8,1-12.3(16F156)-0002313038C3C3BA(617033133966266).shsh
org.eclipse.equinox.launcher.win32.win32.x86-64-1.2.700.v20221108-1024
本项目的异常状态预测任务聚焦于基于车辆与周围环境的相对数据,预测未来每个网格的异常状态。 预测的目标是基于当前时刻的九宫格风险矩阵状态,预测下一时刻每个网格的风险等级。 九宫格共有9个网格,每个网格可能对应低、中、高不同的异常风险状态,每个时间点的输出是一个包含9个元素的矩阵,其中每个元素表示一个网格的异常状态。 如果某些网格当前没有车辆或没有风险,在输入矩阵中用0表示为无风险的状态。例如,当前时刻的九宫格异常状态为[0, 0, 高风险, 高风险, 0, 0, 0, 0, 0],预测后的下一时刻的九宫格异常状态为[0, 0, 中风险, 中风险, 0, 低风险, 0, 0, 0]。