StarkerSong Get Busy Living

在系统中引入进程和线程的分析

2016-09-12

在操作系统或者程序开发中经常遇到进程和线程的问题,但是许多人包括我自己在很多时候并没有详细了解为什么要引入进程和线程?进程和线程各自组成和属性是什么?在应用中是如何解决问题的?带着问题去理解书本上生涩的概念知识将别有一番境地。

进程引入

在早期的计算机上,只能按照指定的顺序执行,所处理的事情只能串行逐个完成,后来人们将计算机处理事情的时间分成一段一段的,模拟处理多个不同的事情,由于处理时间的建个特别短,看起来好像在同时处理。但是如果处理的事情不是相互独立的,存在某种关系,例如共同占用一些资源,那么对于这些事情处理的不同顺序将会带来不同的结果。

由于程序在并发执行时,它们将失去封闭性,并且可能造成的执行结果的不可再现性。通过引入进程来描述程序的并发执行,对进程必要的管理,以便更好地描述和控制程序的并发执行,这样就可以实现操作系统的并发性和共享性。

既然程序可以并发运行,在计算机中可能存在同一个程序的两个甚至多个运行。程序就像图书馆里的一本书,放在书架上是不占用读者的时间资源,只有在阅读时,才占用时间,确切的说占用读者时间的是读书的过程。程序是一段可执行代码的集合,需要的是存储空间,只有当运行时才占用处理器时间。因此,将程序的一次运行过程应该是处理器资源分配的基本单位,将其称为进程。每次读书都会选择一本书,同时可能会多次读同一本书,说的有些拗口,对应到计算机中就是系统中的一个进程肯定对应着一个程序,但同一个程序可以有多个进程。进程和程序是相关的,但绝不是相同的。

基本特征

  • 动态性 进程最基本的特征。
  • 并发性引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。
  • 独立性进程实体是一个独立运行、独立获得资源和独立接受调度的基本单位。
  • 异步性进程按各自独立的、不可预知的速度向前推进。
  • 结构性 程序段、数据段和进程控制段三个部分组成。

进程状态转换

状态种类

  • 运行:进程在处理机上运行
  • 就绪:进程已获得除处理机以外的一切所需资源
  • 阻塞:进程正在等待某一事件而暂停
  • 创建:进程正在被创建,尚未转到就绪状态
  • 结束:进程正从系统中消失,分为正常结束和异常结束

状态变化

  • 就绪状态–>运行状态:经过处理机调度,就绪进程得到处理机资源
  • 运行状态–>就绪状态:时间片用完或在可剥夺系统中有更高优先级进程进入
  • 运行状态–>阻塞状态:进程需要的某一资源还没准备好
  • 阻塞状态–>就绪状态:进程需要的资源已准备好

进程通信

  • 共享存储:基于数据结构的共享(低级方式)、基于存储区的共享(高级方式)
  • 消息传递:直接通信方式、间接通信方式
  • 管道通信:利用一种特殊的pipe文件连接两个进程

进程和程序的区别

  • 进程是程序在计算机上的一次执行,是动态的概念。进程的运行实体是程序,离开程序就没有存在意义。进程由程序、数据、进程控制块(PCB)三部分组成。程序是一组有序的指令集合,是静态的概念。
  • 进程是程序的一次执行过程,是动态创建和消亡的,具有一定的生命周期,是暂时存在的。程序是一组代码集合,永久存在,可长期保存。
  • 一个进程可以执行多个程序,一个程序可以构成多个进程。进程可以创建进程,但是程序不可以创建程序。
  • 进程和程序的组成不同。

创建新进程会创建新的地址空间:子进程是父进程的复制品,在fork之后子进程获得父进程的数据空间、堆和栈的复制品,而线程使用当前地址空间。

线程引入

由于进程是资源的拥有者,也就是说我在每次看书的时候都占用一本书,其他同学只能等我看完放到书架上再继续看,所以在创建、撤销、切换操作中需要较大的时空开销,限制了并发程度的进一步提高。为减少进程切换的开销,把进程作为资源分配单位和调度单位这两个属性分开处理,即进程还是作为资源分配的基本单位,但是不作为调度的基本单位(很少调度或切换),把调度执行与切换的责任交给“线程”。这样做的好处不但可以提高系统的并发度,还能适应新的对称多处理机(SMP)环境的运行,充分发挥其性能。

进程线程间的区别与联系

  • 地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
  • 通信:进程间通信(IPC)需要进程同步和互斥手段辅助,以保证数据的一致性,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。
  • 调度:线程上下文切换比进程上下文切换要快得多,系统开销小很多。
  • 资源:进程拥有资源的基本单位,线程可以访问其隶属的进程的系统资源。
  • 并发性:进程和线程都可以并发执行
  • 地址空间:进程地址空间相互独立,同一进程的各线程间共享进程资源,某进程内的线程相对于其他进程不可见。

参考资料


Comments