• 如何更直观理解进程、线程、事务的概念


      开门见山:我对进程、线程、事务的理解是,它们都是一个执行者。虽然在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/

  • 相关阅读:
    类成员之静态字段和普通字段、静态方法和普通方法
    类的导出
    面向对象之继承
    面向对象之封装
    面向对象与函数式的对比
    计算器
    模拟信用卡登录程序
    /etc/fstab
    解决 Your project contains error(s),please fix them before running your applica ..
    C#之SqlDependency数据库缓存
  • 原文地址:https://www.cnblogs.com/xinchrome/p/4872428.html
Copyright © 2020-2023  润新知