吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)

现代操作系统 第二章 进程与线程

  • 2.1进程
    • 2.1.1进程模型
    • 2.1.2 进程的创建
    • 2.1.3 进程的终止
    • 2.1.4进程的层次结构
    • 2.1.5进程的状态
    • 2.1.6 进程的实现
    • 2.1.7多道程序设计模型
  • 2.2 线程
    • 2.2.1为什么使用线程
    • 2.2.2 经典的线程模型
    • 2.2.3 POSIX线程
    • 2.2.4 在用户空间中实现线程
    • 2.2.5 在内核中实现线程
    • 2.2.6 混合实现
    • 2.2.7调度激活设置
  • 2.3 进程间的通信(很重要单独出一篇博文)
  • 2.4 调度
    • 2.4.1 调度简介
    • 2.4.2批处理系统中的调度
    • 交互式系统中的调度(仅介绍部分算法)
    • 实时系统中的调度
    • 2.4.5策略和机制
    • 2.4.6线程调度

2.1进程

2.1.1进程模型

进程就是一个正在执行的实例,包括程序技术器、寄存器、和变量当前值。进程的关键思想:一个进程是某种类型的一个活动,它有程序、输入输出以及状态。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,转为为另一个进程服务。

2.1.2 进程的创建

以下主要时间会导致进程的创建:

  • 系统初始化
  • 正在运行的程序执行了创建进程的系统调用
  • 用户请求创建一个新进程
  • 一个批处理作页的初始化

启动系统时,通常会创建若干个进程,有些是前台进程(与人类交互的进程),其他的事后台进程。

除了启动阶段创建进程以外,新的进程也会发出系统调用。以便创建一个或多个新进程协助器工作。

交互式系统中,键入一个命令或点击一个图标就可以启动一个程序,开启一个新的进程。

最后一种创建仅在大型计的批处理系统中应用。用户在这种系统中提交批处理作业,在操作系统认为有资源的可运行下一个作业时,创建新的进程。

从技术上来看,在这些所有情形中,新进程都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。

进程创建后,父进程和子进程有着各自不同的地址空间。如果某个进程在其地址空间中修改一个字,对其他进程不可见。

2.1.3 进程的终止

进程在创建之后,它开始运行,完成其工作。进程会在以下条件终止

  • 正常退出(自愿)
  • 出错退出(自愿)
  • 严重错误(非自愿)
  • 被其他进程杀死(非自愿)

多数进程由于完成它们的工作而终止。当编译器完完成所给定程序的编译后,编译器执行一个系统调用,通知操作系统它的工作已经完成。

进程终止的第二个原因是有进程引起的错误,通常是程序的错误,如执行非法指令、引用不存在内存,在这种错误中,进程会收到信号被中断,而不是在这类错误出现时终止。

进程终止的第三个原因,出现严重错误,比如编译文件不存在。

第四种终止进程的原因是,某个进程执行某个系统调用通知操作系统杀死某个进程。

2.1.4进程的层次结构

某些系统中,当进程创建了一个进程后,父进程以某种联系保持关联

在UNiX中,进程和它的所有子进程以及子进程后裔组成一个进程组。Windows没有层次结构的概念,所有的进程都是地位相同的。唯一类似的是在创建进程的时候,父进程会得到一个句柄来控制子进程,但是windows有权转移,而unix不能转移。

2.1.5进程的状态

吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第1张图片
进程的状态 可以分为三种状态:

  • 运行态(该时刻进程实际占用cpu)
  • 就绪态(可运行,但因为其他进程正在运行而暂停)
  • 阻塞态(除非外部某种事件发生,否则进程不能运行)

转换1,当操作系统发现进程不能继续运行下去时发生转换1.

转换2和转换3都是由进程调度引起的。调度程序的主要工作是决定应当运行那个进程。

转换4,当进程等待一个外部事件发生时![请添加图片描述](https://img-blog.csdnimg.cn/9562c479681c48a184eb4c74741f9988.png = 400x)
操作系统最底层的是调度程序,在它上面有很多进程,所有关于中断处理,启动进程和停止进程的具体细节都隐藏在调度程序中。

2.1.6 进程的实现

为了实现进程模型,操作系统维护着一张表格,即进程表。每个进程占用一个进程表项(进程控制块)。该表项包含了进程状态的重要信息。包括程序技术器,堆栈指针等其他在进程由运行态转换到阻塞态必须保存的信息。
吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第2张图片

在了解进程表后,可以对在单个CPU上如何维持多个顺序进程的错觉做更多解释。与每一个I/O类关联的是一个称作中断向量的位置。它包括中断程序的入口地址。加入当一个磁盘中断发生时,进程3正在执行,则中断硬件将程序计数器,程序状态字,有时还把多个寄存器压入堆栈,计算机随即跳转到所指向的地址
吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第3张图片

2.1.7多道程序设计模型

吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第4张图片

2.2 线程

2.2.1为什么使用线程

  • 并行实体拥有共享同一个地址空间和所有可用数据的能力
  • 线程比进程更轻量级
  • 在I/O设备密集的系统中加快程序执行速度。
  • 在多cpu系统中,多线程是有益处的

2.2.2 经典的线程模型

进程模型基于两个独立的概念:资源分组处理和执行。理解进程的一个角度是,用某种方法把相关的资源集中在一起,另一个概念是,用某种方法把相关的资源集中在一起,而线程是在CPU上被调度执行的实体。吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第5张图片

进程中的不同线程不像不同进程之间存在很大的独立性。所有的线程都有完全一样的地址空间,一个线程可以读写其他线程的堆栈。吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第6张图片
每个线程都有自己的堆栈,因为每个线程都有调用不同的过程,有着不同的执行历史。
吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第7张图片

2.2.3 POSIX线程

吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第8张图片

2.2.4 在用户空间中实现线程

有两种方式实现线程包:在用户空间中和在内核中。
第一种方法是整个线程放在用户空间,内核对线程包一无所知,从内核角度考虑,就是正常的方式管理,即单线程进程。

  • 这种方式最明显的优点是,用户级线程可以不支持线程的操作系统实现。
    吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第9张图片

在用户空间管理线程时,每个进程需要有专用的线程表。记录线程的各个属性完成线程状态的转换。

  • 线程与进程第二个优点,保存线程和调度程序时本地过程,无需陷入内核上下文切换。线程调度快捷
  • 线程调度运行每个进程有自己定制的调度算法。

缺点:

  • 很难实现阻塞系统调用
  • 不好处理缺页中断
  • 一个线程开始运行,那么该进程的其他线程不能运行。在一个单独的进程内部没有时钟中断。

2.2.5 在内核中实现线程

内核的线程表保存了每个线程的寄存器、状态和其他信息。所有能够阻塞线程的调用都以系统调用的形式存在,当一个线程阻塞时,内核的调用选择同一个进程的另一个线程还是另一个进程的线程。而在用户级线程,运行时系统始终运行自己进程的线程,直到内核剥夺它的CPU为止。

2.2.6 混合实现

吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第10张图片

2.2.7调度激活设置

调度程序激活机制:其工作目标是模拟内核线程的功能,避免了在内核态和用户态之间的切换.其工作原理简述如下:

  • 1.若发生阻塞,内核通知运行时系统,让它标记此线程为阻塞并启动另一就绪线程;
  • 2.若刚刚阻塞的线程获得了可用事件 (比如数据到达),则内核通知运行时系统,把刚刚那个线程设置成可运行的.
  • 3.若发生中断,若被中断的进程对引起中断的原因不感兴趣,那么在中断处理程序处理完中断后,把被中断的线程恢复到中断前的状态;
  • 4.若对此感兴趣,则被中断的线程不再启动,被挂起.
  • 5.再之后,运行时系统开始新的调度 (可能包括刚刚被中断的线程).

2.3 进程间的通信(很重要单独出一篇博文)

2.4 调度

2.4.1 调度简介

调度时机

  • 在创建一个新进程时。需要决定是运行父进程还是子进程。由于父进程和子进程都处于就绪状态,所以调度程序可以根据实际情况决策调度哪个进程。
  • 在一个进程退出时。需要从就绪的进程中选择一个进程。
  • 在一个进程阻塞在I/O、信号量或其他原因导致阻塞时。需要选择一个就绪的进程。
  • 在一个I/O中断发生时。如果中断来自于I/O设备,而设备现在完成了工作,某些被阻塞的等待I/O的进程就成为了可运行的就绪的进程。当然是否让期运行取决于调度程序。

调度算法分类
不同的应用领域有不同的目标,也就需要不同的操作系统。所以,不同的操作系统,需要有不同的调度算法。常见的操作系统分为3类:

  • 批处理系统

    • 批处理系统是弱交互的。通常是在后台、批量的、集中式的完成一批任务。不会有用户在终端旁等待一个短请求的及时响应。所以,非抢占式算法适用于批处理系统。
  • 交互式系统

    • 在交互式用户环境中,为了避免一个进程长时间霸占CPU、避免一个程序因为错误而排斥其他进程,也为了能够及时响应用户的高优先级的交互,抢占是必须的。所以,抢占式算法适用于交互式系统。
      服务器也属于交互式系统,因为他们要经常服务于多个突发的(远程)用户。
  • 实时系统

    • 实时系统中,抢占有时是不需要的。因为进程了解他们可能长时间得不到运行,所以会很快的完成个字的工作并阻塞。

**
吉林大学 现代操作系统 期末复习 第二章 进程与线程(最重要的一章)_第11张图片

2.4.2批处理系统中的调度

先来先服务
先来先服务调度算法(FCFS)

∙ 先来先服务(First-Come-First-served)调度算法是最简单的非抢占的调度算法。

∙ 它通过管理一个FIFO就绪队列来实现,从前到后按顺序将CPU分配给进程。

FCFS调度算法对短进程不利,尤其当一个短进程跟在长进程后面时,它需要等待很长的时间。有时候会导致CPU和设备的利用率很低,在实际情况中,FCFS算法通常与其他算法结合使用。

最短作业优先

∙ 最短作业优先(Shortest-Job First)调度算法克服了FCFS的对短进程不利的缺点,它在就绪队列中选择处理时间最短的进程,如果时间相同则可以按照FCFS准则来处理。

∙ 它提高了系统的吞吐量,但是反过来又对长进程不利。

最短剩余时间优先

最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)是每当有进程加入就绪队列发生改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列,此外,当一个进程完成时也需要重新调度。

交互式系统中的调度(仅介绍部分算法)

轮转调度
时间片轮转(RR, Round-Robin)

  • 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。
  • 算法规则:按照各个进程到达就绪队列的顺序,轮流让各个进程执行一个时间片,若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
  • 方法用于作业/进程调度:只能用于进程调度,只有作业放入内存建立了相应的进程后,才能被分配处理机时间片。
  • 进程调度的方式:抢占式算法,由时钟装置发出时钟中断来通知 CPU 时间片已到。

** 优先级调度**

  • 算法思想:随着计算机的发展,特别是实时操作系统系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序。
  • 算法规则:每个作业或进程有各自的优先级,调度时选择优先级最高的作业或进程。
    方法用于作业/进程调度:可用于作业调度,也可用于进程调度,还会用于I/O调度。
  • 进程调度的方式:抢占式和非抢占式都有,区别在于非抢占式只需要在进程主动放弃处理机时进行调度,而抢占式的还需要在就绪队列变化时检查是否会发生抢占。

多级队列

  • FCFS 算法的优点是公平;SJF 算法的优点是能尽快处理完短作业,平均等待时间、平均周转时间等参数优秀;时间片轮转调度算法可以让各个进程得到及时的响应;优先级调度算法可以灵活地调整各种进程被服务的机会。为了综合以上各算法的优点,多级反馈队列应运而生。
  • 算法思想:对其他调度算法的折中权衡。
  • 算法规则:设置多级就绪队列,各级队列优先级从高到低,时间片从小到大;新进程到达时先进入第一级队列,按 FCFS 原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾,如果此时已经是在最下级的队列,则重新放回该队列队尾;只有第 k 级队列为空时,才会为 k+1 级队列头的进程分配时间片;被抢占处理机的进程重新放回原队列队尾。
  • 方法用于作业/进程调度:只用于进程调度。
  • 进程调度的方式:抢占式算法,在 k 级队列的进程运行过程中,若更上级的队列中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回 k 级队列队尾。

最短进程优先

保证调度

彩票调度

公平分享调度

实时系统中的调度

实时系统是一种时间起着主导作用的系统。他们的特点是:要求系统在恰当的时间内做出响应。对时间都都敏感的,正确的但是迟到的应答往往比没有响应更糟糕。比如,医院特别护理部门的病人监护装置、飞机中的自动驾驶系统、自动化工厂中的机器人控制系统等。
实时系统调度算法分为静态和动态。静态调度算法在系统开始运行之前做出决策。动态调度算法在运行过程中进行调度决策。静态调度算法要求事先掌握所完成的工作和必须满足的截止时间等所有必要信息时,才能工作,动态调度算法没有这个要求。

2.4.5策略和机制

采用调度机制和调度策略分离的原则。将调度算法以某种形式参数化,参数可以由用户进程填写。

2.4.6线程调度

线程分为用户级线程和内核级线程。
用户级线程场景下,当进程获得CPU的时间片时,由进程内的线程调度程序决定把时间片分给哪个线程。直到该进程被挂起。用户级场景下,运行时系统使用的调度算法通常是轮转调度和优先级调度。唯一的缺陷是缺乏一个时钟中断运行过长的线程,但由于用户级线程之间是合作关系,这种影响通常也不是问题。
内核级线程的场景下,内核选择一个线程,内核级线程是脱离用户级的,内核不会考虑这个线程属于哪个进程。当然如果有必要,内核也做得到。内核对被选中的线程赋予一个时间片,超过时间片则线程被挂起。
用户级线程和内核级线程的差别在于性能。用户级线程的切换只需要少量的机器指令。而内核级线程需要完整的上下文切换,修改内存映射,使高速缓存失效,这导致了若干数量及的延迟。这也就是说,从进程A的一个线程A1切换到进程B的一个线程B1,其代价高于切换到进程A的线程A2。
用户级线程可以使用专为应用程序定制的线程调度程序,这能比内核更好的满足应用程序的需要。

你可能感兴趣的:(操作系统,吉林大学,网络)