• 操作系统-进程(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

  • 相关阅读:
    【转】php中XML、XSLT的结合运用
    【转】PHP 5.3 5.4 5.5 5.6特性
    Go语言的编程范式
    Appcelerator Titanium Studio: JNI_CreateJavaVM missing error
    良好Web系统架构的几个因素
    决定去掉博客中附加的多说评论
    用PHP实现Windows域验证
    Netbeans 8.0.1 坑爹请不要升级
    教程:30分钟学会Adobe Premiere
    完美:adobe premiere cs6破解版下载[序列号+汉化包+破解补丁+破解教程]
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9318162.html
Copyright © 2020-2023  润新知