操作系统原理学习笔记(十)-线程(2021/1/3更新)

操作系统原理学习笔记目录

这样写的进度太慢了,我试着换种写法,不照本宣科了。

2020/1/3:更新一句写错的句子,以及更改几个错别字。

线程的引入

进程的引入可使多个程序能并发执行,以提高资源利用率与系统吞吐量,
线程的引入则是为了减少程序在并发执行时所付出的时空开销,使得OS更好并发。

进程有两个基本属性:
拥有一定的资源、是一个可独立调度和分派的基本单位

而为了实现程序并发执行,OS又需进行一系列操作:
创建进程、撤销进程、进程切换。

若将进程的两个属性分开,那么实现程序并发执行所需的资源就可以减少:
因此,引入了线程,将其作为调度和分派的基本单位。

线程与进程的比较

线程具有许多传统进程的特征,因此线程也被称为轻型进程(Light-Weight Process)或进程元,
相应地,传统进程被称为重型进程(Heavy-Weight Process)。

  • 调度的基本单位:
    传统OS中,进程是作为独立调度和分派的基本单位,因而也是能独立运行的基本单位,
    引入线程的OS中,上述的两个基本单位都从进程变成了线程。
    线程的切换仅需保存和设置少量寄存器内存,大大降低切换代价,
    在同一进程中,线程切换不会引起进程切换,
    但从一个进程的线程切换到另一个进程的线程时会引起进程切换。
  • 并发性:
    引入线程的OS中,进程之间可并发执行,一个进程的多个线程也能并发执行(可全部并发),提高了并发性,有效提高系统资源利用率以及系统吞吐量。
    并发可用于一个进程中的不同任务,如显示,输入与输入检查,
    也可用于同时处理多个相同任务。
  • 拥有资源:
    进程是作为系统中拥有资源的一个基本单位,
    线程只拥有少量必不可少的资源,此外,多个线程还可共享资源。
  • 独立性:
    同一进程中不同线程的独立性比不同进程间的独立性低。
    因为为了防止进程间相互干扰,进程拥有独立的地址空间以及其他资源,除全局变量外的资源都不允许被其他进程访问,
    而线程是为了提高并发性而创建的,共享了不少资源,因此独立性较差。
  • 系统开销:
    创建或撤销进程时要分配和回收PCB及相关资源(内存、I/O设备等),
    在Solaris 2 OS中,线程创建比进程创建快30倍,线程上下文切换也比进程上下文切换快5倍。
  • 支持多处理机系统:
    单线程进程智能运行在一个处理机上,但多线程进程可运行在多个处理机上。

线程的状态和线程控制块

线程运行的三个状态:
执行状态、就绪状态、阻塞状态,线程状态间切换与进程状态间切换一般。

线程控制块TCB包括:
1.线程标识符
2.一组寄存器
3.线程运行状态
4.优先级
5.线程专有存储区
6.信号屏蔽(信号可作为通信手段,也可屏蔽)
7.堆栈指针

多线程OS中的进程属性:
OS支持一个进程中的多线程并发执行,但此时进程不再作为一个执行的实体。
1.进程是一个可拥有资源的基本单位(线程只代替了调度和分配的特征)。
2.多线程可并发执行,线程可多可少,但一个进程中至少有一个线程
3.进程不再是可执行的实体,线程才是。此时进程的执行状态是指进程中的某线程正在执行。

线程的实现方式

线程在许多OS中被实现,但实现方式各有不同。

内核支持线程KST(Kernel Supported Threads)

KST的创建、阻塞、撤销、切换等,都在内核空间实现。
为了对KST进行控制和管理,内存空间中,每个内核都设置了一个线程控制块,大多数OS都支持KST。

优点:
1.多处理系统中,内核可调度同一进程中多个进程并发执行。
2.如果进程中一个线程被阻塞了,内核可调度该进程中其他线程占用处理器运行,也可运行其他进程中的线程。
3.KST切换开销小。
4.内核本身也可使用多线程技术,提高OS执行速度与效率。

缺点:
对于用户线程切换而言,开销大,因为用户线程运行在用户态,而线程调度和管理在内核中实现。

用户级线程ULT(User Level Threads)

ULT在用户空间中实现,线程的创建、撤销、同步与通信等功能都无需内核支持。
线程任务控制狂设置在用户空间,且线程操作无需内核帮助,因此内核完全不知道ULT的存在。
但在使用ULT的系统中,调度的基本单位是进程,因此,在轮转调度算法中,不论进程中线程数量多少,进程被分配的时间不会有变化,
而使用KST的系统中,调度的基本单位是线程,在轮转调度算法中,一个拥有更多线程的进程会获得更多的时间片。

优点:
1.线程切换不需要转换到内核空间,减少了模式切换开销。
2.调度算法可以是进程专用的。不干扰OS调度的情况下,不同进程可选择不同调度算法对自身线程进行管理。
3.ULT的实现与OS平台无关,即,用户级线程可以在不支持线程机制的OS平台上实现。

缺点:
1.线程执行一个系统调用时,不仅自身被阻塞,同一进程的其他线程也会被阻塞,而在KST中不会。
2.在单纯的ULT实现中,多线程应用不能利用多处理剂进行多重处理的优点,内核每次只会分配一个CPU给该进程。

组合方式

将KST与ULT组合,可以结合其优点,克服其不足。
根据用户级线程与内核支持线程连接方式的不同,可以分成三种模型:

  • 多对一模型:
    多个用户线程映射到一个内核控制线程,一般用户线程属于同一进程。
    优点:线程管理开销小、效率高。
    缺点:一个线程阻塞会导致整个进程阻塞、一次只能运行一个线程。
  • 一对一模型:
    每个用户线程都对应一个内核支持线程。
    优点:一个线程阻塞时,允许调度另一个线程运行、可以充分利用多处理机。
    缺点:开销大,需要限制整个系统的线程数。
  • 多对多模型:
    N个用户线程对应M个内核支持线程,N>=M。
    结合了前两个模型的优点,不仅减少了管理开销,提高了效率,还可以多线程并行运行在多处理机系统上。

线程的实现

内核支持线程的实现

OS在创建一个新进程时,分配一个任务数据区PTDA(Per Task Data Area),包括若干线程控制块TCB空间,保存在内核中。

创建一个线程时,为其分配一个TCB,填入相关信息并分配必要资源,
若TCB空间用完,且没有超过系统线程数量限制,可分配新的TCB空间,
撤销线程时,有的系统立即撤销,有的不会立即回收资源,而是等待下次创建线程时将其分配,以便提高效率。

内核支持线程的调度与切换与进程调度切换相似,也分为抢占式和非抢占式,
调度算法中,同样可采用时间片轮转法、优先权算法等。

用户级线程的实现
  • 运行时系统(Runtime System):
    用于管理和控制线程的函数的集合,运行时所有函数驻留在用户空间,并作为线程与内核间接口。
    切换时无需转入核心态,而是由运行时系统中的线程切换函数,执行切换任务,切换效率高。
  • 内核控制线程/轻型进程LWP(Light Weight Process):
    一个进程可拥有多个LWP,LWP可通过系统调用获得内核提供的服务,
    当用户级线程运行时,可将其连接到一个LWP上,这样可获得内核支持线程的所有属性。
    为了节省开销,减少LWP数目,LWP做成缓冲池,成为线程池,任意用户级线程均可利用LWP与内核通信,
    内核只能看到LWP,不能看到用户级进程,实现了用户级线程与内核无关。
    内核级线程阻塞时,LWP上的用户级线程也会被阻塞,
    若一个进程只有一个LWP,则进程阻塞,但若有多个LWP,即便所有LWP被阻塞,进程中线程也能执行,只是不能访问内核。
线程的创建和终止

线程创建:
程序启动时,通常仅一个线程运行,这个线程被称为初始化线程,用于创建新线程。
创建新线程时,需要调用线程创建函数(或系统调用),并提供一系列参数。
创建完成后,将返回线程标识符。

线程的终止:
线程完成任务后,或线程运行中出现异常情况须被终止,由终止线程调用相应函数(或系统调用)对其终止。
大多OS中,线程终止后不会立即释放资源,只有当进程中的其它线程执行了分离函数后,被终止的线程才与资源分离,此时资源才能被其他线程利用。

版权声明:
作者:MWHLS
链接:https://mwhls.top/1019.html
来源:无镣之涯
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>