Python进程线程初识

进程&线程初识

进程(Process)

概念

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。

组成

进程的组成,通常包括:

  • 程序
  • 数据
  • 进程控制块

进程有其自己的地址空间,通常包括:

  • 文本区域:存储处理器执行的代码
  • 数据区域:存储变量和进程执行期间使用的动态分配的内存
  • 堆栈:存储着活动过程调用的指令和本地变量。

意义

进程是对正在运行程序过程的一种抽象,进程的意义在于方便有效的管理、调度计算机的程序。

特征

  • 动态性:进程是程序的执行过程,其产生和销毁都是动态产生的。
  • 并发性:进程间完全独立,多个进程可以并发执行各自任务。
  • 独立性:进程可以独立运行,其是独立运行的基本单位,也是系统分配资源和调度的独立单位。
  • 异步性:进程间相互制约,使其执行具有间断性,即进程按各自独立的、不可预知的速度向前推进。

进程调度

  • 概念
    进程调度是计算机的基本功能之一,其主要作用是将就绪队列中的程序进行调度,管理程序状态,使得多个程序都可以正常运行。
    进程调度流程大致如下图:

  • 常见调度算法

    • 先来先服务调度算法(FCFS)
      是最简单的调度算法,按先后顺序进行调度。
      FCFS算法比较有利于长作业,而不利于短作业,适合于CPU密集型作业,而不适合I/O密集型作业。
    • 短作业(进程)优先调度算法 (SPN)
      是指对短作业(进程)优先调度的算法。
      其调度算法是从就绪队列中依次选出预估运行时间最短的进程进行处理。
    • 优先权调度算法的类型
      是指对高权限的进程优先调度的算法。
      其调度算法是从就绪队列中依次选出预设权限最高的进程进行处理。
    • 高响应比优先调度算法 (HRRN)
      高响应比优先调度算法相比短作业优先调度算法对长作业相对友好,其为每个作业分配了动态优先权,使得作业的优先权随等待时间的增加而增加,进而可以使长作业有机会得到优先处理。
      其中,响应比 =(进程执行时间 + 进程等待时间)/ 进程执行时间。
    • 时间片轮转法 (RR)
      系统将所有就绪任务按照先来先服务的原则循序排列,每次调度则分配给任务一个固定的时间片,以此类推直至所有任务调度完成。
    • 反馈调度算法 (Feedback)
      设置多个就绪队列,多个就绪队列的优先级逐级降低,且优先级越高的队列执行时间片越小。就绪任务以先来先服务原则进入队列,首先将其放置优先级最高队列队尾,如果在该队列时间片时间内没有任务没有执行完成,便将其转入下一级队列队尾,以此类推。仅当上级队列空闲时才会执行下级队列。

创建/终止进程

  • 创建进程
    新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。
    通常创建进程的方式包括:系统初始化进程、创建子进程、用户交互创建进程、任务创建进程

  • 终止进程
    终止进程包括主动终止和被动终止,大概包括以下几种方式:正常退出、异常退出、主动杀死进程


线程

概念

线程是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。
但同一进程中的多个线程有各自的调用栈(call stack)、寄存器环境(register context)、线程本地存储(thread-local storage)。

基本状态

  • 产生(spawn)
  • 中断(block)
  • 非中断(unblock)
  • 结束(finish)

要素

  • 线程内核对象
  • 线程环境块(TEB)
  • 用户模式栈
  • 内核模式栈
  • DLL线程连接和线程分离通知

特点

  • 轻型实体:线程中拥有的资源可以最小化保证程序的独立运行
  • 独立调度和分派的基本单位
  • 共享进程资源
  • 可并发运行

线程分类

  • 内核线程

    • 内核线程可以独立运行任务,可以利用其处理异步事件。内核线程使用的资源是内核栈和上下文切换时保存寄存器的空间。
    • 支持多线程的内核叫做多线程内核(Multi-Threads kernel )。
    • 内核线程只运行在内核态,不受用户态上下文的拖累。
    • 处理器竞争:可以在全系统范围内竞争处理器资源;
    • 使用资源:唯一使用的资源是内核栈和上下文切换时保持寄存器的空间
    • 调度:调度的开销可能和进程自身差不多昂贵
    • 同步效率:资源的同步和数据共享比整个进程的数据同步和共享要低一些。
  • 轻量级线程

    • 轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。
    • 特点:轻量级线程只有一个最小的执行上下文和调度程序所需的统计信息。
    • 处理器竞争:轻量级线程是由内核支持,所以可以在全系统范围竞争处理器资源。
    • 使用资源:与父进程共享进程地址空间
    • 局限:轻量级线程的创建、同步、销毁等操作都需要系统调用,即用户态与内核态切换,所以系统调用代价较高;每个轻量级线程都需要一个内核线程支持,所以消耗内核资源较多,不宜大量创建。
  • 用户线程

    • 用户线程是基于用户空间建立的线程,其创建、同步、销毁等操作都基于用户空间,不需要消耗内核资源,所以用户线程消耗资源低,线程高效。
    • 处理器竞争:用户线程基于用户空间创建,其对于内核是透明的,所以用户线程所属的进程参与竞争处理器资源,所属进程下的所有线程竞争进程的资源。
    • 使用资源:与所属进程共享进程地址空间和系统资源。
    • 调度:用户线程在其所属进程内参数调度

并发&并行

  • Erlang 之父 Joe Armstrong 用于解释并发与并行的图示

并发计算

  • 概念
    并发(Concurrent),是一种程序计算的形式,在系统中,至少有两个以上的计算在同时运作,计算结果可能同时发生。

并行计算

  • 概念
    并行计算(Parallel)一般是指许多指令得以同时进行的计算模式。在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式来加以解决。所谓并发方式可以简单理解为多个任务交替运行,但是同一时刻只会有一个任务被执行。

同步&异步

同步

  • 概念
    同步(Synchronous)是指计算机在处理多个任务时,处理过程顺序执行,是线性执行方式。前一个任务执行完成并返回结果后才会执行下一个任务,以此类推。

异步

  • 概念
    异步(Asynchronous)是指计算机处理多个任务时,无需遵循顺序执行的方式,不需要等待任务返回结果即可开始其他任务,当任务执行完成时,使用回调的方式返回结果。

阻塞&非阻塞

阻塞

  • 概念
    进程/线程被操作系统挂起,需要等待当前任务执行完成后才可以执行其他任务。

非阻塞

  • 概念
    进程/线程被操作系统不被挂起,可以执行其他任务。