zoukankan      html  css  js  c++  java
  • 操作系统-进程(2)进程与多线程

    传统进程是单线程结构进程,单线程结构进程在并发程序设计上存在进程切换开销大、进程通信开销大、限制了进程并发的粒度、降低了并行计算的效率等问题。

    解决问题的思路:

    • 把进程的两项功能,即“独立分配资源”与“被调度分派执行”分离开来;

    • 进程作为系统资源分配和保护的独立单位,不需要频繁地切换;

    • 线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换;

    • 线程的出现会减少进程并发执行所付出的时空开销,使得并发粒度更细、并发性更好

    AA50329F-4723-4BFE-9749-D1E7A64A021AE294995B-8CA7-4F08-821C-467EFB7A7EA3

    进程要支撑线程运行,为线程提供虚拟地址空间和各种资源,它具有:

    1. 一个独立的虚拟地址空间,用来容纳进程映像

    2. 以进程为单位对各种资源,如文件、I/O设备等实施保护

    线程是是调度的基本单位。它是进程的一条执行路径,同一个进程中的所有线程共享进程获得的主存空间和资源,它具有:

    1. 线程执行状态

    2. 受保护的线程上下文,当线程不运行时,用于存储现场信息

    3. 独立的程序指令计数器

    4. 执行堆栈

    5. 容纳局部变量的静态存储器

    并发多线程设计有快速线程切换、减少(系统)管理开销、线程通信易于实现、并行程度提高、节省内存空间等优点。常应用在前台和后台工作、C/S应用模式、加快执行速度、设计用户接口等。

    线程状态有运行、就绪和等待和终止,无挂起(挂起与资源有关,只有进程才有挂起状态)

    OS感知线程环境下:处理器调度对象是线程,进程没有三状态(或者说只有挂起状态)

    OS不感知线程环境下:处理器调度对象仍是进程,用户空间中的用户调度程序调度线程

    一个进程的线程有多种组织方式:

    (1)调度员-工作者模式:进程中的一个线程担任调度员,接收和处理工作请求

                                               其它线程是工作者线程,由调度员线程分配任务并唤醒工作者进程

    (2)组模式:进程中每个线程都可以取得并处理工作请求,有时每个线程被设计成专门执行特定任务,并建立相应任务队列

    (3)流水线模式:线程排成某个次序,按排定顺序,第一个线程所产生的数据传送给下一个线程进行处理,依次传递

    多线程的实现分为三类:

    内核级线程KLT(Kernel-Level Threads)

    OS内核来做线程管理工作,并提供线程API。

    当任务提交给操作系统的时候,内核为其创建进程和一个基线程,线程在执行过程中可通过内核的创建线程原语来创建其它线程。

    内核需要为进程及进程中的单个线程维护现场信息,所以应在内核空间建立维护进程控制块、线程控制块。

    OS直接调度KLT

    9A7C6A48-A11D-465E-B7AE-701152AD3FA8

    特点为:

    • 进程中的一个线程被阻塞了,内核能调度同一进程的其它线程占有处理器运行

    • 多处理器环境中,内核能同时调度同一进程中多个线程并行执行

    • 内核自身也可用多线程技术实现,能提高操作系统的执行速度和效率

    • 应用程序线程在用户态运行,线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要模式切换,系统开销较大

    用户级线程ULT(User-Level Threads)

    用户空间运行的线程库,提供多线程应用程序的开发和运行支撑环境,主要功能包括线程创建、调度、管理等。

    任何应用程序均需通过线程库进行程序设计,在与线程库连接后运行

    线程管理的所有工作都由应用程序完成,内核没有意识到线程的存在

    4CC05117-359D-4B6C-8F29-2DEDA7F3610F

    特点为:

    • 所有线程管理数据结构均在进程的用户空间中,线程切换不需要内核模式,能节省模式切换开销和内核的宝贵资源

    • 允许进程按应用特定需要选择调度算法,甚至根据应用需求裁剪调度算法

    • 能运行在任何OS上,内核在支持ULT方面不需要做任何工作,可执行性好(Java语言就是利用了ULT)

    • 不能利用多处理器的优点,OS调度进程,仅有一个ULT能执行

    • 一个ULT的阻塞,将引起整个进程的阻塞(可以使用Jacketing技术把阻塞式系统调用改造成非阻塞式的。当线程陷入系统调用时,执行jacketing程序,由jacketing程序来检查资源使用情况,以决定是否执行进程切换或传递控制权给另一个线程)

    80C76AD2-6F84-4435-B668-61A3B4F24B58

    ULT物理并行性不行,适用于解决逻辑并行性问题

    KLT适用于解决物理并行性问题

    多线程实现的混合式策略

    线程创建是完全在用户空间做的,单应用的多个ULT可以映射成一些KLT,通过调整KLT数目,可以达到较好的并行效果

    96CE2218-E9FA-480F-9234-CC99DFF3C9FB

    特点:

    • 组合用户级线程/内核级线程设施

    • 线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行

    • 一个应用中的多个用户级线程被映射到一些(小于等于用户级线程数目)内核级线程上

    • 程序员可以针对特定应用和机器调节内核级线程的数目,以达到整体最佳结果

    • 该方法将会结合纯粹用户级线程方法和内核级线程方法的优点,同时减少它们的缺点

    线程混合式策略下的线程状态图:

    屏幕快照 2018-02-26 10.13.57

    与线程状态变化有关的线程操作有:孵化、封锁、活化、剥夺、指派、结束

    KLT三态,系统调度负责:运行态、可运行态、阻塞态

    ULT三态,用户调度负责:活跃态、睡眠态、可运行态

    活跃态ULT代表绑定KLT的三态,活跃态ULT运行时可激活用户调度

    非阻塞系统调用可使用Jacketing启动用户调度,调整活跃态ULT

  • 相关阅读:
    Codeforces 1045C Hyperspace Highways (看题解) 圆方树
    Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
    Codeforces 803G Periodic RMQ Problem 线段树
    Codeforces 420D Cup Trick 平衡树
    Codeforces 295E Yaroslav and Points 线段树
    Codeforces 196E Opening Portals MST (看题解)
    Codeforces 653F Paper task SA
    Codeforces 542A Place Your Ad Here
    python基础 异常与返回
    mongodb 删除
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9318162.html
Copyright © 2011-2022 走看看