为什么我们需要STM(Software Transactional Memory)

简介: update: 2013-8-20从pypy的博客上看,他们早已实现了STM版的pypy:http://morepypy.blogspot.com/2013/08/update-on-stm.html,不过,貌似还有很多问题。

update: 2013-8-20

从pypy的博客上看,他们早已实现了STM版的pypy:http://morepypy.blogspot.com/2013/08/update-on-stm.html,不过,貌似还有很多问题。

最近看到一个国内牛人的博客:http://www.cnblogs.com/coryxie/,上面有很多关于无锁算法,STM的东东。

才知道原来无论是软件事务内存,还是硬件事务内存,都早有实现了。。

---------------------------------------------------------------------------------

原文:http://morepypy.blogspot.com/2011/08/we-need-software-transactional-memory.html

这是pypy开发者写的一篇blog,里面提到了Python,Java等多线程实现的情况,还有一个很有意思的东东:STM(Software Transactional Memory)。

简单记录下一些心得和想法(很可能有不对的地方:)  )。

大部分脚本语言都没有多线程机制(支持coroutine,但这实际上是单线程执行的)。why?

为什么Java能原生地支持多线程?为什么在执行那些错误的不同步的多线程代码时JVM不会崩溃?

我们都知道,像C/C++如果执行错误的不同步的多线程代码,程序很容易崩溃。因为指针什么的,多个线程一起乱搞,内存马上就乱了,程序自然也溃崩了。

程序运行的虚拟机必须要提供这样的保证:
当一个线程在读或者写一个对象时,有另一个线程在写这个对象,
程序只会读到旧的对象,或者新的对象,不会出现除此之外的情况(即读取到另一个线程写了一半的数据等)。
并且,虚拟机不会crash(即使用户写了错误的代码)。


首先考虑Java的实现,因为Java并没有内置的list和dict,对于java.util.HashMap,并不保证多线程的安全性(尽管可能抛出一个异常,但是这个异常是HashMap的代码中抛出的,非语言本身的机制)。所以在Java中,只要解决对象的引用即可。而在32位机器上,CPU保证4字节的读写原子性,所以Java不用加锁,如果修改对象,直接修改引用的即可。

再考虑Python,Python原生支持list和dict,所以它必须要提供对这两者原子性的操作(当然还有其它的一些东东也要支持原子操作)。比如dict的get和remove操作,如果不是原子性的,那么在多线程情况下,dict就会被破坏。

来看下python解析器是怎样实现的:

CPython使用GIL(Global Interpreter Lock),为每块bytecode加锁,大约是100条(有很多人对CPython有误解,以为它只能单线程执行,实际上它是可以多线程运行的)。
jpython利用java级的锁,为每一个需要的操作都加锁。因为Java的优化很牛B了,所以效率还可以接受(为什么不用C来实现这个,或者说CPython为什么不也这么做,因为要做很多的工作,而且很可能会带来很多微妙的bug)。
pypy 和Cpython类似。


STM是什么

STM有点像数据库的事务,不过STM是对于程序执行来说的,大概是这样的一个过程:

在程序开始执行"bytecode"时,先开启一个事务,用一个ThreadLocal的东东来记录事务中的log

记录读取的所有的对象和修改对象的记录

在上面的过程中“探测”有没有修改,比如检查一个对象的最后修改时间是否和事务开始时一致。

如果执行到"bytecode"的最后,没有发现修改,则把修改的内存"commit",如果有修改,则"rollback"。

换一个说法,就是在CPython的开始获得CIL时,开始事务,在释放CIL时,提交事务。

在CPython调用系统调用时(释放CIL),结束事务,在系统调用结束时(获得CIL),开始事务。


话说STM的确是个很有意思的东东。不过pypy目前还没有实现,不知道效率会怎样。

不过我个人感觉,这东东即使实现了,恐怕效率也很难跟得上。想像一个有数百个线程的统计程序,共享一个结果变量count,这样的话,基本每次执行的代码都要"rollback",这样比单线程更悲剧。


相关文章
|
10月前
用IAR打开STM8时,出现“Unable to create configuration 'Debug' using tool chain ‘STM8’
用IAR打开STM8时,出现“Unable to create configuration 'Debug' using tool chain ‘STM8’
234 0
|
10月前
|
存储 缓存 固态存储
Managing Non-Volatile Memory in Database Systems
Managing Non-Volatile Memory in Database Systems
63 0
How to assign free areas? | Operating system principle
How to assign free areas? | Operating system principle
41 0
SAP BSP set server cache via CL_BSP_UTILITY-SET_BROWSER_CACHE
SAP BSP set server cache via CL_BSP_UTILITY-SET_BROWSER_CACHE
SAP BSP set server cache via CL_BSP_UTILITY-SET_BROWSER_CACHE
|
SQL 索引 存储
Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues
原文:Troubleshooting SQL Server RESOURCE_SEMAPHORE Waittype Memory Issues    前言: 本文是对博客https://www.mssqltips.com/sqlservertip/2827/troubleshooting-sql-server-resourcesemaphore-waittype-memory-issues/的翻译,本文基本直译,部分地方读起来有点不自然。
1082 0