操作系统-线程

Posted 菜鸟也有高飞的时候

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统-线程相关的知识,希望对你有一定的参考价值。

操作系统-线程

操作系统

线程是为了更好的使多个程序并发执行,同时减少系统的开销而出现的
 

线程与进程的比较

  • 调度的基本单位 
    传统的OS中,进程作为独立调度和分派的基本单文,每一次调度的时候,都要进行上下文的切换,开销比较大,而用线程作为独立运行的基本单文是,线程的切换只需要保存和设置少量的寄存器内容,开销比进程的销。在同一进程能切换线程不会引起进程的切换,如果切换到另一个进程的线程,则需要切换进程
  • 并发性 
    在引入线程之后,不仅进程之间可以并发执行,一个进程中的多个线程也可以并发执行,甚至还允许一个进程中所有的线程并发执行,更加有效的提高了系统资源的利用率和系统的吞吐量
  • 拥有资源 
    线程本身不像进程那样拥有系统资源,仅有一些必不可少的,能保证独立运行的资源,例如线程控制块TCB等,除此之外,多个线程共享进程所拥有的资源
  • 独立性 
    在独立性方面,线程不够进程好,进程为了防止进程之间干扰,破坏,每个进程都拥有一个独立的地址空间和其他资源,而线程是为了提高并发性以及进程相互之间的合作而创建的
  • 系统开销 
    进程在系统上的开销主要是创建进程,撤销进程,进程切换,特别是在进程切换的时候,涉及到上下文的切换,开销比较大,而由于线程只有少量的资源,在上下文切换的时候,开销比较小
  • 支持多处理机系统
 

线程的控制块TCB

线程和进程一样,拥有控制块TCB,在TCB中有:

  • 线程标识符 
    每个线程的唯一标识
  • 寄存器 
    包括程序计数器PC,状态寄存器和通用寄存器的内容
  • 线程运行状态 
    用于描述线程在哪一个状态
  • 优秀级 
    描述线程执行的优先级
  • 线程专有存储区 
    用于线程切换时存放的现场保护信息,和与该新城的统计信息
  • 信号屏蔽 
    对某些信号屏蔽
  • 堆栈指针 
    保存局部变量和返回地址。在线程中设置了两个专项堆栈的指针 
    • 指向用户自己堆栈的指针 
      在用户态时,使用用户自己的用户栈来保存局部变量和返回地址
    • 指向核心栈的指针 
      在内核态,线程运行在核心态使用系统的核心栈
 

线程的实现方式

  • 内核支持线程KST 
    线程的创建,阻塞,撤销和切换等都是内核空间实现,在内核控制中也设置了线程控制块TCB,用来管理内核线程 
    • 优点 
      • 能够同时调度同意进程中的多个线程并执行
      • 进程中的一个线程被阻塞的时候,内核可以调度该进程中其他线程占有处理器运行,也可运行其他进程的线程
      • 支持线程具有很小的数据结构和堆栈,切换快,开销小
      • 采用了多线程的技术,提高了系统的效率
    • 缺点 
      • 对于用户的线程切换的话,切换开销大,需要从用户态切换到核心态,这是因为用户线程在用户态运行,而线程调度和管理在内核实现。
  • 用户级线程ULT 
    线程的创建,阻塞,撤销和切换等都是用户空间实现,不需要内核的支持,与内核无关

    • 优点 
      • 线程切换不需要转换到内核空间,在用户态进行,开销小
      • 用户线程与OS平台无关
      • 调度算法可以使进程专用
    • 缺点 
      • 系统调用的阻塞问题,大多数的系统调用都会使进程阻塞,所以当线程执行系统调用时,进程内所有的线程都会被择善
  • 组合方式

    • 多对一模型 
    • 一对一模型 
    • 多对多模型 
 

线程的实现

  • 内核支持线程的实现 
    在仅设置内核支持的线程OS中,一种可能的线程控制方法是系统在创建一个新进程时,为它分配一个任务数据区PTDA,但进程要创建一个线程的时候,就分配一个TCB,将相关信息填入该TCB,并分配资源。在撤销线程事不立即回收该线程的资源和TCB,在创建新线程时,直接利用这个。 

  • 用户级线程的实现 
    用户线程在用户空间实现,所有的用户线程都具有相同的结构,都运行在一个中间系统上。有两种方式实现中间系统,运行时系统和内核控制线程

    • 运行时系统 
      运行时系统实质是用于管理和控制线程的函数(过程)的集合,所有的函数都驻留在用户空间,并作为用户级线程与内核的接口
    • 内核控制线程 
      这种线程有叫做轻型进程LWP,在系统中,LWP不会设置太多,而是把这些LWP做成一个缓冲池,成为“线程池”,当用户级线程需要与内核通信的时候,借助LWP就可以实现,有LWP实现了内核与用户级线程直接的隔离 
+

 

以上是关于操作系统-线程的主要内容,如果未能解决你的问题,请参考以下文章

线程学习知识点总结

线程操作API

活动到片段方法调用带有进度条的线程

多个用户访问同一段代码

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

线程-使用CountDownEvent类