zoukankan      html  css  js  c++  java
  • 如何更直观理解进程、线程、事务的概念

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

  • 相关阅读:
    SAP S/4HANA extensibility扩展原理介绍
    SAP CRM系统订单模型的设计与实现
    使用nodejs代码在SAP C4C里创建Individual customer
    SAP Cloud for Customer Account和individual customer的区别
    Let the Balloon Rise map一个数组
    How Many Tables 简单并查集
    Heap Operations 优先队列
    Arpa’s obvious problem and Mehrdad’s terrible solution 思维
    Passing the Message 单调栈两次
    The Suspects 并查集
  • 原文地址:https://www.cnblogs.com/xinchrome/p/4872428.html
Copyright © 2011-2022 走看看