建议收藏 一文读懂什么是进程、线程、协程( 三 )

  • 许多操作系统内核线程调度时,上下文切换的开销较大,导致用户线程的执行效率下降 。
  •  
    建议收藏 一文读懂什么是进程、线程、协程

    文章插图
    一对一模型
    多对一模型多对一模型将多个用户线程映射到一个内核线程上,线程之间的切换由用户态的代码来进行,系统内核感受不到线程的实现方式 。用户线程的建立、同步、销毁等都在用户态中完成,不需要内核的介入 。因此相对一对一模型,多对一模型的线程上下文切换速度要快许多;此外,多对一模型对用户线程的数量几乎无限制 。
    但多对一模型也有两个缺点:
    1. 如果其中一个用户线程阻塞,那么其它所有线程都将无法执行,因为此时内核线程也随之阻塞了;
    2. 在多处理器系统上,处理器数量的增加对多对一模型的线程性能不会有明显的增加,因为所有的用户线程都映射到一个处理器上了 。
     
    建议收藏 一文读懂什么是进程、线程、协程

    文章插图
    多对一模型
    多对多模型多对多模型结合了一对一模型和多对一模型的优点,将多个用户线程映射到多个内核线程上 。由线程库负责在可用的可调度实体上调度用户线程,这使得线程的上下文切换非常快,因为它避免了系统调用 。但是增加了复杂性和优先级倒置的可能性,以及在用户态调度程序和内核调度程序之间没有广泛(且高昂)协调的次优调度 。
    多对多模型的优点有:
    1. 一个用户线程的阻塞不会导致所有线程的阻塞,因为此时还有别的内核线程被调度来执行;
    2. 多对多模型对用户线程的数量没有限制;
    3. 在多处理器的操作系统中,多对多模型的线程也能得到一定的性能提升,但提升的幅度不如一对一模型的高 。
     
    建议收藏 一文读懂什么是进程、线程、协程

    文章插图
    多对多模型
     
    在现在流行的操作系统中,大都采用多对多的模型 。
    查看进程与线程一个应用程序可能是多线程的,也可能是多进程的,如何查看呢?在Windows下我们只须打开任务管理器就能查看一个应用程序的进程和线程数 。按“Ctrl+Alt+Del”或右键快捷工具栏打开任务管理器 。
    查看进程数和线程数:
     
    建议收藏 一文读懂什么是进程、线程、协程

    文章插图
    查看线程数和进程数
     
    在“进程”选项卡下,我们可以看到一个应用程序包含的线程数 。如果一个应用程序有多个进程,我们能看到每一个进程,如在上图中,google的Chrome浏览器就有多个进程 。同时,如果打开了一个应用程序的多个实例也会有多个进程,如上图中我打开了两个cmd窗口,就有两个cmd进程 。如果看不到线程数这一列,可以再点击“查看选择列”菜单,增加监听的列 。
    查看CPU和内存的使用率:
    在性能选项卡中,我们可以查看CPU和内存的使用率,根据CPU使用记录的监视器的个数还能看出逻辑处理核心的个数,如我的双核四线程的计算机就有四个监视器 。
     
    建议收藏 一文读懂什么是进程、线程、协程

    文章插图
    查看CPU和内存的使用率
    线程的生命周期
    当线程的数量小于处理器的数量时,线程的并发是真正的并发,不同的线程运行在不同的处理器上 。但当线程的数量大于处理器的数量时,线程的并发会受到一些阻碍,此时并不是真正的并发,因为此时至少有一个处理器会运行多个线程 。
    在单个处理器运行多个线程时,并发是一种模拟出来的状态 。操作系统采用时间片轮转的方式轮流执行每一个线程 。现在,几乎所有的现代操作系统采用的都是时间片轮转的抢占式调度方式,如我们熟悉的Unix、Linux、Windows及macOS等流行的操作系统 。
    我们知道线程是程序执行的最小单位,也是任务执行的最小单位 。在早期只有进程的操作系统中,进程有五种状态,创建、就绪、运行、阻塞(等待)、退出 。早期的进程相当于现在的只有单个线程的进程,那么现在的多线程也有五种状态,现在的多线程的生命周期与早期进程的生命周期类似 。
    建议收藏 一文读懂什么是进程、线程、协程

    文章插图
    早期进程的生命周期
    进程在运行过程有三种状态:就绪、运行、阻塞,创建和退出状态描述的是进程的创建过程和退出过程 。