操作系统---线程与调度算法---图解小林coding

4.2线程

上一篇在这里
最近忙着写学年论文,写不出来,根本写不出来😊。
🚀书接上回,在我们了解了进程之后,我们继续来学习线程。

线程是什么?线程就是进程中的一条执行流程。

早期的操作系统中都是以进程作为独立运作的基本单位,直到后面,计算机科学家们提出了更小的能独立运行的基本单位,那就是线程。同一个进程内的多个线程之间可以共享代码段、数据段、打开的文件等资源,但是每一个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。

线程的优点:

  • 一个进程可以同时存在多个线程
  • 各个线程之间可以并发执行
  • 各个线程之间可以共享地址空间和文件等资源

线程的缺点: 当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃。


🧿进程与线程的比较

  • 进程是资源(包括内存、打开的文件等)分配的单位。线程是CPU调度的单位。
  • 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈。
  • 线程同样具有就绪、阻塞、执行这三种基本状态,同样具有状态之间的转换关系。
  • 线程能减少并发执行的时间和空间开销。

线程相比于进程能减少开销,体现在这几个方面:

  • 线程的创建时间比进程快,因为进程在创建过程中还需要资源管理信息,比如内存管理信息、文件管理信息,而在线程的创建过程中不会涉及到这些资源管理信息,而是共享它们。
  • 线程的终止时间也比进程快,因为终止线程释放的资源相比进程少很多。
  • 同一个进程内的线程切换比进程快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候就不需要切换页表。而对于进程之间的切换,切换的时候要把页表切换掉,而页表的切换过程开销是比较大的。
  • 由于同一个进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候就不需要经过内核了,这就使得线程之间的数据交换效率更高。

所以,线程的时间效率和空间效率都是比进程高的。


线程的上下文切换

在进程和线程之间的比较中,我们知道了进程是资源分配的基本单位,线程是CPU调度的基本单位。所以,操作系统的调度实际上的调度对象是线程,而进程只是给线程提供了虚拟内存、全局变量等资源

对于进程和线程,我们可以这么理解:

  • 当进程只有一个线程时,可以认为进程等于线程。
  • 当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源,这些资源在上下文切换时是不需要修改的。

另外,线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存的。

那么线程的上下文切换时什么呢?

其实,线程的上下文切换与进程的上下文切换类似,不过要看切换的线程是否属于同一个进程。

  • 当两个线程不属于同一个进程时,线程的上下文切换过程和进程的上下文切换一样。
  • 当两个线程属于同一个进程时,因为虚拟内存是共享的,所以在切换时虚拟内存这些资源不变,只切换线程的私有数据、寄存器等这些不共享的数据。

线程的实现

主要有三种线程的实现方式:

  • 用户线程: 在用户空间实现的线程,不是由内核管理的线程,是由用户态的线程库来完成线程的管理。
  • 内核线程: 在内核中实现的线程,是由内核管理的线程。
  • 轻量级进程: 在内核中来支持用户线程。

那么,我们来探讨用户线程和内核线程的对应关系。

  • 多个用户线程对应同一个内核线程,即多对一
  • 一个用户线程对应一个内核线程,即一对一
  • 多个用户线程对应到多个内核线程,即多对多

那么用户线程又如何理解,它存在什么样的优势和劣势呢?

用户线程是基于用户态的线程管理库来实现的,那么线程控制块TCB也是在库里面实现的,对于操作系统而言是看不到这个TCB的,它只能看到整个进程的PCB。所以,用户线程的整个线程管理调度,操作系统是不直接参与的,而是由用户级线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等。

用户线程的模型类似于前面的多对一的关系,即多个用户线程对应同一个内核线程。

用户线程的优点:

  • 每个进程都需要有它私有的线程块(TCB)列表,用来跟踪记录它各个线程状态信息(PC、栈指针、寄存器),TCB由用户级线程库函数来维护,可用于不支持线程技术的操作系统
  • 用户线程的切换也是由线程库函数来完成的,无需用户态与内核态的切换,所以速度特别快

用户线程的缺点:

  • 由于操作系统不参与线程的调度,如果一个线程发起了系统调用而阻塞,那么进程所包含的所有用户线程都不能执行了。
  • 当一个线程开始运行后,除非它主动交出CPU的使用权,否则它所在的进程当中的其他线程无法运行,因为用户态线程没法打断当前运行中的线程,只能操作系统才能打断,但是用户线程不是由操作系统管理的。
  • 由于时间片分配给进程,故与其他进程相比,在多线程执行时,每个线程得到时间片较少,执行比较慢。

那么内核线程如何理解,它的优缺点是什么?

内核线程是由操作系统管理的,线程对应的TCB自然是放在操作系统里的,这样线程的创建、终止和管理都是由操作系统负责。

内核线程的模型类似于前面的一对一的关系,即一个用户线程对应一个内核线程。

内核线程的优点:

  • 在一个进程中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行。
  • 分配给线程、多线程的进程获得更多的CPU运行时间。

内核线程的缺点:

  • 在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息,如PCB和TCB。
  • 线程的创建、终止和切换都是通过系统调用的方式进行,因此对于系统来说,系统开销比较大。

最后,我们来了解一下轻量级进程。

轻量级进程(LWP)是内核支持的用户线程,一个进程可有一个或多个轻量级进程(LWP),每个轻量级进程(LWP)是跟内核线程一对一映射的,也就是轻量级线程(LWP)都是由一个内核线程支持。轻量级进程(LWP)只能由内核管理并像普通进程一样被调度。

在大多数系统中,LWP与普通进程的区别在于它只有一个最小的执行上下文和调度程序所需的统计信息。

LWP与用户线程的三种对应关系:

  • 1:1即一个LWP对应一个用户线程

    优点:实现并行,当一个LWP阻塞时,不会影响其他LWP。

    缺点:每有一个用户线程就产生一个内核线程,创建线程的开销较大。

  • 1:N即一个LWP对应多个用户线程

    优点:用户线程要开几个都没问题,且上下文切换发生在用户空间,切换效率较高。

    缺点:一个用户线程阻塞了那么整个进程都会阻塞,另外在多核CPU中是无法充分利用CPU的。

  • M:N即多个LWP对应多个用户线程

    优点:综合了前面两种关系的优点,大部分线程上下文发生在用户空间且多个线程可以充分利用多核CPU的资源。


4.3 调度

在我们初步了解了进程和线程的相关概念后,我们继续来了解调度。

我们知道,当操作系统把进程切换到运行状态时,该进程占用着CPU在执行,在操作系统把进程切换到其他状态时,那这个进程就不能在CPU中执行了,于是操作系统就会选择下一个要运行的进程。

选择一个进程运行这一功能是在操作系统中完成的,通常称为调度程序

所以,什么时候调度进程,以什么原则来调度基础呢?

在进程的生命周期中它是有不同状态的,当进程从一个运行状态切换到另一个状态时就会触发一次调度。

另外,如果硬件时钟提供某个频率的周期性中断,那么可以根据如何处理时钟中断把调度算法分为两类:

  • 非占式调度算法:它挑选一个进程然后让该进程运行直到被阻塞,或者直到该进程退出才会调用另外一个进程,也就是不会理会时钟中断这个事情。
  • 抢占式调度算法:它挑选一个进程,然后让该进程运只运行某段时间,如果在该时间段结束时,进程还未结束,那么将其挂起,然后调度程序从就绪队列中挑选另一个进程运行。该算法符合时间片机制。

调度的五个原则

  • CPU利用率:调度程序应该确保CPU是始终匆忙的状态,可以提高CPU的利用率。
  • 系统吞吐量:吞吐量表示的是单位时间内CPU完成的进程数量,长作业的进程会占用较长的CPU资源,因此会降低吞吐量,相反,短作业的进程会提高系统吞吐量。
  • 周转时间:周转时间是进程运行和阻塞状态的时间总和,一个进程的周转时间越短越好。
  • 等待时间:即进程处于就绪队列的时间,等待时间越长用户体验越不好。
  • 响应时间:用户提交请求到系统第一次产生响应所花费的时间,在交互式系统中,响应时间是衡量调度算法好坏的主要标准。

最后,我们来了解一下单核CPU系统中常见的调度算法

在单核CPU系统中,有六个常见的调度算法,分别是先来先服务调度算法、最短作业优先调度算法、高响应比优先算法、时间片轮转调度算法、最高优先级调度算法、多级反馈队列调度算法

  • 先来先服务调度算法

    最简单的调度算法就是非抢占式的先来先服务算法,即每次从就绪队列选择最先进入队列的进程,然后一直运行,直到该进程退出或者阻塞,才会继续从就绪队列中选择第一个进程继续运行。

    这对长作业有利,不利于短作业,适用于CPU繁忙作业的系统,而不适合I/O繁忙型作业的系统。

  • 最短作业优先调度算法

    它会选择运行时间最短的进程来运行,有助于提高系统吞吐量。

    对于长作业不利,容易造成一种极端现象,即一个就绪队列中有多个短作业,一个长作业,那么这个长作业进程长时间不能运行,给用户的体验不好。

  • 高响应比优先调度算法

    这个算法权衡了短作业和长作业,每次进行调度时先计算它们的响应比优先级,将响应比优先级最高的进程投入运行。

    在这里插入图片描述

  • 时间片轮转调度算法

    这是最古老、最简单、最公平且使用最广的算法,每一个进程都会被分配一个时间段,称之为时间片,允许该进程在这个时间段中运行。一般一个时间片设置为20-50ms。

    • 如果时间片用完进程还在运行则会把此进程从CPU中释放,并把CPU分配给下一时间片的进程
    • 如果该进程在时间片结束前阻塞或者结束则CPU立即切换进程。
  • 最高优先级调度算法

    进程的优先级可以分为静态优先级和动态优先级:

    • 静态优先级:创建进程时就已经确定的优先级,永远不会变化。
    • 动态优先级:根据进程的动态变化调整优先级

    这个算法有两种处理优先级高的方法:

    • 抢占式:当就绪队列中出现优先级高的进程,则将当前进程挂起,运行优先级高的进程。
    • 非抢占式:当就绪队列中出现优先级高的进程,仍然把当前进程运行完再选择优先级高的进程运行。
  • 多级反馈队列调度算法

    它是时间片轮转和最高优先级算法的综合发展。

    • 多级:表示有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短
    • 反馈:表示如果有新的进程加入到优先级高的队列时,立刻停止当前运行的进程,运行该优先级高的队列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值