
文章插图
进程与线程的资源共享关系

文章插图
单线程与多线程的关系
【建议收藏 一文读懂什么是进程、线程、协程】总之,线程和进程都是一种抽象的概念,线程是一种比进程更小的抽象,线程和进程都可用于实现并发 。
在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位 。它相当于一个进程里只有一个线程,进程本身就是线程 。所以线程有时被称为轻量级进程(Lightweight Process,LWP) 。

文章插图
早期的操作系统只有进程,没有线程
后来,随着计算机的发展,对多个任务之间上下文切换的效率要求越来越高,就抽象出一个更小的概念——线程,一般一个进程会有多个(也可是一个)线程 。

文章插图
线程的出现,使得一个进程可以有多个线程
多线程与多核上面提到的时间片轮转的调度方式说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行 。很多操作系统的书都说“同一时间点只有一个任务在执行” 。那有人可能就要问双核处理器呢?难道两个核不是同时运行吗?
其实“同一时间点只有一个任务在执行”这句话是不准确的,至少它是不全面的 。那多核处理器的情况下,线程是怎样执行呢?这就需要了解内核线程 。
多核(心)处理器是指在一个处理器上集成多个运算核心从而提高计算能力,也就是有多个真正并行计算的处理核心,每一个处理核心对应一个内核线程 。
内核线程(Kernel Thread,KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上 。一般一个处理核心对应一个内核线程,比如单核处理器对应一个内核线程,双核处理器对应两个内核线程,四核处理器对应四个内核线程 。
现在的电脑一般是双核四线程、四核八线程,是采用超线程技术将一个物理处理核心模拟成两个逻辑处理核心,对应两个内核线程,所以在操作系统中看到的CPU数量是实际物理CPU数量的两倍,如你的电脑是双核四线程,打开“任务管理器性能”可以看到4个CPU的监视器,四核八线程可以看到8个CPU的监视器 。

文章插图
双核四线程在Windows8下查看的结果
超线程技术就是利用特殊的硬件指令,把一个物理芯片模拟成两个逻辑处理核心,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率 。这种超线程技术(如双核四线程)由处理器硬件的决定,同时也需要操作系统的支持才能在计算机中表现出来 。
程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Lightweight Process,LWP),轻量级进程就是我们通常意义上所讲的线程,也被叫做用户线程 。由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程 。用户线程与内核线程的对应关系有三种模型:一对一模型、多对一模型、多对多模型,在这以4个内核线程、3个用户线程为例对三种模型进行说明 。
一对一模型对于一对一模型来说,一个用户线程就唯一地对应一个内核线程(反过来不一定成立,一个内核线程不一定有对应的用户线程) 。这样,如果CPU没有采用超线程技术(如四核四线程的计算机),一个用户线程就唯一地映射到一个物理CPU的内核线程,线程之间的并发是真正的并发 。一对一模型使用户线程具有与内核线程一样的优点,一个线程因某种原因阻塞时其他线程的执行不受影响;此处,一对一模型也可以让多线程程序在多处理器的系统上有更好的表现 。
但一对一模型也有两个缺点:
- 许多操作系统限制了内核线程的数量,因此一对一模型会使用户线程的数量受到限制;
推荐阅读
- 零基础入门Linux运维学习建议分享
- 月经期不建议喝茶,茉莉花茶的泡法
- 喝茶人最容易进入的6个误区,你占了几条?老茶客的经验值得收藏
- 黄芪泡水不建议天天喝,花茶不要随便喝
- 一文搞懂MySQL兄弟数据库MariaDB的安装和使用
- 值得收藏的5 个 C++ 网站
- 学习C语言的几点建议
- 铣削加工方法、策略及铣削计算公式,快收藏!
- 超实用的18个Java8日期处理的实践!建议收藏!
- 丹参不建议与茶叶起喝,茶叶与枸杞不宜起冲泡
