如何更直观理解进程、线程、事务的概念
2015-10-12 18:14
435 查看
开门见山:我对进程、线程、事务的理解是,它们都是一个执行者。虽然在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/
在现代操作系统中,进程的概念特别重要,各种操作系统教材都会花不少笔墨来讲解这个概念,然而书中的定义往往很不直观甚至冗长,它们时常给出这样的描述,“操作系统资源调度的基本单位”,我不是说这样的描述有错,而是说这样的描述不直观,如果我们这样来描述:“进程是一个执行者,它负责执行被代码定义了的过程”,或者更简洁的表述为:“进程是负责执行代码的执行者”。是不是就更容易理解了呢?
程序员在编译好一段代码之后,下一步是要让CPU来执行这些代码,不过等等,这样说虽然准确,但其实掩盖了重要的进程创建过程。实际上是进程(线程)来执行这些代码,操作系统首先要创建一个进程,然后告诉这个进程,它需要去执行这一段代码,当进程获得CPU资源后,再利用CPU去执行那些代码。同一段代码可以被很多进程执行,同一个进程也可以跳转到各处执行不同的代码。我们常常将代码进行分类,也就是常说的模块化,不同的模块可以被同一个进程执行,同一个模块也可以被不同的进程执行。
线程也是执行者,它与进程的区别就是,创建每个线程之前都必须事先有一个进程与它关联,而线程可以访问它关联着的进程所占有的资源。线程与进程的关系是工厂模式的一个实例,进程是线程的制造者,而被制造出的线程必须与它的制造者关联。
DBMS中的事务也被视为执行者,它根据SQL所定义的过程,执行特定的可执行代码,并且需要满足过程执行前后数据的正确性。当然《数据库系统概念》这本书里对事务的描述是,“事务是由查询和更新语句的序列组成”[1],或者是“事务是访问并可能更新数据项的一个程序执行单元”[2],书中把事务看作是代码的集合,也就是说把执行者和代码等同起来了,这一个定义我不甚赞同。
如果用现代面向对象的观点来看待这些对象,那么它们的类图如下。当然最后还要提醒的是,这里讨论的东西和java没有关系。
线程作为执行者,它们能否执行当然要靠操作系统是否准许它执行,因为只有占用了cpu他才能执行。在事件编程中,我们可以这样理解,一个阻塞的线程监听某个事件,然后执行这个事件绑定的代码。
[1]http://book.douban.com/subject/10548379/
[2]http://book.douban.com/subject/10548379/
相关文章推荐
- 【五】 Chrome的插件模型
- JAVA三大框架SSH和MVC
- 【四】 Chrome的UI绘制
- Android Camera HAL3中预览preview模式下的数据流
- [PAT (Advanced Level) ]1005. Spell It Right解题文档
- jQuery右键菜单插件 jQuery ContextMenu
- Dirichlet Process Gaussian Mixture Models
- iOS 开发 是该选择Block 还是Delegate呢
- 【三】 Chrome的进程模型
- 安卓模拟器Genymotion虚拟设备启动失败问题的解决方法
- pagerank的matlab实现
- Java中Split函数的用法技巧
- MYSQL免安装配置
- [LeetCode] 136--Single Number --Medium--
- CPU亲缘性及网卡中断绑定
- 从源码安装apache httpd,并加载对php的支持
- gdb调试相关
- Java中的static关键字解析
- 关于Android工程中的主要文件夹存放的文件种类
- 判断是否第一次进入应用