ETS 笔记

ets 笔记
  1. ets 是一张进程间可以共享的表 (pubic)
  2. ets 并不在gc的范围内
  3. 如果创建的进程死亡, 数据也会 消失。 可以通过give_away 和 hire 来使得 ets不会随着创建进程的消亡而消亡。
  4. 每个对象在查看和插入 的时候,都会导致对象的拷贝
  5. ‘$end_of_table’ 不能被用作是key
  6. set、 bag、dublicate_bag 的key 匹配是 match, 相当于 =:=, order_set 的key 匹配是equal, 相当于 == ( 没有规定 1.0 和 1的 大小关系)
ets function note

1. fun2ms(literalFun) -> MatchSpec()
词法转化器, 其中literFun 不能有 if, case , receive 等作为语法元素
2. ets: mach_spec_compile(MatchSpec) -> compiledMatchSpec
函数转化为一个 ets:match_spec_run/2 的内部形式, 非传递的, 也就是说不能转化为外部形式, 然后在进程间传递
3. ets:is_compile_ms 该函数用来检测一个已经编译的匹配描述是否是有效的。

ets options

1. read or write concurrency
1.1 write_concurrency:
默认为false, 在这种情况下,写入table将会阻塞整个表,阻止任何对于这个表的并发访问直到写入完成。
设置为true, 会对并发访问进行了优化,相同表的不同实体可以让并发的进程写入和读取。这在一定程度上是以内存消耗,顺序访问,并发读取的性能为代价来实现的。
值得注意的是:
1. 这个选项并没有改变ets对于原子性和隔离性的保证
2. 对很多对象作出原子和隔离保证的函数(比如 insert), 从这个选项中获益较少。
3. 这个选项对于 ordered_set 没有影响。

1.2 read_concurrency:
默认为false。
如果设置为true,对于同步的读取是进行过优化的。如果有smp的运行时系统支持,read操作将会很廉价;尤其是系统有多个物理处理器的时候。 然而,切换读取和写入需要花费更多。

如何使用read_concurrency:
1. 你需要在读取操作比写入操作非常频繁的时候使用他。
2. 或者并发读和写有大的读写突发的时候(也就是说,读取不被写入打断, 并且许多写入不会被读取打断) 的时候使用
3. 如果少数几次读操作,就会重复少数几次写操作, 就不应该使用这个选项,这个时候会导致性能下降。

1.3 read and write concurrency
1. write_concurrency 能够和 read_concurrency 结合在一起使用。你应该在经常大规模同步读取和大规模写入的时候,去使用他。
2. read_concurrency and write_concurrency 对于每个表而言, 内存花销是常量级的。 但是如果两个结合在一起的话, 这个花销可能会非常大

2. give_away 实验
创建进程死亡, ets 也消失
这里写图片描述
A(现在ets的拥有者) give_away ets 给 B, 杀死A, 发现ets 没有消失; 在杀死B, 发现ets
消失:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值