zoukankan      html  css  js  c++  java
  • 线程详细剖析(二)

    6.1.2 线程上下文

    操作系统管理很多进程的执行。有些进程是来自各种程序、系统和应用程序的单独进程,而某些进程来自被分解为很多进程应用或程序。当一个进程从内核中移出,另一个进程成为活动的,这些进程之间便发生了上下文切换。操作系统必须记录重启进程和启动新进程使之活动所需要的所有信息。这些信息被称作上下文,它描述了进程的现有状态。当进程成为活动的,它可以继续从被抢占的位置开始执行。进程的上下文信息包括

    1)进程ID

    2)执行可执行文件的指针

    3)栈

    4)静态和动态分配的变量的内存

    5)处理器寄存器

    进程上下文的多数信息都与地址空间的描述有关。进程的上下文使用很多系统资源,而且会花费一些时间来从一个进程的上下文切换到另一个进程的上下文。线程也有上下文,表6-1将线程上下文和第5章讨论的进程上下文进行了对比。当线程被抢占时,就会发生线程之间的上下文切换。如果线程属于相同的进程,它们共享相同的地址空间,因为线程包含在它们所属于的进程的地址空间内。这样,进程需要恢复的多数信息对于线程而言是不需要的。尽管进程和它的线程共享了很多内容,但最为重要的是其地址空间和资源,有些信息对于线程而言时本地且唯一的,而线程的其他方面包含在进程的各个段的内部。

    对线程唯一或本地的信息包括线程ID、处理器寄存器(当线程执行时寄存器的状态,包括程序计数器和栈指针)、线程状态及优先级、线程特定数据(thread-specific data, TSD)。线程id是在创建线程时指定的。线程能够访问它所属进程的数据段,因此线程可以读写它所属进程的全局声明数据。进程中一个线程做出的任何改动都可以被进程中的所有线程以及主线程获得。在多少情况下,这要求某种类型的同步以放置无意的更新。线程的局部声明变量不应当被任何对等线程访问。它们被放置到线程栈中,而且当线程完成时,它们便会被从栈中移走。

    TSD是一种结构体,包含线程私有的数据和信息。TSD可以包含进程全局数据的私有副本,还可以包含线程的信号掩码。信号掩码用来识别特定类型的信号,这些信号在发送给进程时不会被该线程接收。否则,如果操作系统给进程发送一个信号,进程的地址空间中的所有线程也会接收到那个信号。线程会接收所有没有被掩码遮蔽的信号。

    线程和它所属的进程共享代码段和栈端。它的指令指针指向进程的代码段的某个位置,是下一条可执行的线程指令,而且栈指针指向进程栈中线程的栈的顶部位置。线程还可以访问任何环境变量。进程的所有资源(例如文件描述符)都将与线程共享。

    6.1.3  硬件线程和软件线程

    线程可以在硬件中实现,也可以在软件中实现。芯片生产厂商实现了有着多个硬件线程的内核,用作逻辑内核。有着多个硬件线程的内核被称作同时多线程(simultaneous multthread, SMT)内核。SMT将多线程的概念引入到硬件中,方法类似与软件线程。支持SMT的处理器在处理器内核中同时执行很多软件线程或进程。让软件线程同时在单独的处理器内核总执行,增加了内核的效率,因为类似I/O延迟等因素产生的等待时间被减到最短。操作系统将逻辑内核安装独特的处理器内核来对待。它们会要求一些冗余的硬件来存储线程的上下文信息,例如指令计数器和寄存器组。根据处理器内核的不同,其他硬件或结构将被复制或在多个线程的上下文之间共享。

    Sun公司的UltraSparc T1、IBM公司的Cell Broadband Engine(CBE)以及各种Intel多核处理器利用SMT或芯片级多线程(chip-level multithreading, CMT),实现了每个内核上2-8个线程。超线程是 Intel 对SMT的实现,其主要目的就是改善对多线程代码的支持。超线程或SMT技术通过一个处理器内核上并行执行线程,在特定负载下提供了对CPU资源的有效使用。

    6.1.4 线程资源

    线程将大部分的资源同相同进程中其他线程进行共享。线程拥有一些定义它们上下文的资源。线程必须共享其他资源,例如处理器、内存、文件描述符等。文件描述符是单独我每个进程分配的,相同进程中的线程将竞争对这些描述符的使用权。线程可以分配额外的资源,例如文件或互斥量,但是进程中所有的线程都可以访问它们。

    一个进程能够消耗的资源是受限制的。因此,对等线程拥有的全部资源不够超过进程的资源限制。如果一个线程试图消耗的资源数量多于定义的软件资源限制,它会收到一个信号,被告知达到了进程的资源限制。

    当线程利用它们的资源时必须很小心,不能够在它们被取消时将这些资源置于不稳定的状态。如果终止的线程放任文件处于打开状态,可能导致文件受损,或者当应用程序终止时导致数据丢失。在终止前,线程应当执行一些清理工作,防止这些不期望出现的状况发生。

  • 相关阅读:
    Nginx练习练习玩玩
    MySQL Lock--MySQL加锁规则
    MySQL Transaction--RR事务隔离级别下加锁测试
    MySQL Transaction--RC事务隔离级别下加锁测试
    MySQL Transaction--事务隔离级别基础
    MySQL Transaction--快照读和当前读
    MySQL Transaction--RC和RR区别
    MySQL Disk--NAND Flash原理
    MySQL Disk--SSD与RAID
    MySQL Disk--SSD磁盘性能抖动问题
  • 原文地址:https://www.cnblogs.com/rohens-hbg/p/10225320.html
Copyright © 2011-2022 走看看