zoukankan      html  css  js  c++  java
  • [操作系统] 线程管理

    一、 为什么使用线程

      效率低下,多线程有效利用系统资源

      问题:进程之间如何通信,共享数据另外,维护进程的系统开销较大:创建进程时,分配资源、建立PCB;撤消进程时,回收资源、撤消PCB;进程切换时,保存当前进程的状态信息。

      需要提出一种新的实体,满足以下特性:

      (1)实体之间可以并发地执行;
      (2)实体之间共享相同的地址空间;

      从两个方面来理解进程

        1. 资源角度来看,进程把一组相关的资源组合起来,构成了一个资源平台,摆阔地址空间(代码段,数据段)、打开的文件等各种资源

        2. 运行的角度看,代码是在这个自由平台上的一条执行流程

      (所以,进程可以看为 资源管理,线程管理)

      线程可以同时共享进程的代码 数据资源

      

      线程优点

        1. 一个进程可以同时存在多个线程

        2. 各个线程之间可以并发的执行

        3. 各个线程之间可以共享地址空间和文件信息

      线程的缺点

        一个线程崩溃,会导致所属进程的所有线程崩溃 (不安全,安全可靠性没有保证)

      线程所需资源

      

      单个线程:进程空间里面只有一个控制流

      多个线程:进程空间有多个控制流 每个控制流还不一样,而且有多个堆栈和寄存器 但是能够共享代码段 数据段 打开的文件

      线程和进程的比较

        1. 进程的是资源分配单位,进程是CPU调度单位

        2. 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,比如寄存器和堆栈

        3. 线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系

        4. 线程能减少并发执行的事件和空间开销

          线程的创建时间比线程短 (可以直接只用进程的相关资源)

          线程的终止时间被线程短

          同一进程内的线程切换比进程切换快 (所有线程在一个页表 切换的时候不需要切换页表)

          由于进程的各个线程之间可以共享内存和文件资源,可以不用过内核通信 (数据交换效率高)

    线程的实现(三种) 

      用户线程:在用户空间实现

        POSIX Pthreads,Mach C-threads,Solars threads

      内核线程:在内核中实现

        Windows、Solaris、Linux

      轻量级进程:在内核中实现,支持用户线程

        Solaris (LightWeight Process)

      用户线程:操作系统不可见的  (由用户线程库管理)

      内核线程:由操作系统关系的 操作系统可见的  (操作系统本身管理)

      用户线程和内核线程的对应关系

        多对一:N个用户线程对应一个内核线程

        一对一:一个用户线程对应一个内核线程

        多对多:多个用户线程对应多个内核线程

      用户线程实现

        由TCB(Thread Control Block)控制管理 操作系统不可见 由线程库管理

        在用户空间实现的线程机制,它不依赖于操作系统的内核,由一组用户级的线程库函数来完成线程的管理,包括进程的创建、终止、同步和调度等。 

        

        ·由于用户线程的维护由相应进程来完成(通过线程库函数),不需要操作系统内核了解用户线程的存在,可用于不支持线程技术的多进程操作系统;
        ·每个进程都需要它自己私有的线程控制块(TCB)列表,用来跟踪记录它的各个线程的状态信息(PC、栈指针、寄存器),TC由线程库函数来维护
        ·用户线程的切换也是由线程库函数来完成,无需用户态/核心态切换,所以速度特别快
        ·允许每个进程拥有自定义的线程调度算法。

        

        用户线程缺点

          进程执行了一个阻塞的系统调用,那么整个进程都在等待  

          当一个线程开始运行之后,除非是主动交出CPU使用权,否则他所在的进程中的其他线程将无法运行

          由于时间片分配给进程,故与其他进程比,多线程在执行时,每个线程得到的时间片较少,执行较慢

          

    内核线程

      TCB在在内核里面

      

      内核线程是指操作系统的内核当中实现的一种线程机制,由操作系统内核来完成线程的创建、终止和管理

        在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息(PCB和TCB)

        线程的创建、终止和切换都是通过系统调用/内核函数的方式来进行的,由内核完成,所以系统开销比较大 (每次都有从内核态到用户态的变化 开销大)

        在一个进程中,如果某个内核进程发起系统调用而被阻塞,并不会影响其他内核线程的运行

        时间片分配给线程,多线程的进程获得更多CPU时间

        Windows NT 和 Windows 2000/XP 支持内核线程

    轻量级进程 (LightWeiht Process)

      它是内核支持的用户线程。一个进程可有一个或多个轻量级进程,每个量级进程由一个单独的内核线程来支持。(Solaris/Linux)

  • 相关阅读:
    非科班毕业生四个月的面试准备,网易三轮面面试,成功拿下offer(面经奉上)全靠这份阿里面试手册
    太赞了!华为鸿蒙工程师总结的Linux笔记,提供下载
    阿里java岗面试有多难?分享阿里面试真题(附面试专题答案)及P7所要掌握的技能体系!
    阿里腾讯百度等大厂2020秋招面试总结,内附答案
    小小码农的大梦想,2020最新BAT大厂面试题干货总结
    历经三个月的紧张复习,秋招终于进了百度,附上面经分享希望可以帮助大家
    这份《高性能MySQL》适合数据库管理员(DBA)阅读,也适合开发人员参考学习
    这份程序员必备书籍《Spring实战4》,你确定不看看?
    自学JAVA的我提交给2020的问卷答案,JAVA核心知识点分享这一年来的努力并没有白费!
    Delphi连接数据库的两种方式
  • 原文地址:https://www.cnblogs.com/cjdty/p/10912005.html
Copyright © 2011-2022 走看看