QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

新的 Scala Actor 类型系统——谁说竞争安全与性能不可兼得

  • 2009-08-02
  • 本文字数:2242 字

    阅读完需:约 7 分钟

Philipp Haller 和 Martin Odersky 发表了一篇论文。论文中介绍了一种新的方法,可以保证Scala Actor 模型的实现能够进行安全的消息传输。尽管基于消息的并发有利于构建可伸缩的支持并发进程的体系架构,但是它其实暗含了一项重要的权衡,一方面是性能与功能(灵活度),另一方面则是竞争安全。

在理想的情况下,一个被发送出去的消息应该是“从发送者的一段内存区域(可能不是连贯地)移动到接收者的一段内存区域中”。但是,由于临界代码对性 能具有很苛刻的要求,因此消息必须传递于“运行在相同的共享存储的计算机的不同进程之间”。这些“临界代码需要处理大数据量的消息,比如图像处理管线或者 网络协议栈”。为了避免在这种情况下的数据竞争,应该对消息的特征进行一些限制:它们必须是不可变的,或者是别名自由(alias-free)的。然而, 这样肯定会对性能产生消极的影响,因为“存储在对象图中的数据如果不满足特定的约束,那么首先必须要被序列化为一种合法的形式,然后才能存储在消息中发送 出去。”

Scala 的 Actor 与 Erlang 的不同,前者可以是任意类型:不可变的或者可变的,并且在“同一机器上的不同 Actor 之间传递消息时”,不 会复制它们的状态。这样的确可以获得一些性能和灵活性上的优势,但是对于确保共享内存的竞争安全就要面临挑战了。到目前为止,竞争安全并不是程序库的设计 语言所强制要求的特性,而只是编程约定,这些约定限制了消息传递机制的能力(capabilities)。

为了减少所需的约束条件,Haller 和 Odersky 提出了一种基于能力检查(比如对象的访问权限)和外部唯一性的类型系统。外部唯一性可以“用 来控制被传送对象的别名”,并且可以确保引用的唯一性。他们还深入讨论了引用唯一性的概念,认为在各种基于消息的并发方式中,引用唯一性是确保竞争安全的 核心因素。他们给出了一个例子,其中一个 Actor“接收到一个 linked list 的引用”以及另一个 list,后者“可能是在本地构建的,也可能是从其他地方接收到的”。在程序继续之前,第二个 list 会拼接到第一个 list 上:

复制代码
actor {
receive {
case rlist: LinkedList =>
val other: LinkedList = ...
rlist.append(other)
next.send(rlist)
}
}
class Node {
var el: Object
var prev, next: Node
}
class LinkedList {
var head: Node
def append(other: LinkedList) {
if (head == null)
head = other.head
else if (other.head != null) {
var h = head
while (h.next != null) h = h.next
h.next = other.head
h.next.prev = h
}
}
}

为了能够安全地发送合并后的 list,就必须要检查“有没有引入任何 [外部] 的别名,从而破坏竞争安全”,换句话说,“到 list 的一个唯一的引用,比如 rlist,应该在调用了它的 append 方法后,依然保持唯一性。”

文章作者将满足上述特性的系统命名为“对象能力类型(Object Capability Types,OCT)”,并且还将它形式化为 EPFL Scala 编译器的扩展。为了实现它,Haller 和 Odersky 引入了一系列注释,以一种简单有效的方式添加用于类型检查的必要信息。Scala 标准 库的通用集合类的所有方法不需要改变它们的实现,就可以用这种方法实现改变。三个注释——@unique、@transient 和 @exposed——可 以用于本地变量、方法参数和方法返回结果:

复制代码
class Node {
var el: Object
var prev, next: Node
}
class LinkedList {
var head: Node
@transient
def append(other: LinkedList @unique) {
expose (this) { xl =>
val ol = localize(other, xl)
if (xl.head == null)
xl.head = ol.head
else if (ol.head != null) {
var h = xl.head
while (h.next != null) h = h.next
h.next = ol.head
h.next.prev = h
}
}
}
}

注释 @transient[…] 可以用于接收者,比如 this。这要求 this 应该是唯一的;尽管如此,调用 this 的方法并不会消耗掉 this 引 用,也就是说,调用以后,引用仍然是可用的(并且是唯一的)。这与我们的需要是一致的,即调用 append 以后,(对象)所有权的转移应该是安全的。用于 参数类型的注释 @unique 要求参数必须是唯一的。然而,它给予方法以消费参数的权利,这意味着当调用返回以后,再访问参数就是非法的了。

[…]

为了防止别名可能会破坏对象的唯一性,在对象被暴露以前,它的域必须能够被访问。

被传送的对象会包含子对象,子对象可能会以更复杂的方式获得别名。为了解决这个问题,作者引入了“簇(cluster)”的概念。尽管如此,簇并没有显式地声明“类型系统根据对象构造和被操作的方式,检查簇的属性”:

在我们的系统中,传送对象是否安全取决于通过该对象能够到达的各个对象。当且仅当对象 O2 的某个域指向另一个对象 O1,或者一个指向 O1 的对象,那么我们称 O2 可以到达 O1。我们的系统的可以保证那些标识为簇的对象图的安全转移。[…]

[它] 能够静态地保证一个对象簇在传输的过程中是外部唯一的,这样可以实现类型安全的目的。

OCT 系统除去了现有方法所必需的一些针对消息的关键约束,同时在处理大尺寸消息的应用程序中,能够兼顾竞争安全性和性能。尽管它已经实现为了 Scala 的轻量级扩展,为了更进一步地推广这种方法,Philipp Haller 和 Martin Odersky 打算引入类型推理,从而能够替开发者完成更多的事情。

查看英文原文 A Type System for Scala Actors to Enforce Race Safety Without Sacrificing Performance

2009-08-02 18:144282
用户头像

发布了 53 篇内容, 共 14.5 次阅读, 收获喜欢 2 次。

关注

评论 1 条评论

发布
用户头像
专家老师您好,我是Ryan Ding来自亮数据。我们是品牌方,寻求付费商业合作。请加我微信联系 ryanding-brd
2024-03-19 15:16 · 美国
回复
没有更多了
发现更多内容

不同类型的IT外包服务分别适合什么企业?

Ogcloud

外包 IT 外包公司 外包项目 IT 运维

WorkPlus企业数字化转型的超级APP,All in one完美解决方案

BeeWorks

实时3D渲染-定义、原理及应用

3DCAT实时渲染

实时渲染 实时云渲染

实用编程技巧:MybatisPlus结合groupby实现分组和sum求和

知识浅谈

MyBatisPlus Mybatis-Plus

世界第一!

天翼云开发者社区

云计算 性能测试

浅谈 SpringMVC 执行过程

是月月啊2023

Spring 配置解析

SQL FOREIGN KEY 约束- 保障表之间关系完整性的关键规则

小万哥

MySQL 数据库 sql 程序员 后端开发

智能工厂关键技术应用(第一、二、三讲)

工赋开发者社区

麒麟云K8s调度优化之错误重调度

麒麟云

Kubernetes 云原生 容器云 银河麒麟 银河麒麟云原生操作系统

IT外包驻场加速企业IT创新

Ogcloud

外包 IT 外包公司 外包项目 IT 运维

RocketMQ 如何保证消息不丢失

是月月啊2023

RocketMQ

2023年 - 我的程序员之旅和成长故事

Leo

#技术人的2023总结

亚信安慧AntDB数据库中级培训ACP上线,中国移动总部首批客户认证通过

亚信AntDB数据库

数据库 AntDB AntDB数据库

搭乘“低代码”快车,引领食品行业数字化转型全新升级

优秀

低代码 数字化转型

NFT 市场开发:洞察、功能和成本综合指南

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

用html+css+js做canvas烟花模拟网页动画代码

小齐写代码

巧用静默,原来真的可以告警零误报!

观测云

监控告警 静默规则

喜讯!云起无垠上榜《成长型初创企业推荐10强》

云起无垠

奇点云2023数智科技大会来了,“双12”直播见!

奇点云

操作系统 发布会 奇点云

跨境代买淘宝系统,跨境代采系统,淘宝代购系统,淘宝代购集运系统

tbapi

淘宝代购系统 淘宝代购 淘宝代购集运系统 淘宝代采系统

软件测试/测试开发/人工智能丨利用ChatGPT编写测试用例

测试人

搜狐智能媒体基于腾讯云大数据 EMR 的降本增效之路

腾讯云大数据

EMR

2023工作总结怎么写?保姆级的年终总结万能公式来了,助你一臂之力!

彭宏豪95

互联网 职场 年终总结 在线白板 工作总结

程序员职业规划-实践篇

吳先森321

程序人生 职业规划 求职

HashiCorp白皮书:平台团队最佳实践

杨振涛

DevOps 平台 平台工程 内部开发者平台 PECommunity

《钢岚》今日首发,成为首款基于HarmonyOS NEXT开发的战棋新游

最新动态

Rusty Tuesday :Rust 基金会一行来访 Databend Labs,共话技术创新!

Databend

平台工程动态 Monthly News 2023-11

杨振涛

平台 平台工程 平台工程社区 PECommunity 内部开发者社区

CAS原理,看这一篇就够了!

是月月啊2023

CAS Java 面试题

燃!中国电信天翼云黑科技为智慧海关建设插上云翅膀!

天翼云开发者社区

人工智能 云计算 海关科技装备博览会

新的Scala Actor类型系统——谁说竞争安全与性能不可兼得_Java_Sadek Drobi_InfoQ精选文章