首页 > 编程语言 > 详细

进程、线程、协程

时间:2020-12-03 21:58:36      阅读:35      评论:0      收藏:0      [点我收藏+]

什么是进程

进程-操作系统提供的抽象概念,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

程序是指令、数据及其组织形式的描述,进程是程序的实体。

程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程。

 

进程-操作系统提供的抽象概念,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程。

技术分享图片

 

 

 操作系统对进程的控制和管理通过PCB(Processing Control Block),PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息(进程标识号,进程状态,进程优先级,文件系统指针以及各个寄存器的内容等),进程的PCB是系统感知进程的唯一实体。

一个进程至少具有5种基本状态:初始态、执行状态、等待(阻塞)状态、就绪状态、终止状态

  • 初始状态:进程刚被创建,由于其他进程正占有CPU所以得不到执行,只能处于初始状态。

  • 执行状态:任意时刻处于执行状态的进程只能有一个。

  • 就绪状态:只有处于就绪状态的经过调度才能到执行状态

  • 等待状态:进程等待某件事件完成

  • 停止状态:进程结束

 

进程间的切换

无论是在多核还是单核系统中,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。

操作系统对把CPU控制权在不同进程之间交换执行的机制成为上下文切换(context switch),即保存当前进程的上下文,恢复新进程的上下文,然后将CPU控制权转移到新进程,新进程就会从上次停止的地方开始。因此,进程是轮流使用CPU的,CPU被若干进程共享,使用某种调度算法来决定何时停止一个进程,并转而为另一个进程提供服务。

 

1.单核CPU双进程的情况

技术分享图片

 

进程直接特定的机制和遇到I/O中断的情况下,进行上下文切换,轮流使用CPU资源

 

2.双核CPU双进程的情况 

技术分享图片

 

 

 每一个进程独占一个CPU核心资源,在处理I/O请求的时候,CPU处于阻塞状态

 

 

进程间数据共享

系统中的进程与其他进程共享CPU和主存资源,为了更好的管理主存,现在系统提供了一种对主存的抽象概念,即为虚拟存储器(VM)。它是一个抽象的概念,它为每一个进程提供了一个假象,即每个进程都在独占地使用主存。

 

虚拟存储器主要提供了三个能力: 

  • 将主存看成是一个存储在磁盘上的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,更高效地使用主存

  • 为每个进程提供了一致的地址空间,从而简化了存储器管理

  • 保护了每个进程的地址空间不被其他进程破坏

由于进程拥有自己独占的虚拟地址空间,CPU通过地址翻译将虚拟地址转换成真实的物理地址,每个进程只能访问自己的地址空间。因此,在没有其他机制(进程间通信)的辅助下,进程之间是无法共享数据的

 

 

什么是线程

线程-也是操作系统提供的抽象概念,是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。

一个进程可以有一个或多个线程,同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。

但同一进程中的多个线程有各自的调用栈和线程本地存储(如下图所示)。

 技术分享图片

 

 

 系统利用PCB来完成对进程的控制和管理。同样,系统为线程分配一个线程控制块TCB(Thread Control Block),将所有用于控制和管理线程的信息记录在线程的控制块中,TCB中通常包括:

  • 线程标志符

  • 一组寄存器

  • 线程运行状态

  • 优先级

  • 线程专有存储区

  • 信号屏蔽

和进程一样,线程同样有五种状态:初始态、执行状态、等待(阻塞)状态、就绪状态和终止状态,线程之间的切换和进程一样也需要上下文切换。

 

进程和线程之间有许多相似的地方,那它们之间到底有什么区别呢?

 

进程 VS 线程

  • 进程是资源的分配和调度的独立单元。进程拥有完整的虚拟地址空间,当发生进程切换时,不同的进程拥有不同的虚拟地址空间。而同一进程的多个线程是可以共享同一地址空间

  • 线程是CPU调度的基本单元,一个进程包含若干线程。

  • 线程比进程小,基本上不拥有系统资源。线程的创建和销毁所需要的时间比进程小很多

  • 由于线程之间能够共享地址空间,因此,需要考虑同步和互斥操作

  • 一个线程的意外终止会影像整个进程的正常运行,但是一个进程的意外终止不会影像其他的进程的运行。因此,多进程程序安全性更高。

总之,多进程程序安全性高,进程切换开销大,效率低;多线程程序维护成本高,线程切换开销小,效率高。(python的多线程是伪多线程,下文中将详细介绍)

 

什么是协程

协程(Coroutine,又称微线程)是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制。协程与线程以及进程的关系见下图所示。

  • 协程可以比作子程序,但执行过程中,子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。协程之间的切换不需要涉及任何系统调用或任何阻塞调用

  • 协程只在一个线程中执行,是子程序之间的切换,发生在用户态上。而且,线程的阻塞状态是由操作系统内核来完成,发生在内核态上,因此协程相比线程节省线程创建和切换的开销

  • 协程中不存在同时写变量冲突,因此,也就不需要用来守卫关键区块的同步性原语,比如互斥锁、信号量等,并且不需要来自操作系统的支持。

协程适用于IO阻塞且需要大量并发的场景,当发生IO阻塞,由协程的调度器进行调度,通过将数据流yield掉,并且记录当前栈上的数据,阻塞完后立刻再通过线程恢复栈,并把阻塞的结果放到这个线程上去运行。

 

 

什么是DMA

DMA(Direct Memory Access)是系统中的一个特殊设备,它可以协调完成内存到设备间的数据传输,中间过程不需要CPU介入。

以文件写入为例:

  • 进程p1发出数据写入磁盘文件的请求

  • CPU处理写入请求,通过编程告诉DMA引擎数据在内存的位置,要写入数据的大小以及目标设备等信息

  • CPU处理其他进程p2的请求,DMA负责将内存数据写入到设备中

  • DMA完成数据传输,中断CPU

  • CPU从p2上下文切换到p1,继续执行p1

 

进程、线程、协程

原文:https://www.cnblogs.com/seamanwang/p/14082237.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!