美文网首页
比较进程、线程和协程

比较进程、线程和协程

作者: DevilRoshan | 来源:发表于2020-03-01 23:33 被阅读0次

1 定义

进程(Process)
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 进程就是一个程序运行时候的所需要的基本资源单位(也可以说是程序运行的一个实体,一个“执行中的程序”)。

线程(Thread)
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程模型一般分三种(N:1,1:1,M:N),由用户级线程和 OS 线程的不同对应关系决定。

协程(Coroutine)
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

2 状态

2.1 进程(Process)

进程的五状态模型:
新建:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中,通常是进程控制块已经创建但是还没有加载到内存中的进程。
就绪:进程已经做好了准备,只要有机会就开始执行。
运行:该进程正在执行。
阻塞(等待):进程在某些事情发生前不能执行,等待阻塞进程的事件完成。
退出:操作系统从可执行进程组中释放出的进程,或由于自身或某种原因停止运行。

进程状态.png

-->新建:创建执行一个程序的新进程;
新建-->就绪:操作系统准备好再接纳一个进程时,把一个进程从新建态转换为就绪态;
就绪-->运行:需要选择一个新进程运行时,操作系统的调度器或分配器根据某种调度算法选择一个处于就绪态的进程;
运行-->退出:导致进程终止的原因有:正常完成、超过时限、系统无法满足进程需要的内存空间、进程试图访问不允许访问的内存单元(越界)、算术错误(如除以0或存储大于硬件可以接纳的数字)、父进程终止(操作系统可能会自动终止该进程所有的后代进程)、父进程请求终止后代进程等。
运行-->就绪:最常见的原因是,正在运行的进程到达了“允许不中断执行”的最大时间段,该把处理器的资源释放给其他在就绪态的进程使用了;还有一中原因可能是由于具有更改优先级的就绪态进程抢占了该进程的资源,使其被中断转换到就绪态。
运行-->阻塞:如果进程请求它必须等待的某些事件,例如一个无法立即得到的资源(如I/O操作),只有在获得等待的资源后才能继续进程的执行,则进入等待态(阻塞态)。
阻塞-->就绪:当等待的事件发生时,处于阻塞态的进程转换到就绪态。
就绪-->退出:在上图中没有标出这种转换,在某些进程中,父进程可以在任何时刻终止一个子进程,如果一个父进程终止,所有相关的子进程都被终止。
阻塞-->退出:跟上一项原因类似。

2.2 线程(Thread)

线程的五状态模型:
新建:使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
运行状态:如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

  • 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
  • 同步阻塞:线程在获取 synchronized同步锁失败(因为同步锁被其他线程占用)。
  • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

线程状态.png

3 通信机制

3.1 进程间的通信机制

管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动。
信号量(semophore ):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( messagequeue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 (sinal ):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存(shared memory ):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字(socket ):套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。

3.2 线程间的通信机制

锁机制:包括互斥锁、条件变量、读写锁。

  • 互斥锁提供了以排他方式防止数据结构被并发修改的方法;
  • 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用;
  • 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。

信号量机制(Semaphore):包括无名线程信号量和命名线程信号量;
信号机制(Signal):类似进程间的信号处理;

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

4 区别

4.1 进程与线程的区别

  1. 进程是资源分配的基本单位,线程是操作系统调度的基本单位;
  2. 进程切换需要的资源很最大,效率很低,线程切换需要的资源小,效率高;
  3. 线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间;
  4. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

4.2 线程与协程的区别

  1. 一个线程可以多个协程,一个进程也可以单独拥有多个协程,例如python中则能使用多核CPU;
  2. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态;
  3. 线程,切换受系统控制。协程是一种用户态的轻量级线程,协程的调度完全由用户控制,由当前协程切换到其他协程由当前协程来控制。

附:线程模型

线程模型一般分三种,由用户级线程和 OS 线程的不同对应关系决定的。

  • N:1,即全部用户线程都映射到一个OS线程上,上下文切换成本最低,但无法利用多核资源;
  • 1:1 , 一个用户线程对应到一个 OS线程上, 能利用到多核资源,但是上下文切换成本较高,这也是 Java Hotspot VM 的默认实现;
  • M:N,权衡上面两者方案,既能利用多核资源也能尽可能减少上下文切换成本,但是调度算法的实现成本偏高

相关文章

  • 比较进程、线程和协程

    1 定义 进程(Process)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分...

  • Python 线程和进程和协程总结

    Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU...

  • Python多线程、多进程和协程的实例讲解

    线程、进程和协程是什么 线程、进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实...

  • 进程、线程和协程

    概念 介绍 1.进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一...

  • 进程、线程和协程

    一、进程 1、多任务原理 多任务是指操作系统同时可以运行多个任务。 单核CPU实现多任务原理:操作系统轮流让各个任...

  • 进程、线程和协程

    1、概念 1.1、进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度...

  • 进程、线程和协程

    这三个概念是很基础也很重要的概念: 1.进程挂靠在操作系统,操作系统会以进程为单位,分配系统资源(CPU时间片、内...

  • 进程, 线程和协程

    进程: 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。 (程...

  • 进程、线程和协程

    1. 进程与线程 对于操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元 一个进程包含三个部分:代码、数...

  • 线程、进程和协程

    线程、进程和协程 进程、线程与并发 对多核的支持 实现一个线程 线程之间的通信 线程的调度和优化 为什么要学习多线...

网友评论

      本文标题:比较进程、线程和协程

      本文链接:https://www.haomeiwen.com/subject/nvsrkhtx.html