zoukankan      html  css  js  c++  java
  • 线程

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

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

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

    多线程编程的优点:

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

    用户级线程

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

    内核级线程

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

    多线程模型

    1. 多对一模型
      将多个线程映射到内核线程。线程管理在用户态进行,但是容易引起阻塞。如图所示,任意时刻只能有一个线程访问内核。在不支持内核级线程的OS上实现的用户级线程都是这种模型。
       

    2. 一对一模型
      每个用户级线程映射到对应的内核线程。它能在线程阻塞时继续执行下一个线程。但是这样的缺点是用户线程都有对应的内核线程。这样的模型必须限制线程的数量。

    3. 多对多模型
      多对多模型多路复用了许多用户级线程到同样数量的或更小数量的内核级线程上。这种模型允许开发者创建任意多的线程,但是内核一次只能调度一个,因此并发性并未增加。
       

    多核CPU和多处理器的区别

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

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

     

  • 相关阅读:
    騎士宣言
    [洛谷P1631] 序列合并
    [HNOI2006]公路修建问题
    [洛谷2068] 统计和
    [洛谷P1168] 中位数
    【模板】可持久化数组(可持久化线段树/平衡树)
    【模板】可持久化线段树 1(主席树)
    [JSOI2008]最大数maxnumber
    NOI导刊2010提高(06) 黑匣子
    [洛谷1533] 可怜的狗狗
  • 原文地址:https://www.cnblogs.com/zy666/p/10504280.html
Copyright © 2011-2022 走看看