线程

现代的操作系统都提供了单个进程包括多个控制线程的特性。

线程,有时候称为轻量级进程(lightweight process,LWP),是CPU使用的基本单元;它包含了线程ID,程序计数器,寄存器集合以及堆栈。它与属于同一进程的其他线程共享代码段,数据段和其他的操作系统资源。

现代的应用程序通常都是一个具有多线程的独立进程。例如,Chrome浏览器。当我们用它打开一个网页的时候,它是这样工作的,一个线程从网络接受数据,另一个线程在负责显示文本或者图片,还可能有另一个线程在显示视频。这样我们看到网页的时候才不会等待很长时间。如果是单线程进程,那么它可能的执行的过程是这样的。先把所有的数据下载完成,然后再来处理文本显示和图片显示,接着处理视频文件。这样的方式显然是用户不想看到的。所以多线程的产生是必然的。

多线程编程的优点:

  1. 响应度高:一个交互式应用程序采用多线程,即使部分阻塞,它仍然能够继续执行,使用户有良好的体验。
  2. 资源共享:线程默认共享它们所属进程的内存和资源。代码共享的优点是允许一个应用程序在同一地址空间有多个不同的活动线程。
  3. 经济:创建一个新的线程和创建一个新的进程相比较会更容易。因为线程只需要切换堆栈。
  4. 多处理器的利用:多线程能使得每个线程并行运行在不同的处理器上。多线程是完美契合多处理器的。单处理器只能在线程之间快速切换来达到一个假象。但是实际上每一时刻只能运行一个线程。

用户级线程

用户级线程无需内核支持,它是通过线程库提供的创建,调度和管理的。但是这样有一个缺点,就是内核不知道用户级线程的存在。如果内核是单线程的,那么用户级线程的执行如果引起阻塞,那么将会引起整个进程阻塞。不会切换到下一个进程。

内核级线程

内核级线程由操作系统直接支持,内核在其空间内执行线程创建,调度和管理。由于线程也要在内核中注册,所以比起用户级线程,内核级线程的创建和管理要慢一些。但是好处是当一个线程阻塞时,内核能调度该进程内的另外一个线程来执行。而不是直接导致该进程阻塞,切换到下一个进程去执行。

多线程模型

  1. 多对一模型 将多个线程映射到内核线程。线程管理在用户态进行,但是容易引起阻塞。如图所示,任意时刻只能有一个线程访问内核。在不支持内核级线程的OS上实现的用户级线程都是这种模型。
  1. 一对一模型 每个用户级线程映射到对应的内核线程。它能在线程阻塞时继续执行下一个线程。但是这样的缺点是用户线程都有对应的内核线程。这样的模型必须限制线程的数量。
  1. 多对多模型 多对多模型多路复用了许多用户级线程到同样数量的或更小数量的内核级线程上。这种模型允许开发者创建任意多的线程,但是内核一次只能调度一个,因此并发性并未增加。

多核CPU和多处理器的区别

多核CPU它本质上是一个处理器,只不过有多个核心。例如我们手机处理器现在大多数是8核心的。但是它还是单处理器。多核解决了缓存分离和数据冲突等引起的错误。

多核是共用了MMU和Cache等系统资源,但是多处理器则是每个处理器都有一套属于自己的MMU和Cache。没有多核就没有多线程。多核的模型完美处理了多线程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux下多线程的实现(基于pthread库)

    Linux内核在2.2版本中引入了类似线程的机制。Linux提供的vfork函数可以创建线程,此外Linux还提供了clone来创建一个线程,通过共享原来调用进...

    zy010101
  • POSIX读写锁

    续接上一篇“线程同步”:https://blog.csdn.net/zy010101/article/details/105967289

    zy010101
  • C++之inline函数(内联函数)

    内联扩展是用来消除函数调用时的时间开销,这点其实在C语言中可以使用宏定义来做到,不过宏定义的缺点很明显,宏定义函数一般很复杂,晦涩难懂。C++提出了内联函数来改...

    zy010101
  • java多线程编程核心技术——第七章补漏拾遗

    本章主要知识点:   1)线程组的使用   2)如何切换线程状态   3)SimpleDateFormat类与多线程的解决方法   4)如何处理线程异常。 这本...

    用户1134788
  • Java中线程池的理解

    通过前面讲解,我们知道了Java中三种获取多线程的方法了。但是,在实际企业中,经常使用到的是第四种—使用线程池获取线程。在讲解这种获取方式之前,我们先来聊聊线程...

    凯哥Java
  • 线程的5种状态详解

    飞狗
  • 操作系统|显示线程和线程池浅析

    理解线程前先来看一下进程:其就是一个应用程序,当其启动运行时,操作系统就会为其分配一定的内存空间使其正常运行。

    算法与编程之美
  • Java线程池使用的注意事项

    在Spring中,如果线程池作为其他Bean中的属性,则需要在Bean的destroy时,关闭线程池

    十毛
  • 一个线程调用两次 start()方法会出现什么情况?

    一个线程两次调用 start()方法会出现什么情况?谈谈线程的生命周期和状态转移。在第二次调用 start() 方法的时候,线程可能处于终止或者其他(非NEW)...

    王小明_HIT
  • 线程池之ThreadPoolExecutor概述

    Java源码里面都有大量的注释,认真读懂这些注释,就可以把握其七分工作机制了。关于ThreadPoolExecutor的解析,我们就从其类注释开始。

    用户6182664

扫码关注云+社区

领取腾讯云代金券