开门见山:我对进程、线程、事务的理解是,它们都是一个执行者。虽然在java的api里面定义了Executor类,不过我们现在谈论的执行者的概念与java语言没有关系,注意区分不要混淆。
在现代操作系统中,进程的概念特别重要,各种操作系统教材都会花不少笔墨来讲解这个概念,然而书中的定义往往很不直观甚至冗长,它们时常给出这样的描述,“操作系统资源调度的基本单位”,我不是说这样的描述有错,而是说这样的描述不直观,如果我们这样来描述:“进程是一个执行者,它负责执行被代码定义了的过程”,或者更简洁的表述为:“进程是负责执行代码的执行者”。是不是就更容易理解了呢?
程序员在编译好一段代码之后,下一步是要让CPU来执行这些代码,不过等等,这样说虽然准确,但其实掩盖了重要的进程创建过程。实际上是进程(线程)来执行这些代码,操作系统首先要创建一个进程,然后告诉这个进程,它需要去执行这一段代码,当进程获得CPU资源后,再利用CPU去执行那些代码。同一段代码可以被很多进程执行,同一个进程也可以跳转到各处执行不同的代码。我们常常将代码进行分类,也就是常说的模块化,不同的模块可以被同一个进程执行,同一个模块也可以被不同的进程执行。
线程也是执行者,它与进程的区别就是,创建每个线程之前都必须事先有一个进程与它关联,而线程可以访问它关联着的进程所占有的资源。线程与进程的关系是工厂模式的一个实例,进程是线程的制造者,而被制造出的线程必须与它的制造者关联。
DBMS中的事务也被视为执行者,它根据SQL所定义的过程,执行特定的可执行代码,并且需要满足过程执行前后数据的正确性。当然《数据库系统概念》这本书里对事务的描述是,“事务是由查询和更新语句的序列组成”[1],或者是“事务是访问并可能更新数据项的一个程序执行单元”[2],书中把事务看作是代码的集合,也就是说把执行者和代码等同起来了,这一个定义我不甚赞同。
如果用现代面向对象的观点来看待这些对象,那么它们的类图如下。当然最后还要提醒的是,这里讨论的东西和java没有关系。
线程作为执行者,它们能否执行当然要靠操作系统是否准许它执行,因为只有占用了cpu他才能执行。在事件编程中,我们可以这样理解,一个阻塞的线程监听某个事件,然后执行这个事件绑定的代码。
[1]http://book.douban.com/subject/10548379/
[2]http://book.douban.com/subject/10548379/