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

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

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

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

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

文章插图
早期进程的生命周期
进程在运行过程有三种状态:就绪、运行、阻塞,创建和退出状态描述的是进程的创建过程和退出过程 。
- 创建:进程正在创建,还不能运行 。操作系统在创建进程时要进行的工作包括分配和建立进程控制块表项、建立资源表格并分配资源、加载程序并建立地址空间;
推荐阅读
- 零基础入门Linux运维学习建议分享
- 月经期不建议喝茶,茉莉花茶的泡法
- 喝茶人最容易进入的6个误区,你占了几条?老茶客的经验值得收藏
- 黄芪泡水不建议天天喝,花茶不要随便喝
- 一文搞懂MySQL兄弟数据库MariaDB的安装和使用
- 值得收藏的5 个 C++ 网站
- 学习C语言的几点建议
- 铣削加工方法、策略及铣削计算公式,快收藏!
- 超实用的18个Java8日期处理的实践!建议收藏!
- 丹参不建议与茶叶起喝,茶叶与枸杞不宜起冲泡
